2016-05-31 8 views
2

Meine Eingabe ist eine Reihe von Videos, 8500 an der Zahl. Jedes Video wird LSTM als eine Serie von 50 Rahmen zugeführt, wobei jeder Rahmen 960 Pixel aufweist. Also die Eingangsdim ist 8500,50,960 Es sind 487 mögliche Ausgabeklassen möglich, so dass die Ausgabedimension 8500,487 ist.Inkompatible dichte Schicht Fehler in Keras

Aber wenn ich den folgenden Code ausführen, bekomme ich diese Fehler in keras.

Jede Hilfe wird sehr geschätzt. Vielen Dank!

(8500, 50, 960)

(8500, 487)

Erstellen Modell ..

erste Schicht Hinzufügen ..

zweite Schicht Hinzufügen ..

Hinzufügen der Ausgabeschicht.

Traceback (letzter Anruf zuletzt):

File "/Users/temp/PycharmProjects/detect_sport_video/build_model.py", Zeile 68, in model.add (Dense (487, Aktivierung = 'softmax'))

Datei „/ Benutzer/temp /anaconda/lib/python2.7/site-packages/Keras-1.0.3-py2.7.egg/keras/models.py ", Zeile 146, dazu output_tensor = Schicht (self.outputs [0])

Datei "/Users/temp/anaconda/lib/python2.7/site-packages/Keras-1.0.3-py2.7.egg/keras/engine/topology.py", Zeile 441, in Anruf self.assert_input_compatibility (x)

Datei "/Users/temp/anaconda/lib/python2.7/site-packages/Keras-1.0.3-py2.7.egg/keras/engine/topology.py", Zeile 382, ​​in assert_input_compatibility str (K.ndim (x)))

Ausnahme: Eingang 0 ist unvereinbar mit Schicht dense_1: erwartet NDIM = 2, gefunden NDIM = 3

from keras.models import Sequential 
from keras.layers import LSTM, Dense 
import numpy as np 
from PIL import Image 
import os 

def atoi(video): 
    return int(video) if video.isdigit() else video 

def natural_keys(video): 
    return [ atoi(c) for c in os.path.splitext(video) ] 


input_data =np.zeros((8500,50,960)) 

video_index = 0 
data = 'train' 
video_list = sorted(os.listdir('/Users/temp/PycharmProjects/detect_sport_video/' + data + '_frame_resize1/')) 
video_list.sort(key=natural_keys) 


for video in video_list: 
    if video != '.DS_Store': 
     frame_index = 0 
     frame_list = sorted(os.listdir('/Users/temp/PycharmProjects/detect_sport_video/' + data + '_frame_resize1/' + video + '/')) 
     frame_list.sort(key=natural_keys) 
     for frame in frame_list: 
      image = np.asarray(Image.open('/Users/temp/PycharmProjects/detect_sport_video/' + data + '_frame_resize1/' + video + '/' + frame)) 
      image = image.reshape(image.shape[0] * image.shape[1],3) 
      image = (image[:,0] + image[:,1] + image[:,2])/3 
      image = image.reshape(len(image),1) 
      image = image[:960] 
      image = image.T 
      input_data[video_index][frame_index] = image 
      frame_index += 1 
     video_index += 1 

print input_data.shape 

cnt = 1 
output_classes = [] 
with open('/Users/temp/PycharmProjects/detect_sport_video/sports-1m-dataset/' + data + '_correct_links.txt') as input_file: 
while cnt <= 8500: 
     output_classes.append(int(input_file.readline().split()[2])) 
     cnt += 1 
output_data =np.zeros((8500,487)) 
output_index = 0 
while(output_index < 8500): 
    output_data[output_index,output_classes[output_index]] = 1 
    output_index += 1 

print output_data.shape 

print("Creating model..") 
model = Sequential() 
print("Adding first layer..") 
model.add(LSTM(100, return_sequences=True, 
       input_shape=(50, 960))) 

print("Adding second layer..") 
model.add(LSTM(100, return_sequences=True)) 

print("Adding output layer..") 
model.add(Dense(487, activation='softmax')) 

print "Compiling model.." 
model.compile(loss='categorical_crossentropy', 
       optimizer='RMSprop', 
       metrics=['accuracy']) 

print "Fitting model.." 
model.fit(input_data,output_data, 
      batch_size=50, nb_epoch=100) 

auch, wenn ich versuche, model.output_shape zu drucken, nachdem Hinzufügen jeder LSTM-Schicht ist die Ausgabe, die ich bekomme (None, 50, 200), aber es hätte sein sollen (None, 200). Das ist, wo das Problem ist. Aber ich weiß nicht, warum ich bekomme (Keine, 50.200). Irgendwelche Ideen?

Antwort

4

print ("zweite Schicht Hinzufügen ..") model.add (LSTM (100, return_sequences = False))

+0

Ja, sollten Sie setzen return_sequences Falsch = in der zweiten LSTM Schicht. – pedrobisp

+0

Oder machen Sie die Ausgabeschicht ein TimeDistributedLayer 'print (" Hinzufügen der zweiten Ebene ... ") model.add (LSTM (100, return_sequences = True)) drucken (" Hinzufügen der Ausgabeschicht ... ") Modell. add (TimeDistributed (Dichte (487, Aktivierung = "softmax"))) ' – Lorrit