2017-11-24 3 views
0

Die Daten sind 10 Videos zu bauen und jeweils Videos aufgeteilt in 86 Rahmen und jeder Rahmen hat 28 * 28 Pixel,Verwenden Keras (TensorFlow) eine Conv2D + LSTM Modell

video_num = 10 
frame_num = 86 
pixel_num = 28*28 

Ich möchte Conv2D + LSDM verwenden das Modell und an jedem time_steps (= frame_num = 86) senden und die Pixel-Daten (= INPUT_SIZE = 28 * 28) in der model.So folgende ist mein Code über das Modell

BATCH_SIZE = 2 (just try) 
TIME_STEPS=frame_num (=86) 
INPUT_SIZE=pixel_num (=28*28) 

model = Sequential() 
model.add(InputLayer(batch_input_shape=(BATCH_SIZE, TIME_STEPS,  
INPUT_SIZE))) 
print (model.output_shape) 

model.add(TimeDistributed(Conv2D(64,(1,3),strides=(1,1), padding='same', 
data_format='channels_last'))) ##always the error here 
print (model.output_shape) 

model.add(TimeDistributed(MaxPooling2D(pool_size=(2,2),padding='same'))) 
print (model.output_shape) 

model.add(TimeDistributed(Conv2D(64,(1,3),strides=(1,1), 
data_format='channels_last', padding='same'))) 
print (model.output_shape) 

model.add(TimeDistributed(MaxPooling2D(pool_size=(2,2),padding='same'))) 
print (model.output_shape) 

model.add(TimeDistributed(Flatten())) 
print (model.output_shape) 

model.add(TimeDistributed(Dense(4096, activation='relu'))) 
print (model.output_shape) 

model.add(LSTM(100, stateful=True, return_sequences=True)) 
print (model.output_shape) 

model.add(Dense(1, activation='sigmoid')) 
print (model.output_shape) 

die folgende Abbildung zu bauen zeigt den Fehler von der Befehlszeile

https://imgur.com/a/yAPQO sagt „Listenindex außerhalb des zulässigen Bereichs“

Ich denke, dass Fehler über die Eingabeform in TimeDistributed ist(), die die Eingabe von der oberen Schicht wird (InputLayer()), aber ich habe keine Ahnung, wie das beheben Error. Ich habe versucht, die InputLayer(), zu entfernen und

TimeDistributed(Conv2D(...), input_shape=(TIME_STEPS, INPUT_SIZE)) 

als erste Schicht verwendet werden, sondern auch die gleichen Fehler ...

Wenn jemand über diesen Fehler wissen, geben Sie bitte Ihre Idee teilen, Ich werde sehr dankbar sein. Außerdem habe ich den Unterschied zwischen Batch_input_shape und input_shape noch nicht klar gemacht. Hat jemand diese beiden schon mal benutzt? Danke.

Antwort

0

A Conv2D Schicht erfordert vier Dimensionen, nicht drei:

  • (batch_size, height, width, channels).

Und die TimeDistributed eine zusätzliche Dimension erfordern:

  • (batch_size, frames, height, width, channels)

Also, wenn Sie wirklich mit TimeDistributed + Conv2D zur Arbeit zu gehen, müssen Sie 5 Dimensionen. Ihre input_shape=(86,28,28,3), oder Ihre batch_input_shape=(batch_size,86,28,28,3), wo ich angenommen habe, Sie haben ein RGB-Video (3 Farbkanäle).

Normalerweise übergeben Sie einfach eine Eingabeform an die TimeDistributed.

model.add(TimeDistributed(Dense(....), input_shape=(86,28,28,3)) 

Sie werden im Falle der Verwendung von stateful=True LSTM der die batch_input_shape nur brauchen. Dann ersetzen Sie einfach die input_shape durch die batch_input_shape.


Beachten Sie, dass nur die Faltungs-2D-Ebenen Bilder in Höhe und Breite sehen. Wenn Sie die LSTMs hinzufügen, müssen Sie die Daten neu gestalten, um Höhe, Breite und Kanäle in eine einzige Dimension zu bringen.

Für eine Form (Rahmen, h, w, ch):

model.add(Reshape((frames,h*w*ch))) 

Und Sie sollten mit dieser LSTMs nicht verwenden TimeDistributed, nur mit den Faltungsschichten.

Ihr Ansatz der Verwendung model.add(TimeDistributed(Flatten())) ist in Ordnung, anstatt die Umformung.


Beachten Sie auch, dass Keras kürzlich implementierte eine ConvLSTM2D Schicht, die in Ihrem Fall nützlich sein könnten: https://keras.io/layers/recurrent/#convlstm2d

+0

Es funktioniert für mich !! Danke sooo viel! –

+0

Hier habe ich ein anderes Problem, wie meine Eingangsdaten in 5D Form zu machen, die auch die letzte Dimension "Kanal" –

+0

frame_all_train [VIDEO_COUNT] [frame_count] [pixel_height_count] [pixel_width_count] = frame [pixel_height_count, pixel_width_count] Ich kann machen formiere nur ein 4D-Formular mit meinen Daten, ich bin mir nicht sicher, wie ich eine weitere Dimension hinzufügen kann, weil ich nicht weiß, welchen Wert ich in die 5. Dimension legen soll ... –