python - Tensorflow model.evaluate 给出与训练得到的结果不同的结果
问题描述
我正在使用 tensorflow 进行多类分类
我通过以下方式加载训练数据集和验证数据集
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="training",
shuffle=True,
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="validation",
shuffle=True,
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size)
然后当我使用 model.fit() 训练模型时
history = model.fit(
train_ds,
validation_data=val_ds,
epochs=epochs,
shuffle=True
)
我的验证准确率约为 95%。
但是当我加载相同的验证集并使用 model.evaluate()
model.evaluate(val_ds)
我的准确率非常低(大约 10%)。
为什么我得到如此不同的结果?我是否错误地使用了 model.evaluate 函数?
注意:在 model.compile() 我指定以下内容,Optimizer - Adam,Loss - SparseCategoricalCrossentropy,Metric - Accuracy
Model.evaluate() 输出
41/41 [==============================] - 5s 118ms/step - loss: 0.3037 - accuracy: 0.1032
Test Loss - 0.3036555051803589
Test Acc - 0.10315627604722977
最后三个时期的 Model.fit() 输出
Epoch 8/10
41/41 [==============================] - 3s 80ms/step - loss: 0.6094 - accuracy: 0.8861 - val_loss: 0.4489 - val_accuracy: 0.9483
Epoch 9/10
41/41 [==============================] - 3s 80ms/step - loss: 0.5377 - accuracy: 0.8953 - val_loss: 0.3868 - val_accuracy: 0.9554
Epoch 10/10
41/41 [==============================] - 3s 80ms/step - loss: 0.4663 - accuracy: 0.9092 - val_loss: 0.3404 - val_accuracy: 0.9590
解决方案
为什么我得到如此不同的结果?我是否错误地使用了 model.evaluate 函数?
我想是过度拟合导致了这个问题。您可以通过这种方式检查它们!
提取模型的历史
history_dict = history.history history_dict.keys()
可视化历史
import matplotlib.pyplot as plt acc=history_dict['accuracy'] val_acc=history_dict['val_accuracy'] loss=history_dict['loss'] val_loss=history_dict['val_loss'] epochs=range(1,len(acc)+1) plt.figure(figsize=(10,10)) ax1=plt.subplot(221) ax1.plot(epochs,loss,'bo',label='Training loss') ax1.plot(epochs,acc,'ro',label='Training acc') ax1.set_title('loss and acc of Training') ax1.set_xlabel('Epochs') ax1.set_ylabel('Loss') ax1.legend() ax2=plt.subplot(222) ax2.plot(epochs,val_acc,'r',label='Validation acc') ax2.plot(epochs,val_loss,'b',label='Validation loss') ax2.set_title('loss and acc of Training') ax2.set_xlabel('Epochs') ax2.set_ylabel('Acc') ax2.legend()
也许,你得到的结果是这样的:
- 在训练过程中,acc和loss随着epochs而变化
- 但在验证中,acc 和 loss 似乎在 20 个 epoch 后达到了峰值
解决方案
事实证明,当发生过拟合时,可以设置更少的 epoch 来避免这个问题!
推荐阅读
- java - 在 3D 世界中计算距相机的各个距离,Java
- javascript - 位置粘性底部不起作用,但顶部它可以
- python - 如何在数据帧上隔离具有异常值的时期
- algorithm - 在 O(1) 空间复杂度中反转队列
- mysql - 有没有办法通过“WITH”语句获得输出?
- php - preg_match 的 $matches 不返回任何匹配项
- angular - 为什么我的 routerLink 没有显示我的 CalendarComponent
- javascript - 如何将自定义道具传递给单个 SPA 子 React 应用程序?
- javascript - 反应表单验证
- session - TYPO3 / Extbase - 切换到另一个 fe_user - 最后回到原始用户