Я адаптирую эту реализацию VAE https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py, который я нашел здесь https://blog.keras.io/building-autoencoders-in-keras.html
Эта реализация не использует сверточные слои, так что все происходит, так сказать, в 1D. Моя цель - реализовать трехмерные сверточные слои в этой модели.
Однако я сталкиваюсь с несоответствием формы в функции потерь при запуске партий (которые состоят из 128 образцов):
def vae_loss(self, x, x_decoded_mean):
xent_loss = original_dim * metrics.binary_crossentropy(x, x_decoded_mean)
#xent_loss.shape >> [128, 40, 20, 40, 1]
kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
#kl_loss.shape >> [128]
return K.mean(xent_loss + kl_loss) # >> error shape mismatch
Здесь уже дан ответ почти на тот же вопрос Keras - несовместимая форма вариационного автоэнкодера для модель с одномерными сверточными слоями, но я не могу понять, как экстраполировать ответ на мой случай с более сложной формой ввода.
Я пробовал это решение:
xent_loss = original_dim * metrics.binary_crossentropy(K.flatten(x), K.flatten(x_decoded_mean))
Но я не знаю, верное ли это решение с математической точки зрения, хотя сейчас модель работает.