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?
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. –
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
Ich meine nicht eine TimeDistributed Conv1D, ich meine nur ein Conv1D. –