Tensorflow model.evaluate 给出的结果与从训练中获得的结果不同

Posted

技术标签:

【中文标题】Tensorflow model.evaluate 给出的结果与从训练中获得的结果不同【英文标题】:Tensorflow model.evaluate gives different result from that obtained from training 【发布时间】:2021-01-10 22:23:29 【问题描述】:

我正在使用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() 我指定以下内容, 优化器 - 亚当, 损失 - SparseCategoricalCrossentropy, 指标 - 准确度

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

【问题讨论】:

【参考方案1】:

尝试将您的模型保存为 .h5 而不是 .tf - 这在 Keras 2.4.0 和 tensorflow 2.4.0 中对我有用

【讨论】:

您好,欢迎来到 SO!请阅读tour 和How do I write a good answer? 尝试包含更多详细信息。【参考方案2】:

为什么我会得到如此不同的结果?我在使用模型吗。评估 功能不正常?

我想是过度拟合导致了这个问题。您可以通过这种方式查看它们!


    提取模型历史

    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来避免这个问题!

【讨论】:

以上是关于Tensorflow model.evaluate 给出的结果与从训练中获得的结果不同的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow model.evaluate 给出的结果与从训练中获得的结果不同

model.evaluate() 和 model.predict() 的 F1 不同

Keras model.evaluate() 和 model.predict() 有啥区别?

Keras 中的 model.evaluate() 返回啥值?

Keras model.evaluate_generator结果几乎是真实准确度的两倍?

Keras:训练和验证集上的 model.evaluate() 与上次训练时期后的 acc 和 val_acc 不同