目前,我正在尝试将CNN与LSTM模型结合使用以进行视频分类,但是在Google和Stackoverflow上进行搜索后,我无法找到解决问题的方法
下面是整个代码:
#Importing libraries
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, LSTM, TimeDistributed
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import backend as K
#Shape of the image, based on 1920x1080
img_width, img_height = 224, 135
#Location of the frames split in a train and test folder
train_data_dir = './train'
validation_data_dir = './test'
#Data information
nb_train_samples = 46822
nb_validation_samples = 8994
timesteps = 1
epochs = 10
batch_size = 30
input_shape = (img_width, img_height, 3)
model = Sequential()
# define CNN model
model.add(TimeDistributed(Conv2D(132, (3, 3), input_shape=input_shape, activation='relu')))
model.add(TimeDistributed(MaxPooling2D(pool_size = (2, 2))))
model.add(TimeDistributed(Flatten()))
# define LSTM model
model.add(LSTM(132, return_sequences=True))
model.add(LSTM(132, return_sequences=True))
model.add(LSTM(132, return_sequences=True))
model.add(LSTM(132, return_sequences=True))
model.add(Dense(3, activation='softmax'))
model.build(input_shape)
model.summary()
model.compile(loss ='categorical_crossentropy', optimizer ='rmsprop', metrics =['accuracy'])
model.fit_generator(train_generator, steps_per_epoch = nb_train_samples // batch_size, epochs = epochs, validation_data = validation_generator, validation_steps = nb_validation_samples // batch_size)
train_datagen = ImageDataGenerator(rescale = 1. / 255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1. / 255)
train_generator = train_datagen.flow_from_directory(train_data_dir, target_size =(img_width, img_height), batch_size = batch_size, class_mode ='categorical')
validation_generator = test_datagen.flow_from_directory(validation_data_dir, target_size =(img_width, img_height), batch_size = batch_size, class_mode ='categorical')
运行此命令时发生的错误是:
回溯(最近通话最近):
中的文件“ CNNLSTM.py”,第36行 model.build(input_shape)
......
ValueError:输入张量必须具有等级4
我添加了 model.build(input_shape)以避免此错误:
ValueError:尚未构建此模型。首先通过调用build()或对一些数据调用fit()来构建模型。或在第一层中指定input_shape或batch_input_shape进行自动构建。
但是在代码中可见,我在模型的第一行中应用了 input_shape 。
希望这里有人可以指出我在做错什么。
答案 0 :(得分:1)
您会在错误消息model.build
中看到,期望输入为4D张量,而输入形状为input_shape = (img_width, img_height, 3)
3D。 Tensorflow通常期望以以下形状输入:(N,H,W,C),其中N是批处理大小,H和W分别是高度和宽度,C是通道数。如果只有一张图像,则可以将输入形状更改为input_shape = (1, img_width, img_height, 3)
,但通常处理一批图像会更有效。
答案 1 :(得分:1)
您应该考虑三点:
您提到您正在对视频进行分类。因此,模型的输入是一组图像/帧。因此,输入形状(即一个样本的形状)为:
input_shape = (n_frames, img_width, img_height, 3)
模型的第一层是TimeDistributed
包装器,它包装了Conv2D
层。因此,您必须为此层设置input_shape
自变量:
model.add(TimeDistributed(Conv2D(132, (3, 3), activation='relu'), input_shape=input_shape))
build
方法将批处理形状作为参数,而不是单个输入样本的形状。因此,您应该写:
model.build((None,) + input_shape)
但是,如果您解决了#2点,则根本不需要调用build
方法。