Я проходил глубокое изучение Chollet с Python, где он кратко описывает нормализацию L2 по отношению к Keras.Я понимаю, что это предотвращает переоснащение, добавляя штраф, пропорциональный сумме квадрата весов, к функции стоимости слоя, помогая сохранять веса небольшими.
Однако в разделе, посвященном передаче художественного стиля,потеря контента как мера описывается следующим образом:
норма 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)
Я не понимаю, почему мы используем выходные данные каждого слоя, которые являются картами элементов изображения, а не Керасом.get_weights()
метод извлечения весов для нормализации.Я не понимаю, как использование L2-нормализации на этих картах функций наказывает во время тренировок или, более того, что именно штрафует?