Kerasを使ったディープラーニングのモデルにおいて、画像からの出力と日本語のデータをマージしてLSTMに入力したいので、keras.layersのConcatenateを使ったら、どうも配列のサイズが変わってしまうようでした。エラーメッセージは次のとおりです。
ValueError: Dimension 0 in both shapes must be equal, but are 200 and 1. Shapes are [200] and [1]. for 'concatenate_1/concat_1' (op: 'ConcatV2') with input shapes: [?,1,200], [?,63,1], [] and with computed input tensors: input[2] = <1>.
元々、画像からの出力shapeが(None, 1, 200)で、日本語の分散表現のshapeが(None, 63, 200)になっています。従いまして、Concatenateを使うと日本語の分散表現のshapeが(None, 63, 1)になってしまうということになります。
該当箇所のソースコードは次のとおりです。
def define_model(vocab_size, max_length): # 画像の特徴を入力するレイヤ inputs1 = Input(shape=(4096,)) fe1 = Dropout(0.5)(inputs1) fe2 = Dense(200, activation='relu')(fe1) fe3 = K.expand_dims(fe2, axis=1) # 文章を入力するレイヤ inputs2 = Input(shape=(max_length,)) se1 = Embedding(vocab_size, embedding_dim, weights=[embedding_matrix], trainable=False, mask_zero=True)(inputs2) # 上の二つを結合する部分 se2 = Concatenate(axis=1)([fe3, se1]) se3 = LSTM(200)(se2) decoder2 = Dense(200, activation='relu')(se3) outputs = Dense(vocab_size, activation='softmax')(decoder2) # モデルの定義.二つを入力にとって一つを出力する形になる model = Model(inputs=[inputs1, inputs2], outputs=outputs) model.compile(loss='categorical_crossentropy', optimizer='adam') model.summary() return model
ちなみにembedding_dimは200に設定しています。
どこか間違っていますでしょうか。
どなたか詳しい方、ご教示願います。
環境
ubuntu:18.04
python:3.6.9
keras:2.4.3
tensorflow:2.3.1
あなたの回答
tips
プレビュー