Вывести несколько потерь, добавленных add_loss в Keras - PullRequest
0 голосов
/ 07 января 2019

Я исследовал пример Keras для пользовательского слоя потерь, продемонстрированного Variational Autoencoder (VAE) . В этом примере они имеют только один слой потерь, в то время как цель VAE состоит из двух разных частей: реконструкция и дивергенция KL. Тем не менее, я хотел бы нарисовать / визуализировать, как эти две части развиваются во время обучения и разбить одну индивидуальную потерю на два уровня потерь:

Пример модели Keras:

enter image description here

Моя модель:

enter image description here

К сожалению, Keras просто выводит одно значение потерь в моем примере с несколькими потерями, как можно увидеть в моем примере Jupyter Notebook , где я реализовал оба подхода. Кто-нибудь знает, как получить значения за убыток, которые были добавлены add_loss? И, кроме того, как Keras рассчитывает значение единственного убытка при нескольких вызовах add_loss (Среднее / Сумма /...?)?

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Это действительно не поддерживается, и в настоящее время обсуждается в разных местах в Интернете. Решение может быть получено путем добавления ваших потерь снова в качестве отдельной метрики после этапа компиляции (также обсуждается здесь )

В результате получается что-то вроде этого (специально для VAE):

reconstruction_loss = mse(K.flatten(inputs), K.flatten(outputs))
kl_loss = beta*K.mean(- 0.5 * 1/latent_dim * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1))

model.add_loss(reconstruction_loss)
model.add_loss(kl_loss)
model.compile(optimizer='adam')

model.metrics_tensors.append(kl_loss)
model.metrics_names.append("kl_loss")

model.metrics_tensors.append(reconstruction_loss)
model.metrics_names.append("mse_loss")

Для меня это дает такой вывод:

Epoch 1/1
252/252 [==============================] - 23s 92ms/step - loss: 0.4336 - kl_loss: 0.0823 - mse_loss: 0.3513 - val_loss: 0.2624 - val_kl_loss: 0.0436 - val_mse_loss: 0.2188
0 голосов
/ 09 января 2019

Оказывается, что ответ не прямой, и, кроме того, Keras не поддерживает эту функцию из коробки. Тем не менее, я реализовал решение, в котором каждый уровень потерь выводит потери, а настраиваемая функция обратного вызова записывает их после каждой эпохи. Решение для моего многогранного примера можно найти здесь: https://gist.github.com/tik0/7c03ad11580ae0d69c326ac70b88f395

...