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

Dat*_*gla 5 python pattern-recognition classification machine-learning

我试图在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()
Run Code Online (Sandbox Code Playgroud)

use*_*323 39

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

  • 这样做除了给大家带来很多麻烦之外还有什么意义呢? (4认同)

use*_*433 19

history_dict = history.history
print(history_dict.keys())
Run Code Online (Sandbox Code Playgroud)

如果你打印 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']
Run Code Online (Sandbox Code Playgroud)

键和错误


pho*_*079 9

每个人都没有提到的要点是,这个关键错误model.compile(...). 你需要与你在里面命名你的准确度指标的方式保持一致model.compile(....,metrics=['<metric name>'])。您的历史回调对象将接收包含指标中定义的键值对的字典。

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

注意这是您可以在 Keras 中使用的指标链接


tha*_*vaf 8

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

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

有用!


小智 6

如果您将 keras 旧版本(例如 2.2.5)升级到与 Tensorflow 2.0 兼容的 2.3.0(或更新版本),您可能会遇到这样的错误(例如 KeyError: 'acc')。无论ACCval_acc已更名为准确性val_accuracy分别。在脚本中重命名它们将解决问题。


Eli*_*.Y. 5

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

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

model.fit(validation_data=(X_test, Y_test))
Run Code Online (Sandbox Code Playgroud)

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

model.fit(validation_split=0.5) 
Run Code Online (Sandbox Code Playgroud)