我使用keras训练RNN,并希望了解验证准确度如何随数据集大小而变化。 Keras在其历史对象中有一个名为val_acc
的列表,该列表在每个历元之后附加,并具有相应的验证集精度(link to the post in google group)。我想获得运行时期数的val_acc
的平均值,并根据相应的数据集大小进行绘制。
问题:如何检索val_acc
列表中的元素并执行numpy.mean(val_acc)
之类的操作?
编辑:正如@runDOSrun所说,获得val_acc
的平均值并不合理。让我专注于获得最终val_acc
。
我尝试过@nemo的建议,但没有运气。这是我打印时得到的内容
model.fit(X_train, y_train, batch_size = 512, nb_epoch = 5, validation_split = 0.05).__dict__
输出:
{'model': <keras.models.Sequential object at 0x000000001F752A90>, 'params': {'verbose': 1, 'nb_epoch': 5, 'batch_size': 512, 'metrics': ['loss', 'val_loss'], 'nb_sample': 1710, 'do_validation': True}, 'epoch': [0, 1, 2, 3, 4], 'history': {'loss': [0.96936064512408959, 0.66933631673890948, 0.63404161288724303, 0.62268789783555867, 0.60833334699708819], 'val_loss': [0.84040999412536621, 0.75676006078720093, 0.73714292049407959, 0.71032363176345825, 0.71341043710708618]}}
事实证明,我的历史词典中没有val_acc
列表。
问题:如何将val_acc
加入history
词典?
答案 0 :(得分:5)
要获得准确度值,您需要请求在fit
期间计算它们,因为准确性不是目标函数,而是(通用)指标。有时计算精度没有意义,因此在Keras默认情况下不会启用它。但是,它是一个内置指标,并且易于添加。
添加指标use metrics=['accuracy']
parameter to model.compile
。
在你的例子中:
history = model.fit(X_train, y_train, batch_size = 512,
nb_epoch = 5, validation_split = 0.05)
然后,您可以将验证准确性视为history.history['val_acc']
答案 1 :(得分:3)
为什么您发现平均准确度比最终准确度更重要?根据您的初始值,您的平均值可能会产生误导。很容易得出具有相同平均但不同解释的不同曲线。
我只是绘制train_acc
和val_acc
的完整历史记录,以确定RNN在给定设置中是否表现良好。并且也不要忘记样本大小N> 1.随机初始化会对RNN产生很大影响,每次设置至少要进行N = 10次不同的初始化,以确保不同的性能实际上是由您的设置大小引起的,而不是由更好/更差的初始化引起的。
答案 2 :(得分:2)
历史对象是在fit()
模型期间创建的。有关详细信息,请参阅keras/engine/training.py
。
您可以使用模型上的history
属性访问历史记录:model.history
。
在拟合模型后,您只需对属性进行平均。
np.mean([v['val_acc'] for v in model.history])
请注意,对于您指定的每个输出,模式为val_<your output name here>
。