![](/img/trans.png)
[英]Negative dimension size caused by subtracting 5 from 2 for 'conv2d_4/convolution' (op: 'Conv2D') with input shapes: [?,5,2,64], [5,5,64,64]
[英]Keras - Negative dimension size caused by subtracting 5 from 4 for 'conv2d_5/convolution' (op: 'Conv2D') with input shapes: [?,4,80,64], [5,5,64,64]
我有一个与以下模型类似的模型,但是在修改体系结构之后,我不断收到以下错误:
通过对输入形状为[?,4,80,64],[5,5,64,64]的'conv2d_5 / convolution'(op:'Conv2D')的4减去5导致的负尺寸大小。
我还是机器学习的新手,所以我不太了解这些参数。 有什么帮助吗?
model_img = Sequential(name="img")
# Cropping
model_img.add(Cropping2D(cropping=((124,126),(0,0)), input_shape=(376,1344,3)))
# Normalization
model_img.add(Lambda(lambda x: (2*x / 255.0) - 1.0))
model_img.add(Conv2D(16, (7, 7), activation="relu", strides=(2, 2)))
model_img.add(Conv2D(32, (7, 7), activation="relu", strides=(2, 2)))
model_img.add(Conv2D(32, (5, 5), activation="relu", strides=(2, 2)))
model_img.add(Conv2D(64, (5, 5), activation="relu", strides=(2, 2)))
model_img.add(Conv2D(64, (5, 5), activation="relu", strides=(2, 2)))
model_img.add(Conv2D(128, (3, 3), activation="relu"))
model_img.add(Conv2D(128, (3, 3), activation="relu"))
model_img.add(Flatten())
model_img.add(Dense(100))
model_img.add(Dense(50))
model_img.add(Dense(10))
model_lidar = Sequential(name="lidar")
model_lidar.add(Dense(32, input_shape=(360,)))
model_lidar.add(Dropout(0.1))
model_lidar.add(Dense(10))
model_imu = Sequential(name='imu')
model_imu.add(Dense(32, input_shape=(10, )))
model_imu.add(Dropout(0.1))
model_imu.add(Dense(10))
merged = Merge([model_img, model_lidar, model_imu], mode="concat")
model = Sequential()
model.add(merged)
model.add(Dense(16))
model.add(Dropout(0.2))
model.add(Dense(1))
答:由于传感器问题,我无法完成培训,但是由于以下两个答案,该模型现在可以正常工作
这是模型中每个图层的输出形状
(?, 376, 1344, 3) - Input
(?, 126, 1344, 3) - Cropping2D
(?, 126, 1344, 3) - Lambda
(?, 60, 669, 16) - Conv2D 1
(?, 27, 332, 32) - Conv2D 2
(?, 12, 164, 32) - Conv2D 3
(?, 4, 80, 64) - Conv2D 4
到输入通过第四Conv2D层时,输出形状已为(4,80)
。 您不能应用具有滤镜大小(5,5)的另一个Conv2D图层,因为输出的第一维小于滤镜大小。
卷积层堆栈可以非常快速地减小图像尺寸。 因此,一旦其沿一维的大小仅为4,就无法再应用5x5卷积。
不进行填充的情况下,卷积层的输出尺寸为(input_dimension - kernel_size)/strides
。 多次减去7(或5)并不是很重要,但是将大小减小2倍会使尺寸很快减小到4。
解决方案是不使用跨步(在前几层之后)。 添加填充有助于防止由于内核而不是由于步幅而导致的大小丢失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.