Вывести несколько потерь, добавленных add_loss в Keras

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

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

Моя модель:

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

1 ответ

Я использую Keras версии 2.2.4-tf, и приведенное выше решение у меня не сработало. Вот решение, которое я нашел (продолжить пример из dumkar):

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.add_metric(kl_loss, name='kl_loss', aggregation='mean')
model.add_metric(reconstruction_loss, name='mse_loss', aggregation='mean')

Надеюсь, это поможет тебе.

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

В результате получается что-то вроде этого (специально для 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

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

Другие вопросы по тегам