批训练前、批训练和训练后的评估返回不同的损失值。
pre_train_loss = model.evaluate(batch_x, batch_y, verbose=0)
train_loss = model.train_on_batch(batch_x, batch_y)
post_train_loss = model.evaluate(batch_x, batch_y, verbose=0)
Pre batch train loss : 2.3195652961730957
train_on_batch loss : 2.3300909996032715
Post batch train loss : 2.2722578048706055
我假设 train_on_batch
返回计算之前参数更新(反向传播之前)的损失。但是 pre_train_loss
和 train_loss
并不完全相同。而且所有的损失值都不一样。
我对 train_on_batch
的假设是否正确?如果是,为什么所有的损失值都不同?
答案 0 :(得分:1)
让我给你详细解释发生了什么。
调用 model.evaluate
(或 model.test_on_batch
)将调用 model.make_test_function
,后者将调用 model.test_step
,此函数执行以下操作:
y_pred = self(x, training=False)
# Updates stateful loss metrics.
self.compiled_loss(
y, y_pred, sample_weight, regularization_losses=self.losses)
调用 model.train_on_batch
将调用 model.make_train_function
,后者将调用 model.train_step
,此函数执行以下操作:
with backprop.GradientTape() as tape:
y_pred = self(x, training=True)
loss = self.compiled_loss(
y, y_pred, sample_weight, regularization_losses=self.losses)
从上面的源代码可以看出,计算损失时,model.test_step
和 model.train_step
之间的唯一区别是在将数据前向传递给模型时是否 training=True
。
因为一些神经网络层在训练和推理过程中表现不同(例如 Dropout 和 BatchNormalization 层),所以我们有 training
参数让这些层知道它应该采用两条“路径”中的哪一条,例如:< /p>
在训练期间,dropout 会随机丢弃单元并相应地扩大剩余单元的激活。
在推理过程中,它什么都不做(因为您通常不希望在这里丢弃单元的随机性)。
由于您的模型中有 dropout 层,因此预计训练模式中的损失会增加。
如果在定义模型时删除行 layers.Dropout(0.5),
,您将看到损失几乎相同(即浮点精度不匹配很小),例如三个时期的输出:
Epoch: 1
Pre batch train loss : 1.6852061748504639
train_on_batch loss : 1.6852061748504639
Post batch train loss : 1.6012675762176514
Pre batch train loss : 1.7325702905654907
train_on_batch loss : 1.7325704097747803
Post batch train loss : 1.6512296199798584
Epoch: 2
Pre batch train loss : 1.5149778127670288
train_on_batch loss : 1.5149779319763184
Post batch train loss : 1.4209072589874268
Pre batch train loss : 1.567994475364685
train_on_batch loss : 1.5679945945739746
Post batch train loss : 1.4767804145812988
Epoch: 3
Pre batch train loss : 1.3269715309143066
train_on_batch loss : 1.3269715309143066
Post batch train loss : 1.2274967432022095
Pre batch train loss : 1.3868262767791748
train_on_batch loss : 1.3868262767791748
Post batch train loss : 1.2916004657745361
参考:
Documents and source code link of tf.keras.Model
What does training=True
mean when calling a TensorFlow Keras model?