在keras中绘制学习曲线给出KeyError:'val_acc'

时间:2016-10-05 18:31:54

标签: python machine-learning classification pattern-recognition

我试图在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()

8 个答案:

答案 0 :(得分:6)

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

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

有效!

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

每个人都想提及的要点是,此关键错误model.compile(...)期间的指标命名有关。您需要与在model.compile(....,metrics=['<metric name>'])中命名准确性指标的方式保持一致。您的历史记录回调对象将接收包含按指标定义的键值对的字典。

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

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

答案 4 :(得分:1)

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

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

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

第二种方法(将从一部分训练数据中验证):

model.fit(validation_split=0.5) 

答案 5 :(得分:1)

在Keras + Tensorflow 2.0中val_acc的外观已重命名为val_accuracy

答案 6 :(得分:1)

我已更改acc的准确性,而我的问题已解决。 Tensorflow 2 +

例如

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

答案 7 :(得分:0)

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