批量训练前后和训练过程中计算的不同损失值

在批量训练前进行评估、批量训练和训练后返回的损失值各不相同。

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.3195652961730957train_on_batch loss   : 2.3300909996032715Post batch train loss : 2.2722578048706055

我原本以为train_on_batch返回的是参数更新之前(反向传播之前)计算的损失值。但pre_train_losstrain_loss并非完全相同。此外,所有损失值都不同。

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

Colab示例


回答:

让我详细解释一下发生了什么。

调用model.evaluate(或model.test_on_batch)会调用model.make_test_function,这将调用model.test_step,这个函数会执行以下操作:

y_pred = self(x, training=False)# 更新有状态的损失指标。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参数来让这些层知道它应该采取哪条“路径”,例如:

  • 在训练过程中,dropout会随机丢弃单元,并相应地放大剩余单元的激活值。

  • 在推理过程中,它什么也不做(因为通常你不希望在这里出现丢弃单元的随机性)。

由于您的模型中包含dropout层,因此训练模式下损失增加是预期的。

如果在定义模型时移除layers.Dropout(0.5),这一行,您会看到损失值几乎相同(即存在少许浮点精度差异),例如三个epoch的输出:

Epoch: 1Pre batch train loss  : 1.6852061748504639train_on_batch loss   : 1.6852061748504639Post batch train loss : 1.6012675762176514Pre batch train loss  : 1.7325702905654907train_on_batch loss   : 1.7325704097747803Post batch train loss : 1.6512296199798584Epoch: 2Pre batch train loss  : 1.5149778127670288train_on_batch loss   : 1.5149779319763184Post batch train loss : 1.4209072589874268Pre batch train loss  : 1.567994475364685train_on_batch loss   : 1.5679945945739746Post batch train loss : 1.4767804145812988Epoch: 3Pre batch train loss  : 1.3269715309143066train_on_batch loss   : 1.3269715309143066Post batch train loss : 1.2274967432022095Pre batch train loss  : 1.3868262767791748train_on_batch loss   : 1.3868262767791748Post batch train loss : 1.2916004657745361

参考资料:

tf.keras.Model的文档和源代码链接

调用TensorFlow Keras模型时training=True是什么意思?

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注