为什么model.losss返回正则化损失?

时间:2019-06-20 21:04:45

标签: python tensorflow keras tensorflow2.0 eager-execution

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

  

与此层相关的损失。

     

访问此属性时将创建可变正则张量,因此它非常安全:在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

1 个答案:

答案 0 :(得分:0)

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

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

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

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