首页 > 解决方案 > pytorch:model.forward() 会影响训练过程,即使结果不是损失函数的一部分

问题描述

我有以下代码来训练一个简单的模型:

train_loader, another_loader = get_loaders()
model = torch_utils.get_model()

ce = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
another_loader_iter = iter(another_loader)

for epoch in range(10):
    for i, (X, y) in enumerate(train_loader):
        model.train()
        X, y = X.to(device), y.to(device)
        pred = model.forward(X)
        loss1 = ce(pred, y)
        for j in range(2):
            X2, y2 = next(another_loader)
            pred2 = model.forward(X2) #**This line effects the training process - why???**

        new_loss = loss1
        optimizer.zero_grad()
        new_loss.backward()
        optimizer.step()

当我注释掉 pred2 = model.forward(X2) 时,模型会按应有的方式进行训练,但我想使用 pred2 向损失函数添加新表达式。

标签: deep-learningpytorch

解决方案


我建议进行以下更改:

for epoch in range(10):
    for i, (X, y) in enumerate(train_loader):
        model.train()
        X, y = X.to(device), y.to(device)
        pred = model(X)
        loss1 = ce(pred, y)
        for j in range(2):
            model.eval()
            X2, y2 = next(another_loader)
            pred2 = model(X2)

        new_loss = loss1
        optimizer.zero_grad()
        new_loss.backward()
        optimizer.step()

我还要说您不需要new_loss = loss1,但认为您在原始代码中包含更多内容,对吗?

无论如何,请检查这些更改是否对您有帮助。


推荐阅读