Сумма двух потерь в Керасе (Perceptual и MSE) - PullRequest
0 голосов
/ 05 января 2019

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

def custom_objective(y_true, y_pred):

   tosub = K.constant([103.939, 116.779, 123.68])
   y1 = vgg_model(y_pred * 255. - tosub)
   y2 = vgg_model(y_true * 255. - tosub)
   loss2 = K.mean(K.square(y2 - y1), axis=-1)
   loss1 = K.mean(K.square(y_pred - y_true), axis=-1)
   loss = loss1 + loss2

return loss

проблема в том, что форма loss1 похожа на (BatchSize, 224, 224), но форма loss2 равна (BatchSize, 7, 7), так что это дает мне ошибку о несовместимых формах, что правильно. Я хочу знать, как я могу добавить эти два правильно? я должен разгадать в первую очередь? и как?

1 Ответ

0 голосов
/ 05 января 2019

Функция потерь всегда должна возвращать скаляр (для каждой выборки в пакете или для всей серии), поскольку мы хотим минимизировать его (т. Е. Вы не можете минимизировать вектор, если не определите, что вы подразумеваете под «минимизацией вектор"). Следовательно, один простой способ уменьшить это до скаляра состоит в том, чтобы взять среднее значение по всем осям, кроме оси пакета, которая усреднена по внутреннему значению:

loss2 = K.mean(K.square(y2 - y1), axis=[1,2,3])
loss1 = K.mean(K.square(y_pred - y_true), axis=[1,2,3])
loss = loss1 + loss2

Обновление: Позвольте мне уточнить, что все в порядке, если функция потерь возвращает вектор или даже массив nD (на самом деле вышеупомянутая функция потерь возвращает вектор длины batch_size), но имейте в виду что в конце Keras принимает среднее значение возвращаемых значений , и это реальное значение потерь (которое будет минимизировано).

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