如何为keras实验绘制学习曲线?

时间:2016-06-06 18:48:27

标签: machine-learning neural-network cross-validation keras recurrent-neural-network

我使用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词典?

3 个答案:

答案 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_accval_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>