著書「実践GAN 敵対的生成ネットワークによる深層学習」p.33以降にあるコード(以下にコード内容を掲載)を用いて訓練させようとするとエラーが発生します。
<エラー内容>
----> vae.fit(x_train, x_train, shuffle=True, epochs=epochs, batch_size=batch_size) TypeError: Cannot convert a symbolic Keras input/output to a numpy array. This error may indicate that you're trying to pass a symbolic value to a NumPy call, which is not supported. Or, you may be trying to pass Keras symbolic inputs/outputs to a TF API that does not register dispatching, preventing Keras from automatically converting the API call to a lambda layer in the Functional Model.
※コード内容についてはこちらでも確認可能ですが、本質問文の最下部にも掲載します。
環境としてはjupyter notebook、 Google Colaboratoryどちらで行っても同様のエラー文が出ました。
エラー内容を翻訳すると以下の内容であることが分かりましたが、コードもコピペしても同様のエラー文が出てきてしまい解決策がわかりません。
そもそもこのエラー文の内容をどのように解釈すれば良いかも分からないため、このエラー文が出るおおよその理由についてご存知の方がいれば是非ご教示のほどお願いします。
TypeError:シンボリックKeras入力/出力をnumpy配列に変換できません。このエラーは、サポートされていないNumPy呼び出しにシンボリック値を渡そうとしていることを示している可能性があります。または、Kerasシンボリック入力/出力をディスパッチを登録しないTF APIに渡そうとして、KerasがAPI呼び出しを機能モデルのラムダレイヤーに自動的に変換できないようにしている可能性があります。
また、本コードが掲載された書籍(上記に記載の書籍です)は2020年2月26日に発行されており、2020年5月にはKerasがtf.kerasに統一されたようなお話も拝見しました。(参考記事はこちら)
そのため、試しに初めのimport文で書かれたkeras導入部分を全てtf.kerasに変えてもみましたが、同様のエラー文が出るだけで何も変化がありません。
どうかご教示のほどお願いします。
<コード内容>
rom __future__ import print_function import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm import tensorflow as tf from keras.layers import Input, Dense, Lambda, Reshape from keras.models import Model from keras import backend as K from keras import metrics from keras.datasets import mnist # defining the key parameters batch_size = 100 original_dim = 784 latent_dim = 2 intermediate_dim = 256 epochs = 50 epsilon_std = 1.0 def sampling(args: tuple): # we grab the variables from the tuple z_mean, z_log_var = args epsilon = K.random_normal(shape=(K.shape(z_mean)[0], latent_dim), mean=0., stddev=epsilon_std) return z_mean + K.exp(z_log_var / 2) * epsilon # input to our encoder x = Input(shape=(original_dim,), name="input") # intermediate layer h = Dense(intermediate_dim, activation='relu', name="encoding")(x) # defining the mean of the latent space z_mean = Dense(latent_dim, name="mean")(h) # defining the log variance of the latent space z_log_var = Dense(latent_dim, name="log-variance")(h) # note that "output_shape" isn't necessary with the TensorFlow backend z = Lambda(sampling, output_shape=(latent_dim,))([z_mean, z_log_var]) # defining the encoder as a keras model encoder = Model(x, [z_mean, z_log_var, z], name="encoder") # print out summary of what we just did encoder.summary() # Input to the decoder input_decoder = Input(shape=(latent_dim,), name="decoder_input") # taking the latent space to intermediate dimension decoder_h = Dense(intermediate_dim, activation='relu', name="decoder_h")(input_decoder) # getting the mean from the original dimension x_decoded = Dense(original_dim, activation='sigmoid', name="flat_decoded")(decoder_h) # defining the decoder as a keras model decoder = Model(input_decoder, x_decoded, name="decoder") decoder.summary() # grab the output. Recall, that we need to grab the 3rd element our sampling z output_combined = decoder(encoder(x)[2]) # link the input and the overall output vae = Model(x, output_combined) # print out what the overall model looks like vae.summary() def vae_loss(x: tf.Tensor, x_decoded_mean: tf.Tensor, z_log_var=z_log_var, z_mean=z_mean, original_dim=original_dim): xent_loss = original_dim * metrics.binary_crossentropy(x, x_decoded_mean) kl_loss = - 0.5 * K.sum( 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1) vae_loss = K.mean(xent_loss + kl_loss) return vae_loss vae.compile(optimizer='rmsprop', loss=vae_loss) vae.summary() (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:]))) x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:]))) vae.fit(x_train, x_train, shuffle=True, epochs=epochs, batch_size=batch_size)
回答1件
あなたの回答
tips
プレビュー