2017-06-12 1 views
2

Ich versuche, Conv2D-Schichten mit LSTM-Schichten auf Bildern zu kombinieren. Das Problem ist, dass die Conv2D-Schichten einen 4D-Tensor einschließlich der Anzahl der Kanäle als Eingabe verwenden und mein LSTM-Netzwerk einen 3D-Tensor benötigt.Kombinieren Faltungsschichten und LSTM-Schichten mit Sequenzen variabler Länge

Das Problem ist, dass ich Bucketing verwenden, so dass meine Eingänge keine vordefinierte Anzahl von Zeitschritten haben. Ich wollte so etwas tun:

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) 

Aber die Reshape-Schicht benötigt eine vollständig definierte Form. Gibt es eine Lösung für dieses Problem?

+0

Was ist "nb_features"? Sind Sie sicher, dass Sie eine Conv2D (Bsp .: 2D-Bild) anstelle einer Conv1D (Bsp .: einige var in time) wollen? --- PS: Verwenden Sie in den Shapes nicht "None" und verwenden Sie Tupel '(nb_features, 1)' anstelle von Listen. –

+0

In diesem Fall ist NB_Features die Höhe meiner Bilder, die konstant sein wird. Und ich bin mir sicher, ich möchte eine Conv2D auf dem gesamten Bild und nicht eine TimeDistributed Conv1D. Der Grund, warum ich None verwende, liegt darin, dass ich die Länge meiner Sequenz als variabel definieren muss. – Moi4167

+0

Ich meine nicht eine TimeDistributed Conv1D, ich meine nur ein Conv1D. –

Antwort

-1

Mein Vorschlag ist, dass Sie verwenden:

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) 

Dann können Sie entweder ein Masking Layer am Anfang verwenden (und Pad-Eingabedaten mit einem Dummy-Wert), oder können Sie viele numpy Chargen verwenden, jede Charge mit einer anderen Länge, ohne eine Maskierung oder Polsterung.

Verwandte Themen