Может кто-нибудь, пожалуйста, объясните функцию потери контента? - PullRequest
0 голосов
/ 08 апреля 2019

В настоящее время я знакомлюсь с TensorFlow и машинным обучением.Я делаю некоторые уроки по передаче стиля, и теперь у меня есть часть примера кода, которую я почему-то не могу понять.

Мне кажется, я понял основную идею: есть три изображения, изображение контента, стильизображение и смешанное изображение.Давайте сначала поговорим о потере контента, потому что, если я смогу это понять, я также пойму потерю стиля.Таким образом, у меня есть изображение контента и смешанное изображение (начиная с некоторого распределения с некоторым шумом) и модель VGG16.

Насколько я понимаю, теперь я должен передать изображение контента в сеть некоторымслой, и посмотреть, что является выходной (карту объектов) этого слоя для ввода изображения контента.

После этого я также должен подать сеть со смешанным изображением на тот же слой, что и раньше, и посмотреть, чтовывод (карта объектов) этого слоя для ввода смешанного изображения.

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

Моя проблема в том, что я не понимаю, как это делается в примерах кодов, которые я могу найти в Интернете.

Пример кода может быть следующим: http://gcucurull.github.io/tensorflow/style-transfer/2016/08/18/neural-art-tf/

Но почти во всех примерах использовался один и тот же подход.

Потеря контента определяется так:

def content_loss(cont_out, target_out, layer, content_weight):

    # content loss is just the mean square error between the outputs of a given layer
    # in the content image and the target image

    cont_loss = tf.reduce_sum(tf.square(tf.sub(target_out[layer], cont_out)))

    # multiply the loss by its weight
    cont_loss = tf.mul(cont_loss, content_weight, name="cont_loss")

return cont_loss

И называется так:

# compute loss
cont_cost = losses.content_loss(content_out, model, C_LAYER, content_weight)

Где content_out - это выход для изображения контента, модель - используемая модель, C_LAYER - ссылка на слой, для которого мы хотим получить выходные данные, а content_weight - это вес, с которым мы умножаемся.

Проблема в том, что я как-то не вижу, куда это питает сеть со смешанным изображением.Мне кажется, что в "cont_loss" вычисляется среднеквадратичное значение между выходом для изображения содержимого и между самим слоем.

Магия должна быть где-то здесь:

cont_loss = tf.reduce_sum(tf.square(tf.sub(target_out[layer], cont_out)))

Но я просто не могу найти, как это приводит к RMS между картой объектов изображения содержимого и картой объектов смешанного изображения на данном слое.

Я был бы очень благодарен, если бы кто-то мог указать, где яЯ ошибаюсь и объясню мне, как рассчитывается потеря контента.

Спасибо!

1 Ответ

1 голос
/ 08 апреля 2019

Потеря вынуждает сети иметь подобную активацию на выбранном вами слое.

Давайте назовем одну сверточную карту / пиксель из target_out[layer] l и соответствующую карту из cont_out c,Вы хотите, чтобы их разность l-c была как можно меньше, т. Е. Абсолютное значение их разности.Ради численной стабильности мы используем квадратную функцию вместо абсолютного значения, потому что это гладкая функция и более терпимая к маленьким ошибкам.

Таким образом, мы получаем (l-c)**2, то есть: tf.square(tf.sub(target_out[layer], cont_out)).

Наконец, мы хотим минимизировать разницу для каждой карты и каждого примера в пакете.Вот почему мы суммируем всю разницу в один скаляр, используя tf.reduce_sum.

...