Keras MSE metri c не работает после вызова model.add_loss () для VAE - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь заставить мой код работать. По сути, когда я запускаю следующую функцию run_vae_sim, моя функция построения графиков не работает, несмотря на то, что я добавляю свои метрики в Keras. У меня есть предыдущие примеры, где я использовал метрики MSE по умолчанию в Keras, но они не работают для модели VAE, которую я генерирую ниже. (Модель VAE основана на 100% по сравнению с примером Keras из: https://keras.io/examples/variational_autoencoder/)

Почему объект истории не включает "mean_squared_error"? Всякий раз, когда я распечатываю ключи для объекта истории, появляется только «val_loss» и «loss»; несмотря на то, что я добавляю его при компиляции своей модели.

---> 72     plt.plot(history.history['mean_squared_error'])
     73     plt.plot(history.history['val_mean_squared_error'])
     74     plt.title('Model Mean-Squared-Error %s SNR: %s' % (names[cnt_index], snr))

KeyError: 'mean_squared_error'

'def run_vae_sim (X_train, X_test, y_train, y_test, original_dim, interval_dim, batch_size, latent_dim, epochs, use_mse = True):

# network parameters
input_shape = (original_dim, )

print('input_shape', input_shape)

# VAE model = encoder + decoder
# build encoder model
inputs = Input(shape=input_shape, name='encoder_input')
print('input_shape', input_shape)
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')

# VAE loss = mse_loss or xent_loss + kl_loss
if use_mse:
    reconstruction_loss = mse(inputs, outputs)
else:
    reconstruction_loss = binary_crossentropy(inputs,
                                              outputs)
models = (encoder,decoder)
data = (X_test, y_test)
reconstruction_loss *= original_dim
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
vae_loss = K.mean(reconstruction_loss + kl_loss)
vae.add_loss(vae_loss)
vae.compile(optimizer=Adam, metrics=['mse', 'mean_squared_error'])
vae.summary()

plot_model(vae,
           to_file='vae_mlp.png',
           show_shapes=True)

history = vae.fit(X_train,
        epochs=epochs,
        batch_size=batch_size,
        validation_data=(X_test, None))
    #vae.save_weights('vae_mlp_mnist.h5')

fig = plt.figure()
ax = plt.gca()

ax.set_ylim(0, 1)
print('history:', history.history.keys())
plt.plot(history.history['mean_squared_error'])
plt.plot(history.history['val_mean_squared_error'])
plt.title('Model Mean-Squared-Error %s SNR: %s' % (names[cnt_index], snr))
plt.ylabel('MSE')
plt.xlabel('Epoch')
plt.legend(['MSE', 'Validation MSE'], loc = 'upper left')
plt.show()

`

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