VAE в Керасе: как определить сквозную модель? - PullRequest
0 голосов
/ 11 ноября 2018

Я изучаю учебник здесь. Моя модель часть:

input_img = keras.Input(shape=img_shape)

x = layers.Conv2D(32, (3, 3),
                  padding='same', activation='relu')(input_img)

...
x = layers.Conv2D(64, (3, 3),
                  padding='same', activation='relu')(x)
shape_before_flattening = K.int_shape(x)

x = layers.Flatten()(x)
x = layers.Dense(32, activation='relu')(x)

z_mean = layers.Dense(latent_dim)(x)
z_log_var = layers.Dense(latent_dim)(x)

def sampling(args):
    ...

z = layers.Lambda(sampling)([z_mean, z_log_var])

decoder_input = layers.Input(K.int_shape(z)[1:])

x = layers.Dense(np.prod(shape_before_flattening[1:]),
                 activation='relu')(decoder_input)

x = layers.Reshape(shape_before_flattening[1:])(x)

x = layers.Conv2DTranspose(32, 3,
                           padding='same', activation='relu',
                           strides=(2, 2))(x)
x = layers.Conv2D(1, 3,
                  padding='same', activation='sigmoid')(x)

# This is our decoder model from letent space to reconstructed images
decoder = Model(decoder_input, x)

# We then apply it to `z` to recover the decoded `z`.
z_decoded = decoder(z)

def vae_loss(self, x, z_decoded):
    ...


# Fit the end-to-end model
vae = Model(input_img, z_decoded) # vae = Model(input_img, x)
vae.compile(optimizer='rmsprop', loss=vae_loss)
vae.summary()

Мой вопрос: сквозной является vae = Model(input_img, z_decoded) или vae = Model(input_img, x). Должны ли мы вычислять потери на input_img и z_decoded ИЛИ между input_img и x? Спасибо

1 Ответ

0 голосов
/ 11 ноября 2018

x изменяется по всей модели, где x = layers.Conv2D(1, 3,padding='same', activation='sigmoid')(x) вы устанавливаете x как последний слой вашей модели декодера.

При выполнении z_decoded = decoder(z) вы цепляете свой декодер сразу после кодера, z_decoded фактически является выходным слоем вашего декодера, таким образом, тот же x, что и ранее. Кроме того, вы создаете связь между фактическим вводом и выводом.

Расчет потерь даст одинаковые результаты для обоих (так как они оба представляют один и тот же слой).
Короче говоря - и vae = Model(input_img, z_decoded), и vae = Model(input_img, x) являются сквозной моделью, я бы предложил использовать версию z_decoded для удобства чтения.

...