【发布时间】:2021-10-06 23:41:43
【问题描述】:
我正在开发一种机器学习模型来检测骨骼图像中的骨骼。 我正在使用pytorch,我使用的模型是hourglass model。
当我使用 binary_cross_entropy_with_logits 时,我可以看到损失减少,但是当我尝试测试模型时,我注意到:
- 输出永远不会大于零。
- 输出不正确(未检测到骨骼)。
这就是我调用 binary_cross_entropy_with_logits 的方式
loss = F.binary_cross_entropy_with_logits(ouputs[i], Y, weight=Mask, reduction='sum') / Mask.sum()
这就是我正在做的测试
ouput = model(X)
ouput_sig = torch.sigmoid(ouput)
plot_voxel2d(ouput_soft1)
如果我像这样使用 mse 损失,完全相同的模型、输入、目标可以工作:
loss = torch.sum(((ouputs[i] - Y) ** 2) * Mask) / torch.sum(Mask)
我确保目标在 0 和 1 之间。 感谢您的帮助。
【问题讨论】:
-
是模型的输出是负数还是损失?
-
它自己的实际输出,我尝试使用权重初始化,我可以让输出在几次迭代中为正,但它会回到 -ve。
nn.init.normal_(m.weight, 0, 1) -
你的模型是什么,它是如何定义的?你在输出上应用 sigmoid 吗?我认为这与您的优化器和权重初始化无关。
-
我注意到,只要涉及 Sigmoid,我就不会收敛,所以如果我使用 MSELoss,它就可以工作。但是如果我使用带有 sigmoid 的 MSELoss 作为最后一层,它就不起作用。最后一层之前的层看起来像:Conv3d -> BatchNorm3d -> ReLU -> Dropout3d -> Conv3d
标签: pytorch loss-function