Python 在keras中绘制学习曲线给出了关键错误:';val#U acc';

Python 在keras中绘制学习曲线给出了关键错误:';val#U acc';,python,machine-learning,classification,pattern-recognition,Python,Machine Learning,Classification,Pattern Recognition,我试图在keras中绘制训练和测试学习曲线,但是,下面的代码生成了KeyError:'val_acc error 官方文件规定,为了使用'val_acc',我需要启用验证和准确性监控,我不理解也不知道如何在我的代码中使用这些功能 任何帮助都将不胜感激。 谢谢 您可能需要启用车组的验证拆分。通常,验证发生在列车组的1/3处。在代码中,按如下所示进行更改: history=model.fit(X[train], dummy_y[train],validation_split=0.33,nb_epoc

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

官方文件
规定,为了使用
'val_acc'
,我需要启用验证和准确性监控,我不理解也不知道如何在我的代码中使用这些功能

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


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

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

要获取任何val_*数据(
val_uACC
val_uLoss
,…),您需要首先设置验证

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

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

如果您打印历史记录的键,您将得到如下
记录键(['loss','acc','valu loss','valu acc'])

然后编辑这样的代码

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

大家没有提到的要点是,这一关键错误与
model.compile(…)
期间的度量命名有关。在
model.compile(..,metrics=[''])
中,您需要与您命名精度度量的方式保持一致。历史回调对象将接收包含度量中定义的键值对的字典

因此,如果您的度量是
metrics=['acc']
,您可以使用
history.history['acc']
在历史对象中访问它们,但如果您将度量定义为
metrics=['accurity']
,则需要更改为
history.history['accurity']
来访问值,以避免键错误。我希望有帮助


注意:这里有一个可以在Keras中使用的参数。

当您指定
validation\u data=(X\u test,Y\u test)
并且您的
X\u test
和/或
Y\u test
为空时,也会发生此错误。要检查这一点,请分别打印
X_测试
Y_测试
的形状。在本例中,
model.fit(validation\u data=(X\u test,Y\u test),…)
方法运行,但由于验证集为空,因此它没有在
history.history
字典中为
val\u loss
创建字典键

看起来像Keras+Tensorflow 2.0
val_acc
被重命名为
val_Accurance
如果您将Keras较旧版本(如2.2.5)升级到与Tensorflow 2.0兼容的2.3.0(或更新版本),则可能会出现此类错误(如keyrerror:“acc”)。accval_acc已分别重命名为accval_acc。在脚本中重命名它们将解决问题。

我已根据准确性更改了acc,我的问题已解决。张量流2+

e、 g


请添加官方文件的链接以供参考。虽然这还可以,但我还是面对着这个prblm,我发现了这个。简单地说,找到一种“历史记录”。这将是一个字典,这意味着dict有键和值。所以试着打印键和值。如果打印“print(history_dict.keys())”,您将获得此输出的dict_键(['loss','acc','val_loss','val_acc'])。因此,历史对象包含字典。在那本字典里我们有['loss','acc','valu loss','valu acc']键。对于这些键,我们有值。所以我们可以用键绘制一个图表(在dict中,我们只能通过键来使用值)。这样做除了给每个人带来很多麻烦之外还有什么意义呢?回答得很好。在我的例子中,我有多个
keras.metrics.Precision()
类,无法理解为什么我会得到
val\u Precision\u 1
val\u Precision\u 2
,等等。。。这个评论解决了这个问题。我必须给每个class
keras.metrics.Percision(name='precision')
赋予相同的名称,才能指望该键存在于历史对象中。
model.fit(validation_data=(X_test, Y_test))
model.fit(validation_split=0.5) 
history_dict = history.history
print(history_dict.keys())
acc = history_dict['acc']
val_acc = history_dict['val_acc']
loss = history_dict['loss']
val_loss = history_dict['val_loss']
accuracy = history_dict['accuracy']
val_accuracy = history_dict['val_acccuracy']