Пример вариационного автоэнкодера Keras - использование скрытого ввода - PullRequest
0 голосов
/ 29 мая 2018

Я новичок в Keras и пытаюсь понять, как использовать переменную z в примере вариационного автоэнкодера в официальном github .Я не понимаю, почему z не используется вместо переменной latent_inputs.Я запустил код, и он, кажется, работает, но я не понимаю, используется ли z за кулисами и какой механизм в Keras отвечает за это.Вот соответствующий фрагмент кода:

# VAE model = encoder + decoder
# build encoder model
inputs = Input(shape=input_shape, name='encoder_input')
x = Dense(intermediate_dim, activation='relu')(inputs)
z_mean = Dense(latent_dim, name='z_mean')(x)
z_log_var = Dense(latent_dim, name='z_log_var')(x)

# use reparameterization trick to push the sampling out as input
# note that "output_shape" isn't necessary with the TensorFlow backend
z = Lambda(sampling, output_shape=(latent_dim,), name='z')([z_mean, z_log_var])

# instantiate encoder model
encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder')
encoder.summary()
plot_model(encoder, to_file='vae_mlp_encoder.png', show_shapes=True)

# build decoder model
latent_inputs = Input(shape=(latent_dim,), name='z_sampling')
x = Dense(intermediate_dim, activation='relu')(latent_inputs)
outputs = Dense(original_dim, activation='sigmoid')(x)

# instantiate decoder model
decoder = Model(latent_inputs, outputs, name='decoder')
decoder.summary()
plot_model(decoder, to_file='vae_mlp_decoder.png', show_shapes=True)

# instantiate VAE model
outputs = decoder(encoder(inputs)[2])
vae = Model(inputs, outputs, name='vae_mlp')

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Они просто определяют отдельно кодер и декодер, чтобы их можно было использовать по отдельности:

  • Для некоторых inputs, encoder вычисляет их скрытые векторы / нижние представления z_mean, z_log_var, z (вы можете использовать encoder отдельно, например, для хранения этих низкоразмерных представлений или для более простого сравнения).

  • Учитывая такое низкоразмерное представление latent_inputs,decoder возвращает декодированную информацию outputs (например, если вам необходимо повторно использовать сохраненные нижние представления).

Для обучения / использования полного VAE обе ​​операции могут быть просто соединены в цепочку.как они на самом деле делают: outputs = decoder(encoder(inputs)[2]) (latent_inputs из decoder, получая z вывод encoder).

0 голосов
/ 29 мая 2018

Ваш encoder определяется как модель, которая принимает входные данные inputs и выдает выходные данные [z_mean, z_log_var, z].Затем вы определяете свой декодер отдельно для получения некоторого ввода, здесь называемого latent_inputs, и вывода outputs.Наконец, ваша общая модель определяется в строке, которая гласит:

outputs = decoder(encoder(inputs)[2])

Это означает, что вы собираетесь запустить encoder на вашем inputs, что дает [z_mean, z_log_var, z], а затем третий элементэто (назовите это result[2]) передается в качестве входного аргумента decoder.Другими словами, когда вы внедряете свою сеть, вы устанавливаете latent_inputs равным третьему выходу вашего кодера или [z_mean, z_log_var, z][2] = z.Вы можете просмотреть его как (вероятно, не правильный код):

encoder_outputs = encoder(inputs)  # [z_mean, z_log_var, z]
outputs = decoder(latent_inputs=encoder_outputs[2])  # latent_inputs = z
...