如何解释Keras模型.fit输出?

25

我刚开始使用Keras。 我正在处理一个有模型的样例,下面这段代码用于运行该模型:

from sklearn.preprocessing import LabelBinarizer
label_binarizer = LabelBinarizer()
y_one_hot = label_binarizer.fit_transform(y_train)

model.compile('adam', 'categorical_crossentropy', ['accuracy'])
history = model.fit(X_normalized, y_one_hot, nb_epoch=3, validation_split=0.2)

我得到以下的回应:

Using TensorFlow backend. Train on 80 samples, validate on 20 samples Epoch 1/3

32/80 [===========>..................] - ETA: 0s - loss: 1.5831 - acc:
0.4062 80/80 [==============================] - 0s - loss: 1.3927 - acc:
0.4500 - val_loss: 0.7802 - val_acc: 0.8500 Epoch 2/3

32/80 [===========>..................] - ETA: 0s - loss: 0.9300 - acc:
0.7500 80/80 [==============================] - 0s - loss: 0.8490 - acc:
0.8000 - val_loss: 0.5772 - val_acc: 0.8500 Epoch 3/3

32/80 [===========>..................] - ETA: 0s - loss: 0.6397 - acc:
0.8750 64/80 [=======================>......] - ETA: 0s - loss: 0.6867 - acc:
0.7969 80/80 [==============================] - 0s - loss: 0.6638 - acc:
0.8000 - val_loss: 0.4294 - val_acc: 0.8500

根据文档,fit返回历史信息实例。其history属性包含训练过程中收集的所有信息。

有人知道如何解释历史实例吗?例如,32/80是什么意思?我假设80是样本数量,但是32代表什么?ETA: 0s是什么意思?

2个回答

22

ETA = 预计到达时间。

80 是你的训练集大小,32/8064/80 表示你的批次大小为32,当前正在处理第一批(或第二批)数据。

lossacc 指当前训练集的损失和准确率。在每个纪元结束时,训练好的神经网络会被评估与验证集进行比较。这就是val_lossval_acc 的含义。

model.fit() 返回的历史对象是一个简单的类,有一些字段,例如对model的引用、一个params字典以及最重要的是一个history字典。它存储了每个纪元结束时lossacc(或任何其他使用的指标)的值。2个纪元的结果如下:

{
    'val_loss': [16.11809539794922, 14.12947562917035],
    'val_acc': [0.0, 0.0],
    'loss': [14.890108108520508, 12.088571548461914],
    'acc': [0.0, 0.25]
}

如果您想要可视化您的训练进度,这将非常方便。

注意:如果您的验证损失/准确率开始增加,而训练损失/准确率仍在下降,则表明出现了过拟合的迹象。

注意2:在最后,您应该针对与训练集和验证集不同的一些测试集测试您的神经网络,因此在训练过程中从未接触过该测试集。


问题:当批次被处理时,“损失”会持续更新。现在,请告诉我“损失”是在整个数据集上还是仅在批次上进行评估。谢谢。 - CKM
据我所知,这是一个运行平均损失,即到目前为止整个数据集的损失。 - sebrockm
关于80的值,它应该等同于训练数据集的大小。然而,在我的R中使用keras时,我得到了一个'4/4'的值。然而,我的训练数据集样本量为113。我是否误解了破折号后面的第二个数字? - pdhami
80不是训练集的大小,实际上它是批次的数量。因此,训练集的大小为80 * batch_size。如果batch_size为64,则训练集的大小为80 * 64。输出中没有给出batch_size。 - ibilgen
@ibilgen我已经有两年没有使用Keras了,所以我无法告诉它现在的情况。但是回到我写这个答案的时候,80绝对是训练集大小。也许他们同时更改了输出以显示批次数? - sebrockm
是的,这是可能的。感谢澄清。我是从使用Keras版本2.10的示例推断出来的。 - ibilgen

10

32 是你的批大小。如果你希望更改批大小,可以在fit函数中进行更改。32是默认值。

在第一批训练后,Keras会估计进行完整遍历所有样本的训练所需时间(ETA:预计到达时间)—即一个epoch的时间。

此外,您还将获得训练和验证样本的损失(预测与真实标签之间的差异)以及度量指标(在您的情况下为准确性)。


你知道 acc:0.4062 80/80 是什么意思吗?acc 是指准确率吗?80/80 表示 80 个样本中有 80 个正确吗?这不应该意味着 acc = 1.0 吗?是否有任何关于输出含义的参考链接? - SeanJ
1
@petezurick 谢谢!不过,我不是在寻找“准确性”等术语的含义,而只是想知道缩写代表什么(来自Tensorflow背景)。我本以为会有一个页面解释历史输出是什么。感谢提供链接! - SeanJ
@SeanJ 我明白了。对于误解我感到抱歉。这可能会有所帮助:https://machinelearningmastery.com/display-deep-learning-model-training-history-in-keras/。 - petezurich
1
答案很好但不完整。没有提及参考文献和 val_loss: val_acc 没有描述... - SeanJ
80是批次的数量。因此,训练集的实际大小为80 x batch_size。 - ibilgen
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接