Pytorch模型训练损失没有改善.逻辑回归模型参数/权重是否没有更新?



我正在尝试使用以下模型对图像进行分类。训练损失似乎没有收敛/改善。你能检查代码,看看这是否可能是一个模型问题实现逻辑回归?

我得到的一系列10个训练时期的结果如下:

epoch: 1, loss= -16.0369
epoch: 2, loss= -23.3950
epoch: 3, loss= -23.4226
epoch: 4, loss= -18.7254
epoch: 5, loss= -29.8720
epoch: 6, loss= -29.2601
epoch: 7, loss= -21.3710
epoch: 8, loss= -28.2535
epoch: 9, loss= -33.8465
epoch: 10, loss= -27.8332

带优化器的模型代码:

class LogisticRegression(nn.Module):
def __init__(self):
super(LogisticRegression, self).__init__()
self.linear = [] 
self.linear.append(nn.Linear(in_features=28*28, out_features=1))
self.linear = nn.Sequential(*self.linear)
self.activation = nn.ReLU()

def forward(self, x):
y = self.activation(torch.sigmoid(self.linear(x)))
return y

损耗和优化器:

learn_rate = 0.01
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(params = LR_model.parameters(), lr=learn_rate)

数据加载器生成"图像";和";labels">训练循环段:

#forward 
y_predicted = LR_model(images)
total_loss = criterion(y_predicted, labels.unsqueeze(1))
#backward
total_loss.backward()
#update
optimizer.step()
optimizer.zero_grad()
# Print epoch result
print(f'epoch: {epoch+1}, loss= {total_loss.item():.4f}')

除了sigmoid激活之外,您不应该使用ReLU激活。相反,直接将torch.sigmoid(self.linear(x))返回到nn.BCELoss

然而,为了数值稳定性,你应该使用nn.BCELossWithLogits:它结合了一个s形层和二进制交叉熵损失。在这种情况下,只输出logits,即。self.linear(x).

最新更新