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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tf.keras model.fit():在相同数据上火车损失和val损失之间的巨大差异相关的知识,希望对你有一定的参考价值。

Tensorflow版本2.1

请参阅colab笔记本重现问题:https://colab.research.google.com/drive/1hSF-_eIGSX6SsfhvjSchV4TB7rryHNGy#scrollTo=reVyfZalb1Qq

当训练损失减少时,val_loss不会改变,尽管这是完全相同的数据。

训练2个样本,验证2个样本时代1/30 2/2 [==============================]-3s-2s /样本-损失:0.4630- val_loss:302.4763时代2/30 2/2 [==============================] -1s-457ms / sample-损耗:0.8565- val_loss:496.9578时代3/30 2/2 [==============================]-1s-457ms /样本-损失:0.7886- val_loss:1050.9148时代4/30 2/2 [==============================]-1秒-450毫秒/样本-损失:0.1080- val_loss:744.4895时代5/30 2/2 [==============================]-1s-474ms / sample-损失:0.1144- val_loss:1353.2678时代6/30 2/2 [==============================]-1秒-465毫秒/样本-损失:0.0402- val_loss:3237.9683时代7/30 2/2 [==============================]-1秒-465毫秒/样本-损失:0.0635- val_loss:3946.7822时代8/30 2/2 [==============================]-1秒-470毫秒/样本-损失:0.0355- val_loss:4054.5461时代9/30 2/2 [==============================]-1秒-462毫秒/样本-损失:0.0345- val_loss: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)。这可能是相关的,但我不直接看到如何做。要使此功能按预期工作,我需要更改什么?这是否在随附的包装https://github.com/qubvel/classification_models中或在哪里解决?

编辑:批量标准化的行为自TF 2.0起已更改,因此其他问题可能不相关,请参见https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization

答案

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

您需要在所有数据中使用preprocess_input,当然,初始范围应为0到255,因为它用于图像。

理想情况下,您应该使用实际的图像,因此您具有类似的分布。

以上是关于tf.keras model.fit():在相同数据上火车损失和val损失之间的巨大差异的主要内容,如果未能解决你的问题,请参考以下文章

使用 tf.keras.Model.fit 进行训练时如何将自定义摘要添加到 tensorboard

在 tf.keras 的 model.fit 中,有没有办法将每个样本分批传递 n 次?

Model.fit()是否将整个训练数据集上传到GPU?

model.predict 不适用于 Keras 自定义层(推理错误)

中止训练时如何获取 Keras 历史对象?

Keras中的TypeError:即使已经提供了shuffle =“batch”,也要传递shuffle =“batch”