是的,重量衰减损失包含在屏幕上打印的损失值中。
您要监控的值是总损失减去正则化损失的总和。
- 总损失只是
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,这确实是 loss 和 loss_no_weight_decay 之间的差异(有一些舍入误差)。