损失不减少 - Pytorch

Muh*_*hal 2 machine-learning conv-neural-network pytorch

我正在使用骰子损失来实现涉及超网络的全卷积网络(FCN)。该模型有两个输入和一个输出,即二进制分割图。模型正在更新权重,但损失是恒定的。它甚至没有过度拟合仅三个训练示例

我也使用了其他损失函数,如骰子+二元交叉熵损失、jacard 损失和 MSE 损失,但损失几乎是恒定的。我还尝试了几乎所有激活函数,例如 ReLU、LeakyReLU、Tanh。此外,我必须在输出处使用 sigmoid,因为我需要输出在 [0,1] 范围内,学习率为 0.01。此外,我还尝试了不同的学习率,例如 0.0001、0.001、0.1。无论训练开始时的损失是多少,它总是以这个值出现

这显示了三个训练示例的梯度。以及整体损失

tensor(0.0010, device='cuda:0')
tensor(0.1377, device='cuda:0')
tensor(0.1582, device='cuda:0')
Epoch 9, Overall loss = 0.9604763123724196, mIOU=0.019766070265581623
tensor(0.0014, device='cuda:0')
tensor(0.0898, device='cuda:0')
tensor(0.0455, device='cuda:0')
Epoch 10, Overall loss = 0.9616242945194244, mIOU=0.01919178702228237
tensor(0.0886, device='cuda:0')
tensor(0.2561, device='cuda:0')
tensor(0.0108, device='cuda:0')
Epoch 11, Overall loss = 0.960331304506822, mIOU=0.01983801422510155
Run Code Online (Sandbox Code Playgroud)

我预计损失会在几个时期内收敛。我应该怎么办?

Jat*_*aki 7

这实际上并不是堆栈溢出的问题。有一百万件事可能是错误的,通常不可能发布足够的代码来让我们查明问题,即使是这样,也没有人愿意花那么多时间去阅读。

话虽这么说,有一些通常对我有用的一般准则。

  1. 尝试减少问题。如果用单个卷积层替换网络,它会收敛吗?如果是,显然您的网络有问题
  2. 查看输入的数据以及标签(matplotlib 绘图等)。也许您的输入与输出不一致(裁剪问题等),或者您的数据增强太强了。
  3. 寻找,嗯……,错误。也许您torch.sigmoid(x)从网络返回,然后将其输入torch.nn.functional.binary_cross_entropy_with_logits(有效地应用sigmoid两次)。也许你的最后一层是ReLU,你的网络无法(通过构造)输出你期望的负值。

最后,我个人从未使用骰子作为主要损失函数进行过成功的训练,所以我肯定会尝试首先使用交叉熵,然后再转向骰子。