我遇到了一个tensorflow 2.0代码片段,用于计算损失。总损失由两部分组成:1)正则化损失,2)预测损失。我的问题是为什么model.losses
是正则化损失? model
是tf.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
答案 0 :(得分:0)
我们获得访问losses
属性的正则化损失,因为这些损失是在模型定义期间创建的。由于模型是Keras模型,因此您已使用Keras图层进行了构建。每个Keras层(Dense,Conv3D等)都可以进行正则化,这是该层本身的属性。
该模型是有序的图层集合,包含losses
属性内的所有图层损失。
急切的安全意味着您可以在急切的训练期间使用模型的losses
属性,请确保渐变仅传播到正确的图层。例如。如果仅在模型的第二层添加l2正则化,则第二层的变量仅受损失项的影响(并更新)。
被命名为losses
而不是regularization_losses
,因为它不仅限于正则化损失;编译模型时,该属性会增加非正则化损失