为什么同一数据集上的准确度和 validation_accuracy 截然不同(没有归一化或丢失)?

Why the accuracy and validation_accuracy are drastically different on the same dataset (no normalization or dropout)?

我是 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 个时期时,使用相同的数据作为验证数据集

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 层时通常会出现此类问题,而这里不是这种情况。

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

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

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

这就是为什么即使在同一数据集上验证错误也不同于训练。

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