8

我遇到了一段 tensorflow 2.0 的代码片段,用于计算损失。总损失由两部分组成:1)正则化损失,2)预测损失。我的问题是为什么model.losses正则化损失?model这是一个实例tf.keras.Model。我对 tensorflow 官方 API 文档有点困惑。tf.keras.Model,它说

与此层相关的损失。

访问此属性时会创建变量正则化张量,因此它非常安全:在 a 下访问损失tf.GradientTape会将梯度传播回相应的变量。

为什么我们可以通过访问losses属性来获得正则化损失?另外,什么是渴望安全?如果losses属性返回正则化损失,为什么它被命名losses而不是regularization_loss

with tf.GradientTape() as tape:
  outputs = model(images, training=True)
  regularization_loss = tf.reduce_sum(model.losses)
  pred_loss = ...
  total_loss = pred_loss + regularization_loss
4

1 回答 1

6

我们得到访问losses属性的正则化损失,因为这些损失是在模型定义期间创建的。由于该模型是 Keras 模型,因此您使用 Keras 层构建了它。每个 Keras 层(Dense、Conv3D、...)都可以进行正则化,这是层本身的属性。

该模型是层的有序集合,包含losses属性内的所有层损失。

急切安全意味着您可以losses在急切训练期间使用模型的属性,确保梯度仅传播到正确的层。例如,如果您仅在模型的第二层添加 l2 正则化,则第二层的变量仅受损失项的影响(和更新)。

被命名losses而不是regularization_losses因为不仅限于正则化损失;编译模型时,会向该属性添加非正则化损失

于 2019-06-21T06:21:42.407 回答