我是Keras的新学习者.我想问一个问题:
1:在Keras,我创建一个卷积层,并使用L2权重衰减.
2:我的第一个问题是:当我确定损失时model.fit()- 所有的重量衰减损失都包括在这个损失中吗?
3:如果重量损失已包括在总损失中:如何在训练期间没有这种重量衰减的情况下获得损失?
我想调查没有体重衰减的损失,而我希望这种体重衰减参加这次培训.
非常感谢!
是的,重量损失损失包含在屏幕上显示的损失值中.
您要监控的值是总损耗减去正则化损失的总和.
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(有一些舍入误差).
| 归档时间: |
|
| 查看次数: |
843 次 |
| 最近记录: |