首页 > 解决方案 > 在风格迁移中使用 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 归一化是如何惩罚的,或者它到底惩罚了什么?

标签: pythontensorflowneural-networkkerasdeep-learning

解决方案


我知道它通过向层的成本函数添加与权重平方和成比例的惩罚来防止过度拟合,从而有助于保持权重较小。

您指的是(权重)正则化,在这种情况下,它是 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)相似。请注意,层的权重是固定的,并且相对于输入图像不会改变(当然是在训练之后);相反,它们用于描述表示特定的输入图像,并且该表示称为该特定图像的该层的激活


推荐阅读