Использование L2-нормализации в передаче стиля - без весов? - PullRequest
0 голосов
/ 17 октября 2018

Я проходил глубокое изучение 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-нормализации на этих картах функций наказывает во время тренировок или, более того, что именно штрафует?

1 Ответ

0 голосов
/ 17 октября 2018

Я понимаю, что это предотвращает переоснащение, добавляя штраф, пропорциональный сумме квадрата весов, к функции стоимости слоя, помогая сохранять веса небольшими.

ЧтоВы имеете в виду (вес) регуляризации и в данном случае это L2-регуляризация.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) целевого изображения и комбинированного изображения одинаковы.Обратите внимание, что веса слоя являются фиксированными и не изменяются (после обучения, конечно) относительно входного изображения;скорее, они используются для описания или для представления конкретного входного изображения, и это представление называется активациями этого слоя для этого конкретного изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...