【问题标题】:Keras - Plot training, validation and test set accuracyKeras - 绘制训练、验证和测试集准确性
【发布时间】:2017-06-13 23:39:01
【问题描述】:

我想绘制这个简单神经网络的输出:

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(x_test, y_test, nb_epoch=10, validation_split=0.2, shuffle=True)

model.test_on_batch(x_test, y_test)
model.metrics_names

我绘制了训练和验证的准确度损失

print(history.history.keys())
#  "Accuracy"
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.show()
# "Loss"
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.show()

现在我想从model.test_on_batch(x_test, y_test) 添加和绘制测试集的准确度,但从model.metrics_names 我获得了用于在训练数据plt.plot(history.history['acc']) 上绘制准确度的相同值'acc'。如何绘制测试集的准确性?

【问题讨论】:

    标签: keras


    【解决方案1】:

    这是相同的,因为您是在测试集上训练,而不是在训练集上。不要那样做,只在训练集上训练:

    history = model.fit(x_test, y_test, nb_epoch=10, validation_split=0.2, shuffle=True)
    

    改成:

    history = model.fit(x_train, y_train, nb_epoch=10, validation_split=0.2, shuffle=True)
    

    【讨论】:

    • 对不起,我一直使用训练集来训练神经网络,这是一个疏忽。我是机器学习的新手,我对model.fit( ... ) 的结果有点困惑,我得到 lossaccval__lossval__acc,我认为这些值代表了训练和验证的损失和准确性,但是我在哪里可以找到关于测试的损失值?
    • @Simone 您可以在测试集上使用 model.evaluate 来获取测试集的损失和指标。只要确保使用正确的变量即可。
    • 我使用了 model.evaluete,得到了 accuracyloss,但我无法绘制它们因为我无法区分在训练中获得的 accuracy 和在测试中获得的 accuracy
    • @Simone 无法区分是什么意思?
    • 我应该有训练准确度、验证准确度和测试准确度;但我只得到两个值:val__accacc,分别用于验证和训练。从model.evaluate(x_test, y_test)model.metrics_names 我得到acc,和训练一样。我做错了什么?
    【解决方案2】:

    如下图在测试数据上验证模型,然后绘制准确率和损失

    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    history = model.fit(X_train, y_train, nb_epoch=10, validation_data=(X_test, y_test), shuffle=True)
    

    【讨论】:

      【解决方案3】:
      import keras
      from matplotlib import pyplot as plt
      history = model1.fit(train_x, train_y,validation_split = 0.1, epochs=50, batch_size=4)
      plt.plot(history.history['acc'])
      plt.plot(history.history['val_acc'])
      plt.title('model accuracy')
      plt.ylabel('accuracy')
      plt.xlabel('epoch')
      plt.legend(['train', 'val'], loc='upper left')
      plt.show()
      

      plt.plot(history.history['loss'])
      plt.plot(history.history['val_loss'])
      plt.title('model loss')
      plt.ylabel('loss')
      plt.xlabel('epoch')
      plt.legend(['train', 'val'], loc='upper left')
      plt.show()
      

      【讨论】:

      • 只是一个小补充:在更新的 Keras 和 Tensorflow 2.0 中,关键字 acc 和 val_acc 已相应更改为 accuracy 和 val_accuracy。所以,plt.plot(history.history['acc']) plt.plot(history.history['val_acc']) 应该改为plt.plot(history.history['accuracy']) plt.plot(history.history['val_accuracy'])(注意我使用的是 Keras 版本 2.2.4)
      • 我意识到这一点并回到这里发表相同的评论,我看到你已经这样做了。真是太棒了!
      • @EMT 使用 'accuracy' 或 'acc' 不依赖于 Tensorflow 版本。这取决于你自己的命名。 tf.version.VERSION 给了我'2.4.1'。我使用“准确性”作为关键,仍然得到KeyError: 'accuracy',但“acc”有效。如果您使用metrics=["acc"],则需要致电history.history['acc']。如果您在loss="categorical_crossentropy" 的情况下使用metrics=["categorical_accuracy"],则必须调用history.history['categorical_accuracy'],依此类推。有关所有选项,请参阅 history.history.keys()
      【解决方案4】:

      试试

      pd.DataFrame(history.history).plot(figsize=(8,5))
      plt.show()
      

      这将构建一个图表,其中包含历史的所有数据集的可用历史指标。示例:

      【讨论】:

        猜你喜欢
        • 2022-10-05
        • 2020-10-12
        • 2021-08-11
        • 2018-09-18
        • 2017-10-09
        • 1970-01-01
        • 2021-11-12
        • 2021-09-19
        • 2019-07-09
        相关资源
        最近更新 更多