train_on_batch 计算的不同损失值并评估

时间:2021-01-26 13:17:25

标签: tensorflow machine-learning keras

批训练前、批训练和训练后的评估返回不同的损失值。

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_losstrain_loss 并不完全相同。而且所有的损失值都不一样。

我对 train_on_batch 的假设是否正确?如果是,为什么所有的损失值都不同?

Colab example

1 个答案:

答案 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_stepmodel.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?