数据为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之间的区别,有人以前使用过这两个吗?谢谢。
阿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
仅在使用stateful=True
LSTM的情况下才需要。然后,您只需将batch_input_shape替换为input_shape。
请注意,只有卷积2D图层才能看到高度和宽度方面的图像。添加LSTM时,将需要调整数据的形状以将高度,宽度和通道合并为一个维度。
对于形状(框架,h,w,ch):
model.add(Reshape((frames,h*w*ch)))
而且,您不应TimeDistributed
仅将这些LSTM与卷积层一起使用。
您的使用方法可以,model.add(TimeDistributed(Flatten()))
而不需要重塑。
还要注意,Keras最近实现了ConvLSTM2D
一层,这可能对您有用:https : //keras.io/layers/recurrent/#convlstm2d
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句