我设置了一个如下所示的Keras模型(TensorFlow 1.2.1版本):
输出是一个简单的浮点向量,并且如期望的那样收敛。损失函数使用的是均方误差。示例输出如下:
18/100 [====>.........................] - ETA: 30s - loss: 31.5118 19/100 [====>.........................] - ETA: 29s - loss: 30.7577 20/100 [=====>........................] - ETA: 29s - loss: 29.7815 21/100 [====>........................] - ETA: 28s - loss: 29.0535 22/100 [====>........................] - ETA: 28s - loss: 28.1963 23/100 [====>........................] - ETA: 28s - loss: 27.3314 24/100 [======>.......................] - ETA: 28s - loss: 26.7219 25/100 [======>.......................] - ETA: 28s - loss: 25.9702 26/100 [======>.......................] - ETA: 27s - loss: 25.4181 27/100 [=======>......................] - ETA: 27s - loss: 25.0638 28/100 [=======>......................] - ETA: 27s - loss: 24.6081 29/100 [=======>......................] - ETA: 26s - loss: 24.0928
损失似乎在稳步下降。然而,当我查看实际的损失值(keras.callbacks.LambdaCallback@on_batch_end
)时,情况并非如此平滑:
25.47338328.05177920.51907513.20449320.7494621.24625425.61114913.19468213.26874415.40842217.18385111.23263714.49311510.196851
我尝试研究了Keras的源代码,但无法理解底层发生了什么。Keras是如何过滤实际损失值的?在源代码的哪里可以找到这些信息?
谢谢!
回答:
实际上,进度条中显示的是在打印时,截至当前epoch的所有批次的损失均值。(例如,2个批次后的前2个批次的均值,3个批次后的前3个批次的均值,依此类推)。因此,您可以通过计算前n
个损失值的均值来获得第n
个epoch后的打印值。您可以在这里阅读关于Progbar
的定义。