Plotting learning curve in keras gives KeyError: 'val_acc'
Plotting learning curve in keras gives KeyError: 'val_acc'
我试图在 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()
您可能需要启用训练集的验证拆分。通常,验证发生在训练集的 1/3 中。在您的代码中,进行如下更改:
history=model.fit(X[train], dummy_y[train],validation_split=0.33,nb_epoch=200, batch_size=5, verbose=0)
有效!
要获取任何 val_* 数据(val_acc
、val_loss
、...),您需要先设置验证。
第一种方法(将根据您提供的内容进行验证):
model.fit(validation_data=(X_test, Y_test))
第二种方法(将从部分训练数据中验证):
model.fit(validation_split=0.5)
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
大家漏提的重点是这个Key Error与model.compile(...)
期间的metrics命名有关。您需要与在 model.compile(....,metrics=['<metric name>'])
中命名准确度指标的方式保持一致。您的历史回调对象将接收包含指标中定义的键值对的字典。
因此,如果您的指标是 metrics=['acc']
,您可以使用 history.history['acc']
在历史对象中访问它们,但如果您将指标定义为 metrics=['accuracy']
,则需要更改为 [=15] =]访问值,以避免Key Error。我希望它有所帮助。
N.B。这是您可以在 Keras 中使用的 link to the metrics。
当您指定 validation_data=(X_test, Y_test)
而您的 X_test
and/or Y_test
为空时,也会发生此错误。要检查这一点,请分别打印 X_test
和 Y_test
的形状。在本例中,model.fit(validation_data=(X_test, Y_test), ...)
方法 运行 但由于验证集为空,因此它没有在 history.history
字典中为 val_loss
创建字典键。
看起来在 Keras + Tensorflow 2.0 中 val_acc
已重命名为 val_accuracy
如果您将keras旧版本(例如2.2.5)升级到与Tensorflow 2.0兼容的2.3.0(或更新版本),您可能会遇到这样的错误(例如KeyError:'acc')。 acc 和 val_acc 都已重命名为 accuracy 和 val_accuracy 分别。在脚本中重命名它们将解决问题。
我已经更改了准确性,我的问题已经解决了。张量流 2+
例如
accuracy = history_dict['accuracy']
val_accuracy = history_dict['val_acccuracy']
对我有用的是在
中将objective='val_accuracy'
更改为objective=["val_accuracy"]
tuner = kt.BayesianOptimization(model_builder,
objective=["val_accuracy"],
max_trials=80,
seed=123)
tuner.search(X_train, y_train, epochs=50, validation_split=0.2)
我有 TensorFlow 2+。
我试图在 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()
您可能需要启用训练集的验证拆分。通常,验证发生在训练集的 1/3 中。在您的代码中,进行如下更改:
history=model.fit(X[train], dummy_y[train],validation_split=0.33,nb_epoch=200, batch_size=5, verbose=0)
有效!
要获取任何 val_* 数据(val_acc
、val_loss
、...),您需要先设置验证。
第一种方法(将根据您提供的内容进行验证):
model.fit(validation_data=(X_test, Y_test))
第二种方法(将从部分训练数据中验证):
model.fit(validation_split=0.5)
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
大家漏提的重点是这个Key Error与model.compile(...)
期间的metrics命名有关。您需要与在 model.compile(....,metrics=['<metric name>'])
中命名准确度指标的方式保持一致。您的历史回调对象将接收包含指标中定义的键值对的字典。
因此,如果您的指标是 metrics=['acc']
,您可以使用 history.history['acc']
在历史对象中访问它们,但如果您将指标定义为 metrics=['accuracy']
,则需要更改为 [=15] =]访问值,以避免Key Error。我希望它有所帮助。
N.B。这是您可以在 Keras 中使用的 link to the metrics。
当您指定 validation_data=(X_test, Y_test)
而您的 X_test
and/or Y_test
为空时,也会发生此错误。要检查这一点,请分别打印 X_test
和 Y_test
的形状。在本例中,model.fit(validation_data=(X_test, Y_test), ...)
方法 运行 但由于验证集为空,因此它没有在 history.history
字典中为 val_loss
创建字典键。
看起来在 Keras + Tensorflow 2.0 中 val_acc
已重命名为 val_accuracy
如果您将keras旧版本(例如2.2.5)升级到与Tensorflow 2.0兼容的2.3.0(或更新版本),您可能会遇到这样的错误(例如KeyError:'acc')。 acc 和 val_acc 都已重命名为 accuracy 和 val_accuracy 分别。在脚本中重命名它们将解决问题。
我已经更改了准确性,我的问题已经解决了。张量流 2+
例如
accuracy = history_dict['accuracy']
val_accuracy = history_dict['val_acccuracy']
对我有用的是在
中将objective='val_accuracy'
更改为objective=["val_accuracy"]
tuner = kt.BayesianOptimization(model_builder,
objective=["val_accuracy"],
max_trials=80,
seed=123)
tuner.search(X_train, y_train, epochs=50, validation_split=0.2)
我有 TensorFlow 2+。