python - 在风格迁移中使用 L2 归一化 - 不涉及权重?
问题描述
我一直在阅读 Chollet 的 Python 深度学习,在那里他简要介绍了有关 Keras 的 L2 标准化。我知道它通过向层的成本函数添加与权重平方和成比例的惩罚来防止过度拟合,从而有助于保持权重较小。
然而,在艺术风格转移部分,内容损失作为衡量标准被描述为:
在目标图像上计算的预训练卷积网络中上层的激活与在生成的图像上计算的同一层的激活之间的 L2 范数。这保证了,从上层看,生成的图像看起来很相似。
样式损失也与 L2-norm 有关,但现在让我们关注内容损失。
因此,相关的代码片段(第 292 页):
def content_loss(base, combination):
return K.sum(K.square(combination - base))
outputs_dict = dict([(layer.name, layer.output) for layer in model.layers])
content_layer = 'block5_conv2'
style_layers = ['block1_conv1',
'block2_conv1',
'block3_conv1',
'block4_conv1',
'block5_conv1']
total_variation_weight = 1e-4
style_weight = 1.
content_weight = 0.025
#K here refers to the keras backend
loss = K.variable(0.)
layer_features = outputs_dict[content_layer]
target_image_features = layer_features[0, :, :, :]
combination_features = layer_features[2, :, :, :]
loss += content_weight * content_loss(target_image_features,
combination_features)
我不明白为什么我们使用每一层的输出,即图像特征图,而不是 Keras 的get_weights()
方法来获取权重来执行归一化。我不知道在训练期间在这些特征图上使用 L2 归一化是如何惩罚的,或者它到底惩罚了什么?
解决方案
我知道它通过向层的成本函数添加与权重平方和成比例的惩罚来防止过度拟合,从而有助于保持权重较小。
您指的是(权重)正则化,在这种情况下,它是 L2 正则化。向量的 L2 范数是其元素的平方和,因此当您对层的权重(即参数)应用 L2 正则化时,它将被考虑(即添加)在损失函数中。由于我们正在最小化损失函数,副作用是权重的 L2 范数也将减少,这反过来意味着权重的值已经减少(即小权重)。
content_layer
然而,在风格迁移示例中,内容损失被定义为应用于目标图像时特定层(即以及组合图片(即目标图片+风格):
return K.sum(K.square(combination - base)) # that's exactly the definition of L2-norm
所以这里不涉及权重正则化。相反,使用的损失函数是 L2 范数,它被用作衡量两个数组的相似性(即内容层的激活)。L2 范数越小,激活越相似。
为什么激活层而不是其权重?因为我们要确保目标图像和组合图像的内容(即由 给出的表示content_layer
)相似。请注意,层的权重是固定的,并且相对于输入图像不会改变(当然是在训练之后);相反,它们用于描述或表示特定的输入图像,并且该表示称为该特定图像的该层的激活。
推荐阅读
- python - 无法使用 Flask/Python 为雪花执行任何 sql
- php - 为什么mysql查询花费太多时间来获取结果?
- android - 带有泛型的 Dagger Hilt 缺失/绑定接口
- python - 是否可以使用 Python 对具有相同文件扩展名的文件进行分类?
- c# - Lucene.NET Delete.Documents 对于 BooleanQuery 没有按预期工作
- ios - 使用选择日期快速更新 FSCalendar 标头值
- matlab - 伺服电机传递函数的在线估计
- excel - VBA 中的数据透视表
- cisco - 如何检查分机(电话号码)是否可达?
- c++ - 在 c++ 中使用 c 代码定义(静态代码警告)