首页 > 解决方案 > 为什么同一数据集上的准确率和验证准确率有很大不同(没有标准化或丢失)?

问题描述

我是 tensorflow 2.0 的新手,我正在运行一个非常简单的模型,它将固定大小(100 个值)的一维时间序列分类为两个类之一:

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(512, activation='relu', input_shape=(100, 1)),
    tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])

我有一个包含约 660,000 个标记示例的数据集,我使用 batch_size=256 将其输入模型。当我将 NN 训练 10 个 epoch 时,使用与验证数据集相同的数据

history = model.fit(training_dataset,
                epochs=10,
                verbose=1,
                validation_data=training_dataset)

我得到以下输出

Epoch 1/10
2573/2573 [==============================] - 55s 21ms/step - loss: 0.5271 - acc: 0.7433 - val_loss: 3.4160 - val_acc: 0.4282
Epoch 2/10
2573/2573 [==============================] - 55s 21ms/step - loss: 0.5673 - acc: 0.7318 - val_loss: 3.3634 - val_acc: 0.4282
Epoch 3/10
2573/2573 [==============================] - 55s 21ms/step - loss: 0.5628 - acc: 0.7348 - val_loss: 2.6422 - val_acc: 0.4282
Epoch 4/10
2573/2573 [==============================] - 57s 22ms/step - loss: 0.5589 - acc: 0.7314 - val_loss: 2.6799 - val_acc: 0.4282
Epoch 5/10
2573/2573 [==============================] - 56s 22ms/step - loss: 0.5683 - acc: 0.7278 - val_loss: 2.3266 - val_acc: 0.4282
Epoch 6/10
2573/2573 [==============================] - 55s 21ms/step - loss: 0.5644 - acc: 0.7276 - val_loss: 2.3177 - val_acc: 0.4282
Epoch 7/10
2573/2573 [==============================] - 56s 22ms/step - loss: 0.5664 - acc: 0.7255 - val_loss: 2.3848 - val_acc: 0.4282
Epoch 8/10
2573/2573 [==============================] - 55s 21ms/step - loss: 0.5711 - acc: 0.7237 - val_loss: 2.2369 - val_acc: 0.4282
Epoch 9/10
2573/2573 [==============================] - 55s 22ms/step - loss: 0.5739 - acc: 0.7189 - val_loss: 2.6969 - val_acc: 0.4282
Epoch 10/10
2573/2573 [==============================] - 219s 85ms/step - loss: 0.5778 - acc: 0.7213 - val_loss: 2.5662 - val_acc: 0.4282

当在同一个数据集上运行时,训练期间的准确性为何与验证步骤如此不同?我试图找到一些解释,但似乎当人们使用 BatchNormalization 或 Dropout 层时通常会出现此类问题,而这里并非如此。

标签: tensorflowkerastensorflow2.0tf.keras

解决方案


根据以上信息,我可能会假设您的数据对时间序列中彼此更接近的示例具有很强的依赖性。
因此,NN 数据流很可能是这样的:

  • NN 取第一批,计算损失,并更新权重和偏差
  • 循环不断重复
  • 但是由于批次中的示例在时间序列中彼此相距不远,因此 NN 更容易相应地更新权重,从而使得下一批的损失相当低

当需要验证时,NN 只计算损失而不更新权重,因此您最终得到的 NN 学会了如何推断一小部分数据,但不能很好地概括整个数据集。

这就是即使在相同数据集上验证错误与训练不同的原因。

原因列表不限于此,这只是一个假设。


推荐阅读