问题描述
我正在尝试使用以下模型对图像进行分类。训练损失似乎没有收敛/改善。你能检查一下代码,看看这是否可能是实现逻辑回归的模型问题?
我得到的一系列 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)
#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
:它结合了 sigmoid 层和二元交叉熵损失。在这种情况下,只输出 logits i.e. self.linear(x)
.