2017-06-12 25 views
2

我試圖將Conv2D圖層與圖像上的LSTM圖層相結合。 問題在於Conv2D圖層需要輸入包括通道數量的4D張量,而我的LSTM網絡需要3D張量。將卷積圖層和LSTM圖層與可變長度序列相結合

問題是我使用bucketing,所以我的輸入沒有預定義的時間步數。我想這樣做:

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」?你確定你想要一個Conv2D(例如:2D圖像)而不是Conv1D(例如:一些時間變量)嗎? --- PS:不要在形狀中使用「無」,並使用元組''(nb_features,1)'而不是列表。 –

+0

在這種情況下,nb_features將是我的圖像的高度,這將是恆定的。我確定我想在整個圖像上使用Conv2D,而不是TimeDistributed Conv1D。我使用None的原因是因爲我需要我的序列長度是可變的。 – Moi4167

+0

我不是指TimeDistributed Conv1D,我的意思是一個conv1D。 –

回答

-1

我的建議是,你使用:

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) 

那麼您可以使用在開始時Masking Layer(和墊虛值,輸入數據),或者您可以使用許多numpy的批次,每批具有不同的長度,沒有掩蔽或填充。