我一直在研究Chollet的Python深度学习,其中他简要介绍了关于Keras的L2标准化。我知道,它通过将与权重平方和成比例的惩罚添加到图层的成本函数中来防止过度拟合,从而有助于减小权重。
但是,在涉及艺术风格转移的部分中,作为一种措施的内容损失描述为:
激活之间的L2规范 通过目标图像计算出的预训练卷积网络中的上层,以及激活 在生成的图像上计算的同一层的层数。这样可以保证 从上层看,生成的图像将看起来相似。
样式丢失也与L2规范有关,但现在让我们集中讨论内容丢失。
因此,相关代码段(第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归一化是如何惩罚的,或者它到底是什么惩罚?
答案 0 :(得分:2)
我知道它可以通过将与权重的平方和成比例的惩罚添加到图层的成本函数中来防止过度拟合,从而有助于减小权重。
您指的是(权重)正则化,在这种情况下,它就是L2正则化。向量的L2范数是其元素的平方和,因此,当您对图层的权重(即参数)应用L2正则化时,将在损失函数中将其视为(即相加)。由于我们将损失函数最小化,因此副作用是权重的L2范数也将减小,这又意味着权重的值已减小(即小权重)。
但是,在样式转换示例中,内容损失定义为特定层(即{{1})的激活(而非权重)之间的差值的L2范数(在这种情况下为L2损失) })应用于目标图像和组合图像(即目标图像+样式)时:
content_layer
因此,这里不涉及权重正则化。相反,所使用的损失函数是L2范数,它用于衡量两个数组的相似性(即内容层的激活)。 L2-范数越小,激活越相似。
为什么激活层而不激活它的权重?因为我们要确保目标图像和组合图像的内容(即return K.sum(K.square(combination - base)) # that's exactly the definition of L2-norm
表示)相似。注意,图层的权重是固定的,并且相对于输入图像不会改变(当然,在训练后);相反,它们用于描述或表示特定输入图像,并且该表示称为该特定图像在该层的激活。 / p>