我是Keras的新学习者。我想问一个问题:
1:在Keras中,我创建了一个卷积层,并使用了L2权重衰减。
2:我的第一个问题是:当我在model.fit()
中定义损失时 - 是否已将所有重量损失都包括在此损失中?
3:如果体重衰减损失已包括在总损失中:如何在训练期间没有这种体重衰减的情况下获得损失?
我想调查没有体重衰减的损失,而我希望这种体重衰减参加这次培训。
非常感谢!
答案 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,这确实是loss
和loss_no_weight_decay
之间的差异(有一些舍入错误)。