【问题标题】:How can I calculate the loss without the weight decay in Keras?如何在没有 Keras 重量衰减的情况下计算损失?
【发布时间】:2017-09-24 08:47:25
【问题描述】:

我定义了一个卷积层,并在 Keras 中使用了 L2 权重衰减。

当我在model.fit()中定义损失时,所有的重量衰减损失都包含在这个损失中了吗?如果权重衰减损失已包含在总损失中,那么在训练期间如何获得没有这种权重衰减的损失?

我想调查没有重量衰减的损失,同时我希望这个重量衰减参加这次培训。

【问题讨论】:

  • 你能分享一些代码吗?具体来说,如何指定“L2权重衰减”,拟合时使用什么损失函数?

标签: keras


【解决方案1】:

是的,重量衰减损失包含在屏幕上打印的损失值中。

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

  • 总损失只是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 之间的差异(有一些舍入误差)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2011-04-25
    • 2019-05-31
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    相关资源
    最近更新 更多