步幅的长度应为1、1或3,但应为2

时间:2019-07-16 20:16:54

标签: keras conv-neural-network max-pooling

我一直在尝试将卷积神经网络与GRU堆叠在一起,以解决图像到文本的问题。 这是我的模特:

b4; first possible ans for 0,0:    1    abk: 874
after; first possible ans for 0,0: 1    abk: 874
b4; first possible ans for 0,0:    1    abk: 875
after; first possible ans for 0,0: 5    abk: 875
b4; first possible ans for 0,0:    5    abk: 876
after; first possible ans for 0,0: 5    abk: 876
b4; first possible ans for 0,0:    5    abk: 878
after; first possible ans for 0,0: 5    abk: 878
b4; first possible ans for 0,0:    5    abk: 880
after; first possible ans for 0,0: 5    abk: 880
b4; first possible ans for 0,0:    5    abk: 881
after; first possible ans for 0,0: 5    abk: 881
b4; first possible ans for 0,0:    8    abk: 882
after; first possible ans for 0,0: 8    abk: 882
b4; first possible ans for 0,0:    8    abk: 883
after; first possible ans for 0,0: 8    abk: 883

当我尝试拟合模型时,出现以下错误:

model=Sequential()

model.add(TimeDistributed(Conv2D(16,kernel_size 
(3,3),data_format="channels_last",input_shape= 
(129,80,564,3),padding='SAME',strides=(1,1))))
model.add(TimeDistributed(Activation("relu")))
model.add(TimeDistributed(Conv2D(16,kernel_size =(3,3),strides=(1,1))))
model.add(TimeDistributed(Activation("relu")))
model.add(TimeDistributed(MaxPooling2D(pool_size=2,strides=(1,1) )))
model.add(TimeDistributed(Reshape((280*38*16,))))
model.add(TimeDistributed(Dense(32)))
model.add(GRU(512))
model.add(Dense(50))
model.add(Activation("softmax"))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics= 
 ['accuracy'])

我什至无法开始思考为什么出现此消息。我已经为所有图层指定了“步幅”参数。任何帮助将不胜感激。

P.S-当我尝试拟合没有TimeDistributed图层的模型时,我没有任何问题。也许与此有关的事情会引发此错误。

1 个答案:

答案 0 :(得分:0)

您在代码中犯了几个错误。

  • 在第一层中,您应该指定input_shape层的TimeDistributed,而不是Conv2D层。
  • MaxPooling2D用于下采样图像的空间大小。但是使用strides=(1,1)时,图像尺寸将保持不变,并且不会减小。
  • 在第一层中使用padding='SAME'将在进行卷积时添加零填充,并在Reshape层中导致形状不匹配错误。相反,您可以使用Flatten层。
  • Conv2D中的步幅默认值为strides=(1,1),因此,它是可选的。

最后,工作代码应为以下内容:

model=keras.models.Sequential()
model.add(keras.layers.TimeDistributed(keras.layers.Conv2D(16, kernel_size=(3,3), data_format="channels_last"),input_shape=(129,80,564,3)))
model.add(keras.layers.TimeDistributed(keras.layers.Activation("relu")))
model.add(keras.layers.TimeDistributed(keras.layers.Conv2D(16, kernel_size =(3,3))))
model.add(keras.layers.TimeDistributed(keras.layers.Activation("relu")))
model.add(keras.layers.TimeDistributed(keras.layers.MaxPooling2D(pool_size=2)))
# model.add(keras.layers.TimeDistributed(keras.layers.Flatten()))
model.add(keras.layers.TimeDistributed(keras.layers.Reshape((280*38*16,))))
model.add(keras.layers.TimeDistributed(keras.layers.Dense(32)))
model.add(keras.layers.GRU(512))
model.add(keras.layers.Dense(50))
model.add(keras.layers.Activation("softmax"))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics= ['accuracy'])