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

时间:2017-09-24 08:47:26

标签: keras

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

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

2:我的第一个问题是:当我在model.fit()中定义损失时 - 是否已将所有重量损失都包括在此损失中?

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

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

非常感谢!

1 个答案:

答案 0 :(得分: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

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

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

这是一个简单的例子:

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')

当您运行model.fit()时,屏幕上会显示以下内容:

Epoch 1/1
100/100 [==================] - 0s - loss: 0.5764 - loss_no_weight_decay: 0.5178

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

conv_kernel = model.layers[1].get_weights()[0]
print(np.sum(0.01 * np.square(conv_kernel)))

就我而言,打印值为0.0585,这确实是lossloss_no_weight_decay之间的差异(有一些舍入错误)。