【问题标题】:Plotting learning curve in keras gives KeyError: 'val_acc'在 keras 中绘制学习曲线给出 KeyError: 'val_acc'
【发布时间】:2017-02-14 10:49:56
【问题描述】:

我试图在 keras 中绘制训练和测试学习曲线,但是,以下代码会生成 KeyError: 'val_acc error

官方文档<https://keras.io/callbacks/> 指出,为了使用'val_acc',我需要启用验证和准确性监控,我不明白,也不知道如何在我的代码中使用。

任何帮助将不胜感激。 谢谢。

seed = 7
np.random.seed(seed)

dataframe = pandas.read_csv("iris.csv", header=None)
dataset = dataframe.values
X = dataset[:,0:4].astype(float)
Y = dataset[:,4]

encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
dummy_y = np_utils.to_categorical(encoded_Y)

kfold = StratifiedKFold(y=Y, n_folds=10, shuffle=True, random_state=seed)
cvscores = []

for i, (train, test) in enumerate(kfold):

    model = Sequential()
    model.add(Dense(12, input_dim=4, init='uniform', activation='relu'))
    model.add(Dense(3, init='uniform', activation='sigmoid'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    history=model.fit(X[train], dummy_y[train], nb_epoch=200, batch_size=5, verbose=0)
    scores = model.evaluate(X[test], dummy_y[test], verbose=0)
    print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
    cvscores.append(scores[1] * 100)

print( "%.2f%% (+/- %.2f%%)" % (np.mean(cvscores), np.std(cvscores))) 


print(history.history.keys())
# summarize history for 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', 'test'], loc='upper left')
plt.show()

【问题讨论】:

    标签: python machine-learning classification pattern-recognition


    【解决方案1】:

    我已将 acc 更改为准确度,我的问题已解决。 TensorFlow 2+

    例如

    accuracy = history_dict['accuracy']
    val_accuracy = history_dict['val_acccuracy']
    

    【讨论】:

      【解决方案2】:

      如果您将 keras 旧版本(例如 2.2.5)升级到与 Tensorflow 2.0 兼容的 2.3.0(或更高版本),您可能会遇到此类错误(例如 KeyError: 'acc') . accval_acc 已分别重命名为 accuracyval_accuracy。在脚本中重命名它们将解决问题。

      【讨论】:

        【解决方案3】:

        看起来在 Keras + Tensorflow 2.0 中 val_acc 被重命名为 val_accuracy

        【讨论】:

        • 这样做除了给大家添麻烦还有什么意义?
        【解决方案4】:

        当您指定 validation_data=(X_test, Y_test) 并且您的 X_test 和/或 Y_test 为空时,也会发生此错误。要检查这一点,请分别打印 X_testY_test 的形状。在这种情况下,model.fit(validation_data=(X_test, Y_test), ...) 方法运行,但由于验证集为空,它没有在history.history 字典中为val_loss 创建字典键。

        【讨论】:

          【解决方案5】:

          大家漏掉的重点是这个Key Errormodel.compile(...)期间的metrics命名有关。您需要与在model.compile(....,metrics=['<metric name>']) 中命名准确度指标的方式保持一致。您的历史回调对象将接收包含指标中定义的键值对的字典。

          所以,如果您的指标是metrics=['acc'],您可以使用history.history['acc'] 在历史对象中访问它们,但如果您将指标定义为metrics=['accuracy'],则需要更改为history.history['accuracy'] 才能访问该值,以便避免按键错误。我希望它有所帮助。

          注意这是您可以在 Keras 中使用的 link to the metrics

          【讨论】:

          • 优秀的答案。就我而言,我有多个 keras.metrics.Precision() 类,但无法弄清楚为什么我会得到 val_precision_1val_precision_2 等等......这条评论解决了它。我必须为每个类 keras.metrics.Percision(name='precision') 赋予相同的名称,才能指望该键存在于历史对象中。
          【解决方案6】:
          history_dict = history.history
          print(history_dict.keys())
          

          如果你打印 history_dict 的键,你会得到这样的dict_keys(['loss', 'acc', 'val_loss', 'val_acc'])

          并像这样编辑代码

          acc = history_dict['acc']
          val_acc = history_dict['val_acc']
          loss = history_dict['loss']
          val_loss = history_dict['val_loss']
          

          Keys and error

          【讨论】:

          • 请添加官方文档的链接以供参考。虽然这没关系,但仍然。
          • 我正面临这个prblm,我发现了这个。很简单,找到一种“history_dict”。那将是一个字典,这意味着字典有键和值。所以尝试打印键和值。如果你打印 "print(history_dict.keys())" 你会得到 dict_keys(['loss', 'acc', 'val_loss', 'val_acc']) 这个输出。所以历史对象包含字典。在那个字典中,我们有 ['loss', 'acc', 'val_loss', 'val_acc'] 键。对于这些键,我们有值。因此我们可以使用键绘制图形(在 dict 中我们只能通过键使用值)。
          【解决方案7】:

          要获取任何 val_* 数据(val_accval_loss、...),您需要先设置验证。

          第一种方法(将根据您提供的内容进行验证):

          model.fit(validation_data=(X_test, Y_test))
          

          第二种方法(将根据部分训练数据进行验证):

          model.fit(validation_split=0.5) 
          

          【讨论】:

            【解决方案8】:

            您可能需要启用训练集的验证拆分。通常,验证发生在训练集的 1/3 中。在您的代码中,进行如下更改:

            history=model.fit(X[train], dummy_y[train],validation_split=0.33,nb_epoch=200, batch_size=5, verbose=0) 
            

            有效!

            【讨论】:

              猜你喜欢
              • 2020-08-30
              • 2016-10-06
              • 2012-05-28
              • 2016-11-29
              • 1970-01-01
              • 2019-11-27
              • 2020-09-09
              • 1970-01-01
              • 2019-03-14
              相关资源
              最近更新 更多