我搜索了很多答案,但没有找到一个让我满意的。
如果我理解正确的话,在 model.fit() 过程中,Keras 会将最后一个批次的损失值打印到终端。
如果我在训练集上调用 model.evaluate(),我会得到整个集合的损失值。
所以,直觉上,如果我在训练集的一个单一实例上调用 model.evaluate(),我应该得到一个值,这个值是调用 model.evaluate() 在整个训练集上得到的值的一小部分。但实际上,我得到的值接近甚至大了约10倍。为什么会这样呢?
回答:
如果我理解正确的话,在 model.fit() 过程中,Keras 会将最后一个批次的损失值打印到终端。
一般来说是的,但这也取决于你的 verbose 参数;如果设置为 2,你会得到每轮一行的输出,但如果你设置为 1,你会得到一个进度条,显示每个批次和其他信息的详细情况。
这也会打印你模型中包含的其他指标(如准确率、均方误差等)。
现在,我认为你期望的直觉行为并不完全正确。首先,我必须说这也取决于你的具体模型和架构,因为一些特性如 Dropout 层可能会有自己的特定交互,可能会改变你的损失和指标的结果。
关键是,model.evaluate() 方法是以批次方式进行计算的,正如文档中所指定的。两个重要的参数是 batch_size,即每次评估步骤的样本数,以及 steps,即完成评估所需的步骤(批次)数。
深入研究 model.evaluate() 的源代码,我们可以看到它会平均由 steps 或 num_samples 返回的批次大小损失和其他指标。
这意味着如果你只传递一个样本,你得到的结果将被除以 1(因此得到更高的值),而如果你提供更多样本(如你的测试数据),结果将被大于 1 的数字平均,从而得到比使用较少样本时更“小”的值。