keras中不兼容的致密层错误
Incompatible dense layer error in keras
我的输入是一系列视频,数量为 8500。每个视频作为一系列 50 帧馈送到 LSTM,每个帧有 960 个像素。
所以输入暗淡是 8500,50,960
有 487 种可能的输出 类 可能,所以输出维度是 8500,487.
但是当我 运行 以下代码时,我在 keras 中遇到了这些错误。
非常感谢任何帮助。谢谢!
(8500, 50, 960)
(8500, 487)
正在创建模型..
添加第一层..
添加第二层..
正在添加输出层..
追溯(最近调用最后):
文件“/Users/temp/PycharmProjects/detect_sport_video/build_model.py”,第 68 行,在
model.add(密集(487, 激活='softmax'))
文件“/Users/temp/anaconda/lib/python2.7/site-packages/Keras-1.0.3-py2.7.egg/keras/models.py”,第 146 行,在添加
output_tensor = 图层(self.outputs[0])
文件“/Users/temp/anaconda/lib/python2.7/site-packages/Keras-1.0.3-py2.7.egg/keras/engine/topology.py”,第 441 行,在 call
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 不兼容:预期 ndim=2,发现 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)
此外,如果我尝试在添加每个 LSTM 层后打印 model.output_shape,我得到的输出是 (None, 50, 200) 但它应该是 (None ,200).这就是问题所在。但我不知道为什么会得到 (None,50,200)。有什么想法吗?
打印("Adding second layer..")
model.add(LSTM(100, return_sequences=假))
我的输入是一系列视频,数量为 8500。每个视频作为一系列 50 帧馈送到 LSTM,每个帧有 960 个像素。 所以输入暗淡是 8500,50,960 有 487 种可能的输出 类 可能,所以输出维度是 8500,487.
但是当我 运行 以下代码时,我在 keras 中遇到了这些错误。
非常感谢任何帮助。谢谢!
(8500, 50, 960)
(8500, 487)
正在创建模型..
添加第一层..
添加第二层..
正在添加输出层..
追溯(最近调用最后):
文件“/Users/temp/PycharmProjects/detect_sport_video/build_model.py”,第 68 行,在 model.add(密集(487, 激活='softmax'))
文件“/Users/temp/anaconda/lib/python2.7/site-packages/Keras-1.0.3-py2.7.egg/keras/models.py”,第 146 行,在添加 output_tensor = 图层(self.outputs[0])
文件“/Users/temp/anaconda/lib/python2.7/site-packages/Keras-1.0.3-py2.7.egg/keras/engine/topology.py”,第 441 行,在 call 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 不兼容:预期 ndim=2,发现 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)
此外,如果我尝试在添加每个 LSTM 层后打印 model.output_shape,我得到的输出是 (None, 50, 200) 但它应该是 (None ,200).这就是问题所在。但我不知道为什么会得到 (None,50,200)。有什么想法吗?
打印("Adding second layer..") model.add(LSTM(100, return_sequences=假))