2016-05-31 1 views
2

私の入力は、8500のビデオシリーズです。各ビデオはLSTMに一連の50フレームとして供給され、各フレームは960ピクセルを有する。 入力ディメンションは8500,50,960です 可能な出力クラスは487ありますので、出力ディメンションは8500,487です。ケラスで互換性のない密なレイヤーエラー

しかし、次のコードを実行すると、これらのエラーがケラスで発生しています。

ご協力いただきまして誠にありがとうございます。ありがとう!モデルを作成

(8500、50、960)

(8500、487)

..第一の層を追加

..第二の層を追加

..

出力レイヤを追加する。

トレースバック(最新のコールラスト):

model.add(高密度(487、活性化= 'ソフトマックス'))

ファイル「/ユーザ/ TEMPにファイル "/Users/temp/PycharmProjects/detect_sport_video/build_model.py"、ライン68、 /anaconda/lib/python2.7/site-packages/Keras-1.0.3-py2.7.egg/keras/models.py "、行146、追加 output_tensor = layer(self.outputs [0])

ファイル "/Users/temp/anaconda/lib/python2.7/site-packages/Keras-1.0.3-py2.7.egg/keras/engine/topology.py"、ライン441、 self.assert_input_compatibility(x)

ファイル "/Users/temp/anaconda/lib/python2.7/site-packages/Keras-1.0.3-py2.7.egg/keras/engine/topology.py"、382行目、assert_input_compatibility 文字列(K.ndimは、(X)))

例外:入力0層dense_1と互換性がありません。私は後model.output_shapeを印刷しようと予想さndim = 2、また、= 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) 

をndim見出さすべてのLSTMレイヤーを追加すると、出力は(None、50、200)ですが、(None、200)だったはずです。問題がどこにあるか。しかし、なぜ私は知りません(なし、50,200)。何か案は?

答えて

4

プリント( "第二の層を追加..") model.add(LSTM(100、return_sequences =偽))

+0

はい、あなたは、第二LSTM層でreturn_sequences = Falseを置く必要があります。 – pedrobisp

+0

又は出力層TimeDistributedLayer 'プリント( "...第二の層を追加する") model.add(LSTM(100、return_sequences = TRUE)) プリント( "追加出力層...") モデルを作ります。 add(TimeDistributed(Dense(487、activation = "softmax"))) ' – Lorrit

関連する問題