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?
Ja, sollten Sie setzen return_sequences Falsch = in der zweiten LSTM Schicht. – pedrobisp
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