Вариационный автоэнкодер не может тренироваться с малыми входными значениями - PullRequest
0 голосов
/ 20 марта 2020

Я использую вариационный автоэнкодер для восстановления изображений в tenorflow 2.0 с API Keras. Архитектура моей модели выглядит так: enter image description here

Лямбда-слой использует функцию для выборки из нормального распределения, которое выглядит так:

def sampling(args):
    z_mean, z_log_var = args
    epsilon = K.random_normal(shape =(1,1,16))
    return z_mean + K.exp(0.5 * z_log_var) * epsilon

Мои гиперпараметры являются следующими:

epochs = 50
batch size =16
num_training = 1800
num_val = 100
num_test = 100
learning rate = 0.001
exponential decay = 0.9 * initial learning rate (calculated every 5 epochs)
optimizer = Adam
shuffle = True

Я использую следующую потерю:

    def vae_loss(y_pred, y_gt):
        mse_loss = mse(y_pred, y_gt)
        z_mean = model.get_layer('z_mean_layer').output
        z_log_var = model.get_layer('z_log_var_layer').output
        kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
        kl_loss = K.sum(kl_loss, axis=-1)
        kl_loss *= -0.5
        return K.mean(mse_loss + kl_loss)

Мои веса инициализируются по умолчанию: kernel_initializer = 'glorot_uniform', bias_initializer = 'zeros'.

Мои изображения наборов данных состоят из случайно расположенного круга, который выглядит следующим образом:

enter image description here

Фон имеет значение 0 и круг значение выбирается из равномерного распределения между -1 и 1, например, 0,987 для всех пикселей круга.

Когда я тренируюсь с этой конфигурацией, я получаю следующую потерю.

enter image description here

Расхождение KL имеет величину 1e-8, тогда как потери MSE остаются на уровне 0,101.

И я всегда получаю та же самая реконструкция, независимо от входного сигнала, который представляет собой изображение с постоянной интенсивностью пикселей

enter image description here

Теперь, если я умножу все входные изображения на 500 ( Например, фон остается нулевым, значения окружностей пикселей равномерно распределены в диапазоне (-500, 500)), сеть чудесным образом начинает учиться.

enter image description here

с потерей величины 50 KL и потерей величины MSE 250 (последние эпохи)

И реконструкция изображения работает хорошо. В основном, MSE metri c является высоким, но контур круга расположен в нужном месте.

enter image description here

Мой вопрос такой: почему сеть не может восстановить изображения в диапазоне (-1,1), но делает это в диапазон (-500, 500)?

Точность машины установлена ​​на float32.

Я использовал многочисленные скорости обучения, например, 0,00001, но это не решает проблему. Я также тренировался для многих эпох, например, 200, но до сих пор нет результатов.

1 Ответ

1 голос
/ 24 марта 2020

Как уже упоминалось в комментариях, вероятно, существует проблема с масштабированием потери. Ваша текущая реализация потерь MSE использует среднее значение квадратов различий (которое довольно мало). Вместо того, чтобы использовать среднее значение, попробуйте использовать сумму квадратов различий по вашему изображению. Keras VAE (https://keras.io/examples/variational_autoencoder/) делает это путем масштабирования вычисленной потери MSE с исходным размером изображения (в pytorch это может быть указано непосредственно https://github.com/pytorch/examples/blob/234bcff4a2d8480f156799e6b9baae06f7ddc96a/vae/main.py#L74).

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