Python B二值像素级分割算法

Python B二值像素级分割算法,python,deep-learning,pytorch,Python,Deep Learning,Pytorch,我正在使用Sigmoid和BCELoss实现一个用于二进制分割的UNet。问题是,经过多次迭代后,网络试图预测每像素非常小的值,而对于某些区域,它应该预测接近1的值(对于地面真值遮罩区域)。它对错误的行为有什么直觉吗 此外,存在用于像素级损耗的NLLLoss2d。目前,我只是忽略了这一点,直接使用MSELoss()。我应该使用带有Sigmoid激活层的NLLLOS2D吗 谢谢在我看来,你的乙状结肠正在使激活图饱和。图像未正确归一化,或者缺少一些批量归一化层。如果您有一个正在处理其他图像的实现,请

我正在使用Sigmoid和BCELoss实现一个用于二进制分割的UNet。问题是,经过多次迭代后,网络试图预测每像素非常小的值,而对于某些区域,它应该预测接近1的值(对于地面真值遮罩区域)。它对错误的行为有什么直觉吗

此外,存在用于像素级损耗的NLLLoss2d。目前,我只是忽略了这一点,直接使用MSELoss()。我应该使用带有Sigmoid激活层的NLLLOS2D吗


谢谢

在我看来,你的乙状结肠正在使激活图饱和。图像未正确归一化,或者缺少一些批量归一化层。如果您有一个正在处理其他图像的实现,请检查图像加载程序,确保它不会使像素值饱和。这通常发生在16位通道上。你能分享一些输入图像吗


PS很抱歉在回答中评论。这是一个新帐户,我还不允许发表评论。

在我看来,你的乙状结肠正在使激活图饱和。图像未正确归一化,或者缺少一些批量归一化层。如果您有一个正在处理其他图像的实现,请检查图像加载程序,确保它不会使像素值饱和。这通常发生在16位通道上。你能分享一些输入图像吗


PS很抱歉在回答中评论。这是一个新帐户,我还不允许发表评论。

您可能希望使用
torch.nn.BCEWithLogitsLoss()
,替换Sigmoid和BCELoss函数

中的一个摘录告诉您为什么使用此损失函数实现总是更好

这种损失将乙状结肠层和BCELoss合并在一个类中。该版本的数值稳定性比使用简单的Sigmoid和BCELoss更高,因为通过将操作组合到一个层中,我们利用log sum exp技巧实现数值稳定性


您可能希望使用
torch.nn.BCEWithLogitsLoss()
,替换Sigmoid和BCELoss函数

中的一个摘录告诉您为什么使用此损失函数实现总是更好

这种损失将乙状结肠层和BCELoss合并在一个类中。该版本的数值稳定性比使用简单的Sigmoid和BCELoss更高,因为通过将操作组合到一个层中,我们利用log sum exp技巧实现数值稳定性


谢谢你的回复。嗯,我在我的网络中使用了batchNormalization after,所有层都使用RELU,除了最后一层是Sigmoid。你所说的“饱和像素值”到底是什么意思。在这种情况下,检查输出激活图对于Sigmoid是否过高或过低。有效范围在±sqrt(3)之间。2.关于:“饱和像素值”,pytorch中的PIL加载程序将16位图像的所有像素设置为1。我建议编写一个小函数来打印像素值,并将其用作lambda变换。在此函数中,您将在第一个参数中获得加载的图像,以检查是否加载了正确的值。3.你的标准化参数是什么?谢谢你的回复。嗯,我在我的网络中使用了batchNormalization after,所有层都使用RELU,除了最后一层是Sigmoid。你所说的“饱和像素值”到底是什么意思。在这种情况下,检查输出激活图对于Sigmoid是否过高或过低。有效范围在±sqrt(3)之间。2.关于:“饱和像素值”,pytorch中的PIL加载程序将16位图像的所有像素设置为1。我建议编写一个小函数来打印像素值,并将其用作lambda变换。在此函数中,您将在第一个参数中获得加载的图像,以检查是否加载了正确的值。3.你的标准化参数是什么?