VAE в tf2.0 выдает исключение SymbolicException при попытке обучения (подходит) - PullRequest
0 голосов
/ 05 августа 2020

Я пытался использовать https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py в качестве руководства, чтобы собрать простейший пример VAE в тензорном потоке 2. Мне удалось создать модель кодировщика и декодера и подключить их через сэмплер. ', который представляет собой трюк с повторной параметризацией VAE. Модель строится и компилируется нормально, но как только я пытаюсь соответствовать, она терпит неудачу с такими ошибками, как: _SymbolicException: Inputs to eager execution function cannot be Keras symbolic tensors, but found [<tf.Tensor 'z_log_sigma/BiasAdd_19:0' shape=(None, 2) dtype=float32>, <tf.Tensor 'z_mean/BiasAdd_19:0' shape=(None, 2) dtype=float32>]

Вот мой код в tf 2.3.0 - может кто-нибудь указать на мою ошибку ( с) здесь !! спасибо:

import tensorflow as tf
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.astype('float32')/255.
x_test = x_test.astype('float32')/255.

inter_dim = 64 # units in each dense layer
latent_dim = 2 # latent space dimensionality

# build encoder: image -> (mean, sigma) in latent space
input = tf.keras.Input(shape=(28,28,),name="encoder_input")
x = tf.keras.layers.Flatten()(input)
x = tf.keras.layers.Dense(inter_dim, activation="relu")(x)
z_mean = tf.keras.layers.Dense(latent_dim, name="z_mean")(x)
z_log_sigma = tf.keras.layers.Dense(latent_dim, name="z_log_sigma")(x) # log(sigma) of latent dist
encoder = tf.keras.Model(inputs=input, outputs=(z_mean,z_log_sigma),name="encoder")

# create sampling layer using a keras Lambda
def sampling(args):
  z1, z2 = args
  return z1 + tf.exp(0.5*z2) * tf.random.normal(shape=tf.shape(z1))
sampler = tf.keras.layers.Lambda(sampling)

# # construct a decoder
d_input = tf.keras.Input(shape=(latent_dim,),name="decoder_input") # dont need if connect straight to sample
y = tf.keras.layers.Dense(inter_dim, activation="relu")(d_input)
y = tf.keras.layers.Dense(784, activation="sigmoid")(y)
output = tf.keras.layers.Reshape(target_shape=(28,28,))(y) # unflatten
decoder = tf.keras.Model(inputs=d_input, outputs=output,name="decoder")

# build the full vae model
vae_input = tf.keras.Input(shape=(28,28,),name="vae_input")
vae_output = decoder( sampler( encoder(vae_input) ) )
m = tf.keras.Model(inputs=vae_input,outputs=vae_output)
#tf.keras.utils.plot_model(m, show_shapes=True, expand_nested=True)

def vae_loss(y_true, y_pred):
  xent_loss = tf.keras.losses.BinaryCrossentropy()(y_true,y_pred)
  kl_loss = -0.5 * tf.reduce_mean( 1 + z_log_sigma - tf.square(z_mean) - tf.exp(z_log_sigma), axis=-1 )
  return xent_loss + kl_loss

m.compile(optimizer='adam',loss=vae_loss)
m.fit(x_train, x_train, epochs=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...