tensorflow - 为什么同一数据集上的准确率和验证准确率有很大不同(没有标准化或丢失)?
问题描述
我是 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 层时通常会出现此类问题,而这里并非如此。
解决方案
根据以上信息,我可能会假设您的数据对时间序列中彼此更接近的示例具有很强的依赖性。
因此,NN 数据流很可能是这样的:
- NN 取第一批,计算损失,并更新权重和偏差
- 循环不断重复
- 但是由于批次中的示例在时间序列中彼此相距不远,因此 NN 更容易相应地更新权重,从而使得下一批的损失相当低
当需要验证时,NN 只计算损失而不更新权重,因此您最终得到的 NN 学会了如何推断一小部分数据,但不能很好地概括整个数据集。
这就是即使在相同数据集上验证错误与训练不同的原因。
原因列表不限于此,这只是一个假设。
推荐阅读
- list - 如何过滤 csv 数据以在指定年份后删除数据?
- javascript - Css 和 Javascript 无法在 html 中加载
- python - 如果语句/条件参数在 Geany (PYTHON) 中不起作用
- python - tabula vs camelot 用于从 PDF 中提取表格
- java - GraphAPI 在创建新组后立即创建新的 MSTeam 失败并出现 404
- javascript - Chart.js 设置全局点大小不起作用
- oracle - Oracle:我可以避免很多 JOIN 吗?
- swift - 如何从可可应用程序运行终端命令?
- asp.net-core - 我应该如何在 asp.net core web api 中发送 401 和 403 响应代码?
- python - Python:根据条件查找数据框中每个事件所花费的时间