そのため、KerasでCNNとRNNを組み合わせる方法についての質問に悩まされました。質問を投稿している間、誰かがこれが問題に取り組む正しい方法であると私に指摘しました。どうやら、元のコードで見落としがあったため、自分の質問に答えました。
元の問題は次のとおりです。
入力として画像のシーケンスを持ち、CNNが個々の画像を「見て」おり、RNNに供給されるCNN出力のシーケンスを持つKerasでモデルをどのように作成しますか?
より明確にするために:
モデル1:単一の画像を見るCNN。
モデル2:モデル1のCNNの出力のシーケンスにあるRNN。
したがって、たとえば、CNNは5つの画像を表示し、CNNからのこの5つの出力のシーケンスはRNNに渡される必要があります。
入力データは次の形式です。
(number_of_images、幅、高さ、チャネル)=(4000、120、60、1)
この質問に対する答えは次のとおりです。
この単純化されたCNNモデルを見てみましょう。
cnn = Sequential()
cnn.add(Conv2D(16, (50, 50), input_shape=(120, 60, 1)))
cnn.add(Conv2D(16, (40, 40)))
cnn.add(Flatten()) # Not sure if this if the proper way to do this.
次に、この単純なRNNモデルがあります。
rnn = Sequential()
rnn = GRU(64, return_sequences=False, input_shape=(120, 60))
高密度ネットワークに接続する必要があります:
dense = Sequential()
dense.add(Dense(128))
dense.add(Dense(64))
dense.add(Dense(1)) # Model output
アクティベーション機能などは読みやすくするために省略されています。
あとは、これら3つのメインモデルを組み合わせるだけです。
main_input = Input(shape=(5, 120, 60, 1)) # Data has been reshaped to (800, 5, 120, 60, 1)
model = TimeDistributed(cnn)(main_input) # this should make the cnn 'run' 5 times?
model = rnn(model) # combine timedistributed cnn with rnn
model = dense(model) # add dense
そして最後に
final_model = Model(inputs=main_input, outputs=model)
final_model.compile...
final_model.fit...