使用keras(TensorFlow)构建Conv2D + LSTM模型

时间:2017-11-24 09:42:31

标签: python keras lstm

数据是10个视频,每个视频分为86帧,每帧有28 * 28像素,

video_num = 10
frame_num = 86
pixel_num = 28*28

我想使用Conv2D + LSDM来构建模型,并且在每个time_steps(= frame_num = 86)发送模型中的像素数据(= INPUT_SIZE = 28 * 28)。所以以下是关于模型的代码

BATCH_SIZE = 2 (just try)
TIME_STEPS=frame_num (=86)
INPUT_SIZE=pixel_num (=28*28)

model = Sequential()
model.add(InputLayer(batch_input_shape=(BATCH_SIZE, TIME_STEPS,     
INPUT_SIZE)))
print (model.output_shape)

model.add(TimeDistributed(Conv2D(64,(1,3),strides=(1,1), padding='same', 
data_format='channels_last')))  ##always the error here
print (model.output_shape)

model.add(TimeDistributed(MaxPooling2D(pool_size=(2,2),padding='same')))
print (model.output_shape)

model.add(TimeDistributed(Conv2D(64,(1,3),strides=(1,1), 
data_format='channels_last', padding='same')))
print (model.output_shape)

model.add(TimeDistributed(MaxPooling2D(pool_size=(2,2),padding='same')))
print (model.output_shape)

model.add(TimeDistributed(Flatten()))
print (model.output_shape)

model.add(TimeDistributed(Dense(4096, activation='relu')))
print (model.output_shape)

model.add(LSTM(100, stateful=True, return_sequences=True))
print (model.output_shape)

model.add(Dense(1, activation='sigmoid'))
print (model.output_shape)

下图显示了命令行中的错误

https://imgur.com/a/yAPQO 说“列表索引超出范围”

我认为错误是关于TimeDistributed()中的输入形状,它从上层获取输入(InputLayer()),但我不知道如何修复错误。 我试图删除InputLayer(),并使用

TimeDistributed(Conv2D(...), input_shape=(TIME_STEPS, INPUT_SIZE))

作为第一层,但也得到同样的错误......

如果有人知道这个错误,请分享您的想法,我将非常感谢。另外,我仍然不太清楚batch_input_shape和input_shape之间的区别,有没有人之前使用过这两个? 感谢。

1 个答案:

答案 0 :(得分:7)

Conv2D图层需要四个维度,而不是三个维度:

  • (batch_size, height, width, channels)

TimeDistributed需要额外维度:

  • (batch_size, frames, height, width, channels)

因此,如果您真的要使用TimeDistributed + Conv2D,则需要5个维度。您的input_shape=(86,28,28,3)batch_input_shape=(batch_size,86,28,28,3),我认为您有一个RGB视频(3个颜色通道)。

通常,您只需将输入形状传递给TimeDistributed

model.add(TimeDistributed(Dense(....), input_shape=(86,28,28,3))

仅在使用batch_input_shape LSTM的情况下才需要stateful=True。然后,您只需将batch_shape替换为batch_input_shape。

请注意,只有卷积2D图层会根据高度和宽度看到图像。添加LSTM时,您需要重新整形数据以将高度,宽度和通道整合到一个维度中。

对于形状(frames,h,w,ch):

model.add(Reshape((frames,h*w*ch)))

你不应该TimeDistributed使用这些LSTM,只能使用卷积层。

您使用model.add(TimeDistributed(Flatten()))的方法是正确的,而不是重塑。

另请注意,Keras最近实施了ConvLSTM2D图层,这可能对您的情况有用:https://keras.io/layers/recurrent/#convlstm2d