列车和验证模式tensorflow的相同数据丢失不一致

列车和验证模式tensorflow的相同数据丢失不一致,tensorflow,keras,deep-learning,pytorch,semantic-segmentation,Tensorflow,Keras,Deep Learning,Pytorch,Semantic Segmentation,我正在用图像实现一个语义分割模型。作为一个很好的实践,我仅用一张图片测试了我的训练管道,并试图过度拟合该图片。令我惊讶的是,当使用完全相同的图像进行训练时,损失会像预期的一样接近0,但当评估相同的图像时,损失会高得多,并且随着训练的继续,损失会不断增加。因此,当training=False运行时,分段输出是垃圾,但当使用training=True运行时,分段输出是完美的 为了让任何人都能复制这张照片,我拿了官方的照片,对它做了一些修改,以便从头开始训练一个convnet,只需要一张图片。该模型非

我正在用图像实现一个语义分割模型。作为一个很好的实践,我仅用一张图片测试了我的训练管道,并试图过度拟合该图片。令我惊讶的是,当使用完全相同的图像进行训练时,损失会像预期的一样接近0,但当评估相同的图像时,损失会高得多,并且随着训练的继续,损失会不断增加。因此,当
training=False
运行时,分段输出是垃圾,但当使用
training=True
运行时,分段输出是完美的

为了让任何人都能复制这张照片,我拿了官方的照片,对它做了一些修改,以便从头开始训练一个convnet,只需要一张图片。该模型非常简单,只是一个Conv2D序列,带有批量规范化和Relu。结果如下

正如您所看到的,损失和评估损失是完全不同的,在训练模式下对图像进行推断会得到完美的结果,而在评估模式下则是垃圾

我知道Batchnormalization在推理时间上的行为不同,因为它使用在训练时计算的平均统计数据。尽管如此,由于我们只是用一张相同的图片进行训练,并在同一张图片中进行评估,这不应该发生,对吗?此外,我在Pytorch中使用相同的优化器实现了相同的体系结构,而这在那里不会发生。有了pytorch,it培训和评估损失收敛到培训损失

在这里你可以找到上面提到的
最后,Pytorch实现还必须对tensorflow使用的默认值做更多的处理。Batchnormalization有一个参数
momentum
,用于控制批次统计数据的平均值。公式为:
moving\u mean=moving\u mean*动量+平均值(批次)*(1-动量)

如果在BatchNorm层中设置
momentum=0.0
,则平均统计数据应与当前批次(仅为一张图像)的统计数据完全匹配。如果这样做,您会发现验证损失几乎立即与培训损失相匹配。另外,如果您尝试使用
momentum=0.9
(这是pytorch中的等效默认值),并且它可以更快地工作和收敛(如pytorch中)