训练 Pytorch 神经网络时损失曲线出现响铃

问题描述 投票:0回答:1

为什么我的 pytorch 神经网络训练快结束时会响起铃声

我正在使用带有 Adam 优化器和损失值为 0.0001 的基本顺序神经网络

这是模型:

class ANN(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(in_features=956, out_features=500)
        self.fc2 = nn.Linear(in_features=500, out_features=500)
        self.fc3 = nn.Linear(in_features=500, out_features=100)
        self.output = nn.Linear(in_features=100, out_features=2)
 
    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        x = self.output(x)
        return x

以及标准、损失和训练调用

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)

epochs = 400
loss_arr = []

for i in range(epochs):
    y_hat = model.forward(X_train)
    loss = criterion(y_hat, y_train)
    loss_arr.append(loss)
    
 
    if i % 10 == 0:
        print(f'Epoch: {i} Loss: {loss}')
 
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

我预计损失曲线会随着时间的推移正常下降,或者如果模型过度拟合,损失曲线会突然增加

我没有大量数据将其分解为验证集来监控过度拟合,因此我只是一次又一次地训练模型以防止过度拟合

pytorch neural-network classification loss
1个回答
0
投票

根据您发布的损失曲线,在我看来,问题可能是您在训练期间没有改变学习率。当训练接近最佳值时,找到正确方向的步骤变得更加困难。甚至有可能由于学习率较大,训练会在最佳值附近来回振荡;在这种情况下,损失将不再改善。尝试设置学习率调度程序,请参阅 PyTorch 文档中的如何调整学习率

此外,您还写道:

我预计损失曲线会随着时间的推移正常下降,或者如果模型过度拟合,损失曲线会突然增加

模型过拟合时,训练损失曲线不会突然增加。当训练损失非常小时,但验证损失突然增加时,就会发生过拟合。仅通过测量训练损失无法检测过度拟合。如果你没有足够的数据,你可以考虑交叉验证

© www.soinside.com 2019 - 2024. All rights reserved.