KerasでDeep Learningを実装するために以下のようなコードを書いたのですが、以下のようにエラーが出てしまい、学習を実行できません。
おそらくvision_model.add(Dense(encoded_dim))
の部分でエラーが発生しているのですが、どう対処すれば以下のエラーを回避できるのかわかりません。
上のDense
を用いて畳み込まれた画像を一次元ベクトルにすることを前提とした上で、このエラーを回避するにはどのようなpythonコードを書くのが良いのでしょうか?
ご教授いただけると助かります。
※似たような英語版stack overflow内の質問として以下のものがありました。
https://stackoverflow.com/questions/45043332/keras-vgg16-matrix-size-incompatible-in0-16-18432-in1-25088-4096
コード
#latent_dim = 128でmax_len = 10 として設定しています。
reshape = Reshape((latent_dim, max_len, -1))(lstm_1_outputs)
#データのフォーマットはchannels_lastを想定している。
# now: model.output_shape == (None, latent_dim, max_len, 1)
#CNNのカーネル
#kernel_height=128
kernel_height=16
kernel_width=3
#kernel_height*kernel_width
# 入力: サイズがlatent_dimxmax_lenで1チャンネルをもつ画像 -> (latent_dim, max_len, 1) のテンソル
# それぞれのlayerで(kernel_height, kernel_width)の畳み込み処理を適用している
# First, let's define a vision model using a Sequential model.
# This model will encode an image into a vector.
#形がどう変遷していくのか理解していない...。
vision_model = Sequential()
vision_model.add(Conv2D(32, (kernel_height, kernel_width), activation='relu', input_shape=(latent_dim, max_len, 1)))
vision_model.add(Conv2D(32, (kernel_height, kernel_width), activation='relu'))
vision_model.add(MaxPooling2D(pool_size=(2, 2)))
vision_model.add(Dropout(0.25))
#vision_model.add(Conv2D(64, (kernel_height, kernel_width), activation='relu'))#shapeに関するエラーがでる...。
#vision_model.add(Conv2D(64, (kernel_height, kernel_width), activation='relu'))
#vision_model.add(MaxPooling2D(pool_size=(2, 2)))
#vision_model.add(Dropout(0.25))
vision_model.add(Flatten())
#encode_dimはvision_modelが出力するベクトルの次元を表す。
encoded_dim=256
vision_model.add(Dense(encoded_dim)) #ここでエラーが出ている...?
#上で定義したvision_modelの適用
encoded_image = vision_model(reshape)
エラー
Using TensorFlow backend.
Train on 2729129 samples, validate on 682283 samples
Epoch 1/1
Traceback (most recent call last):
File "pre_research2.py", line 235, in <module>
validation_split=0.2)
File "/home/firebird555/.pyenv/versions/3.6.6/lib/python3.6/site-packages/keras/engine/training.py", line 1039, in fit
validation_steps=validation_steps)
File "/home/firebird555/.pyenv/versions/3.6.6/lib/python3.6/site-packages/keras/engine/training_arrays.py", line 199, in fit_loop
outs = f(ins_batch)
File "/home/firebird555/.pyenv/versions/3.6.6/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 2715, in __call__
return self._call(inputs)
File "/home/firebird555/.pyenv/versions/3.6.6/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 2675, in _call
fetched = self._callable_fn(*array_vals)
File "/home/firebird555/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1399, in __call__
run_metadata_ptr)
File "/home/firebird555/.pyenv/versions/3.6.6/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py", line 526, in __exit__
c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Matrix size-incompatible: In[0]: [32,4704], In[1]: [10848,256]
[[{{node sequential_1/dense_1/MatMul}} = MatMul[T=DT_FLOAT, _class=["loc:@training/RMSprop/gradients/sequential_1/dense_1/MatMul_grad/MatMul"], transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/device:GPU:0"](sequential_1/flatten_1/Reshape, dense_1/kernel/read)]]
[[{{node loss/mul/_139}} = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_1875_loss/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]