【问题标题】:Why the accuracy and validation_accuracy are drastically different on the same dataset (no normalization or dropout)?为什么同一数据集上的准确度和验证准确度有很大不同(没有标准化或丢失)?
【发布时间】:2020-11-06 04:49:08
【问题描述】:

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

【问题讨论】:

  • 在您的情况下,精度较低表明模型无法按预期对时间序列进行分类。考虑使用 RNN 模型进行时间序列分类。请参阅this 文档。此外,我们也可以使用一维卷积。
  • 感谢您的建议。我使用密集层的唯一原因是提供一个最小的示例。
  • 在训练 NN 之前尝试对数据进行洗牌。如果这会使 acc 和 val_acc 更接近,我会解释原因,所以暂时不要假设匹配。
  • 我将洗牌缓冲区从 100,000 增加到 660,000(所以这是真正的洗牌),现在准确度与验证准确度相匹配。谢谢!

标签: tensorflow keras tensorflow2.0 tf.keras


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 2022-01-15
    • 2020-03-11
    • 2020-10-16
    • 2020-12-01
    • 2021-03-04
    • 2020-11-02
    • 1970-01-01
    相关资源
    最近更新 更多