Я использую вариационный автоэнкодер для восстановления изображений в tenorflow 2.0 с API Keras. Архитектура моей модели выглядит так: ![enter image description here](https://i.stack.imgur.com/ZCnFe.png)
Лямбда-слой использует функцию для выборки из нормального распределения, которое выглядит так:
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](https://i.stack.imgur.com/V7hXu.png)
Фон имеет значение 0 и круг значение выбирается из равномерного распределения между -1 и 1, например, 0,987 для всех пикселей круга.
Когда я тренируюсь с этой конфигурацией, я получаю следующую потерю.
![enter image description here](https://i.stack.imgur.com/U3hqh.png)
Расхождение KL имеет величину 1e-8, тогда как потери MSE остаются на уровне 0,101.
И я всегда получаю та же самая реконструкция, независимо от входного сигнала, который представляет собой изображение с постоянной интенсивностью пикселей
![enter image description here](https://i.stack.imgur.com/GVii0.png)
Теперь, если я умножу все входные изображения на 500 ( Например, фон остается нулевым, значения окружностей пикселей равномерно распределены в диапазоне (-500, 500)), сеть чудесным образом начинает учиться.
![enter image description here](https://i.stack.imgur.com/ztjTL.png)
с потерей величины 50 KL и потерей величины MSE 250 (последние эпохи)
И реконструкция изображения работает хорошо. В основном, MSE metri c является высоким, но контур круга расположен в нужном месте.
![enter image description here](https://i.stack.imgur.com/CkrYb.png)
Мой вопрос такой: почему сеть не может восстановить изображения в диапазоне (-1,1), но делает это в диапазон (-500, 500)?
Точность машины установлена на float32.
Я использовал многочисленные скорости обучения, например, 0,00001, но это не решает проблему. Я также тренировался для многих эпох, например, 200, но до сих пор нет результатов.