【发布时间】:2020-03-11 11:49:47
【问题描述】:
我正在使用 tensorflow2.0 和 tensorflow_datasets 进行培训。但我不明白:为什么训练准确率和损失与验证准确率和损失不同?
这是我的代码:
import tensorflow as tf
import tensorflow_datasets as tfds
data_name = 'uc_merced'
dataset = tfds.load(data_name)
# the train_data and the test_data are same dataset
train_data, test_data = dataset['train'], dataset['train']
def parse(img_dict):
img = tf.image.resize_with_pad(img_dict['image'], 256, 256)
#img = img / 255.
label = img_dict['label']
return img, label
train_data = train_data.map(parse)
train_data = train_data.batch(96)
test_data = test_data.map(parse)
test_data = test_data.batch(96)
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
model = tf.keras.applications.ResNet50(weights=None, classes=21,
input_shape=(256, 256, 3))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_data, epochs=50, verbose=2, validation_data=test_data)
它非常简单,您可以在您的计算机上运行它。你可以看到我的训练数据和验证数据是一样的train_data, test_data = dataset['train'], dataset['train']。
但训练准确度(损失)与验证准确度(损失)不同。为什么会这样?这是tensorflow2.0的bug吗?
Epoch 1/50
22/22 - 51s - loss: 3.3766 - accuracy: 0.2581 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 2/50
22/22 - 30s - loss: 1.8221 - accuracy: 0.4590 - val_loss: 123071.9851 - val_accuracy: 0.0476
Epoch 3/50
22/22 - 30s - loss: 1.4701 - accuracy: 0.5405 - val_loss: 12767.8928 - val_accuracy: 0.0519
Epoch 4/50
22/22 - 30s - loss: 1.2113 - accuracy: 0.6071 - val_loss: 3.9311 - val_accuracy: 0.1186
Epoch 5/50
22/22 - 31s - loss: 1.0846 - accuracy: 0.6567 - val_loss: 23.7775 - val_accuracy: 0.1386
Epoch 6/50
22/22 - 31s - loss: 0.9358 - accuracy: 0.7043 - val_loss: 15.3453 - val_accuracy: 0.1543
Epoch 7/50
22/22 - 32s - loss: 0.8566 - accuracy: 0.7243 - val_loss: 8.0415 - val_accuracy: 0.2548
【问题讨论】:
-
训练和验证拆分使用相同的数据是什么意思?如果要查看您的训练模型(使用训练拆分)如何在每个 epoch 之后推广到看不见的数据(验证拆分),则进行验证拆分的想法。例如,您可以使用它来防止过度拟合。训练和验证拆分都使用相同的数据是不是毫无意义?
-
我知道。我用它来调试。在非常乞讨时,我使用不同的数据进行训练和验证。但我发现验证率非常高。我不知道数据集或模型是否有同样的错误?所以使用相同的数据进行训练和验证,发现了这个问题。
-
因此,如果我理解正确,您尝试使用不同的数据进行训练和验证。通过使用它,您发现验证准确度非常高(在训练期间)。然后您认为这是您的设置有问题,并希望通过使用相同的数据进行训练和验证来进行调试。您希望在每个 epoch 都获得相同的训练和验证准确度。如果你明白了,那么你会得出结论,你的设置没有问题,对吗?我不确定这是一种有意义的调试方式。
-
看看stackoverflow.com/a/45277243/2616185。根据 Keras 文档中的 FAQ,Keras 模型有两种模式:训练和测试。两种模式中的行为不同。如果我在这里的假设认为“测试模式”可以对应于您培训的验证部分,那么您就找到了答案。如果我的假设成立,我对此不是 100% 确定的。也许其他人可以证实这一点。
-
如果:1 - 你忘记了镜像策略(我不知道这是什么,但它是不必要的,也许它有一些奇怪的效果 - 错误)/// 2 - 你加载数据集两次,所以训练和测试是独立的数据集?也许尝试为不同的功能迭代两次相同的数据集可能会导致问题? /// 3 - 检查模型的每个
BatchNormalization层是否有training = True。
标签: tensorflow keras tensorflow-datasets tensorflow2.0 tf.keras