2017-06-12 32 views
2

Conv2Dレイヤーと画像上のLSTMレイヤーを組み合わせようとしています。 問題は、Conv2Dレイヤーがチャンネル数を含む4Dテンソルを入力として受け取り、私のLSTMネットワークが3Dテンソルを必要とすることです。可変長シーケンスと畳み込みレイヤーとLSTMレイヤーの組み合わせ

問題はバケッティングを使用しているため、入力にあらかじめ定義されたタイムステップ数がないことです。私はそのようなことをしたかった:

input_data = Input(shape=[None, nb_features, 1]) 
cnn1 = Conv2D(nb_filters, kernel_size)(input_data) 
cnn2 = Conv2D(nb_filters, kernel_size)(cnn1) 
reshape = Reshape(target_shape=[None, nb_features])(cnn2) 
gru1 = Bidirectional(GRU(rnn_size, return_sequences=True))(reshape) 
gru2 = Bidirectional(GRU(rnn_size, return_sequences=True))(gru1) 
out = TimeDistributed(Dense(nblabels))(gru2) 
output = Activation('softmax')(out) 

しかし、変形層は完全に定義された形を必要とする。この問題の解決法はありますか?

+0

「nb_features」とは何ですか? Conv1Dの代わりにConv2D(例:2D画像)を使用してもよろしいですか? --- PS:図形に "None"を使わず、リストの代わりにタプル '(nb_features、1)'を使います。 –

+0

この場合、nb_featuresは画像の高さになりますが、これは一定です。そして、私はTimeDistributed Conv1Dではなく、画像全体にConv2Dが必要だと確信しています。私がNoneを使う理由は、シーケンスの長さを可変にする必要があるからです。 – Moi4167

+0

私はTimeDistributed Conv1Dを意味するものではなく、conv1Dを意味します。 –

答えて

-1

私の提案は、あなたが使用していることである。そして、あなたは(ダミーの値とし、パッド入力データ)先頭にMasking Layerを使用することができますいずれか

input_data = Input((None, nb_features)) 
cnn1 = Conv1D(nb_filters, kernel_size)(input_data) 
cnn2 = Conv1D(nb_filters, kernel_size)(cnn1) 

gru1 = Bidirectional(GRU(rnn_size, return_sequences=True))(cnn2) 
gru2 = Bidirectional(GRU(rnn_size, return_sequences=True))(gru1) 
out = TimeDistributed(Dense(nblabels))(gru2) 
output = Activation('softmax')(out) 

、またはあなたは、各バッチを多くのnumpyのバッチを使用することができます異なる長さで、マスキングまたはパッディングなしで。

関連する問題