Tensorflow tf.keras model.fit():相同数据上的列车损失和val损失之间的巨大差异

Tensorflow tf.keras model.fit():相同数据上的列车损失和val损失之间的巨大差异,tensorflow,keras,tensorflow2.0,Tensorflow,Keras,Tensorflow2.0,Tensorflow版本2.1 请参阅colab笔记本以再现问题: 当训练损失下降时,val_损失不会改变,尽管这是完全相同的数据 培训2个样本,验证2个样本 历元1/30 2/2[===============================================================================================================================================================

Tensorflow版本2.1

请参阅colab笔记本以再现问题:

当训练损失下降时,val_损失不会改变,尽管这是完全相同的数据

培训2个样本,验证2个样本
历元1/30 2/2[========================================================================================================================================================================================================================================================================================================================================== 纪元2/30 2/2[=================================================================================================================================================================================================================================================================================================================================================== 纪元3/30 2/2[====================================================================================================================================-1s-457ms/样本-损耗:0.7886-损耗:1050.9148
历元4/30 2/2[================================================================================================================================================================================================================================================================================================================================================ 纪元5/30 2/2[==========================================================================================================================================-1s-474ms/样本-损耗:0.1144-损耗:1353.2678
纪元6/30 2/2[=================================================================================================================================================================================================================================================================================================================================================== Epoch 7/30 2/2[=====================================================================================================================-1s-465ms/样本-损耗:0.0635-损耗:3946.7822
纪元8/30 2/2[================================================================================================================================================================================================================================================================================================================================================ 纪元9/30 2/2[===============================================================================================================================================================================================================1s-462ms/样本-损耗:0.0345-损耗:4991.5400

这怎么可能? 代码非常简单:

ResNet18, preprocess_input = Classifiers.get('resnet18')
base_model = ResNet18(input_shape=(180, 320, 3), weights=None, include_top=False)
x = tf.keras.layers.GlobalAveragePooling2D()(base_model.output)
output = tf.keras.layers.Dense(8)(x)
model = tf.keras.models.Model(inputs=base_model.input, outputs=output)
model.compile(optimizer='adam', loss='mse')
data = np.random.rand(2, 180, 320, 3)
labels = np.random.rand(2, 8)

model.fit(data, labels, validation_data=(data,labels), batch_size=2, epochs=30)
keras和批处理规范化存在已知问题(例如,请参见keras team/keras#6977)。这可能是有关联的,但我不知道怎么回事。我需要做哪些更改才能使其按预期工作?这是包含在包中的内容还是在哪里解决


编辑:从TF 2.0开始,批标准化的行为发生了更改,因此其他问题可能与此无关,请参见

您没有将数据预处理到模型预期的范围。 此模型包含
BatchNormalization
,因此不能使用不在正确范围内的数据

您需要在所有数据中使用
preprocess\u input
,当然,您的初始范围应该是0到255,因为它用于图像


理想情况下,您应该使用实际图像,这样您就有了类似的分布

我不确定这是否就是代码中的“错误”,但通常情况下,模型的行为会在培训和评估模式之间发生变化。这会影响,例如。这至少可以部分解释你的结果的差异

我理解你的意思,但是添加data=preprocess\u输入(data)并不能解决这个问题。预处理_输入定义为def预处理_输入(x,**kwargs):返回x,因此它不执行此操作anything@Derk,是否
x
在0和255之间??你的代码看起来是0和1,我可以使用data=np.random.randint(255,size=(2180320,3)),但这并不能改变问题