如何在没有Keras重量衰减的情况下计算损失?

Kev*_*Sun 3 keras

我是Keras的新学习者.我想问一个问题:

1:在Keras,我创建一个卷积层,并使用L2权重衰减.

2:我的第一个问题是:当我确定损失时model.fit()- 所有的重量衰减损失都包括在这个损失中吗?

3:如果重量损失已包括在总损失中:如何在训练期间没有这种重量衰减的情况下获得损失?

我想调查没有体重衰减的损失,而我希望这种体重衰减参加这次培训.

非常感谢!

Yu-*_*ang 6

是的,重量损失损失包含在屏幕上显示的损失值中.

您要监控的值是总损耗减去正则化损失的总和.

  • 总损失是公正的model.total_loss .
  • 正规化损失收集在清单中model.losses.

以下行可以在以下源代码中找到model.compile():

# Add regularization penalties
# and other layer-specific losses.
for loss_tensor in self.losses:
    total_loss += loss_tensor
Run Code Online (Sandbox Code Playgroud)

为了在没有重量衰减的情况下获得损失,您可以撤销上述操作.即,要监控的值是model.total_loss - sum(model.losses).

现在,如何监控这个值有点棘手.幸运的是,Keras模型使用的度量列表在model.fit()被调用之前不会被修复.因此,您可以将此值附加到列表中,并在模型拟合期间将其打印在屏幕上.

这是一个简单的例子:

input_tensor = Input(shape=(64, 64, 3))
hidden = Conv2D(32, 1, kernel_regularizer=l2(0.01))(input_tensor)
hidden = GlobalAveragePooling2D()(hidden)
out = Dense(1)(hidden)
model = Model(input_tensor, out)
model.compile(loss='mse', optimizer='adam')

loss_no_weight_decay = model.total_loss - sum(model.losses)
model.metrics_tensors.append(loss_no_weight_decay)
model.metrics_names.append('loss_no_weight_decay')
Run Code Online (Sandbox Code Playgroud)

当你运行时model.fit(),这样的东西将被打印到屏幕上:

Epoch 1/1
100/100 [==================] - 0s - loss: 0.5764 - loss_no_weight_decay: 0.5178
Run Code Online (Sandbox Code Playgroud)

您还可以通过手动计算L2正则化来验证此值是否正确:

conv_kernel = model.layers[1].get_weights()[0]
print(np.sum(0.01 * np.square(conv_kernel)))
Run Code Online (Sandbox Code Playgroud)

在我的情况下,打印值是0.0585,这确实是loss和之间的差异loss_no_weight_decay(有一些舍入误差).