Keras - 通过从< conv2d_5 / convolution'中减去4来导致的负尺寸大小。 (op:' Conv2D')输入形状:[?,4,80,64],[5,5,64,64]

时间:2018-01-30 09:50:35

标签: python neural-network keras

我有一个类似于下面的模型,但在修改架构后,我不断收到以下错误:

  

通过从< conv2d_5 / convolution'中删除5而导致的负尺寸大小(op:' Conv2D')输入形状:[?,4,80,64],[5,5,64,64]。

我还是机器学习的新手,所以我无法理解参数。有什么帮助吗?

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))

答:由于传感器问题,我无法完成培训,但由于下面的2个答案,模型现在正常工作

2 个答案:

答案 0 :(得分:4)

以下是模型中每个图层的输出形状

(?, 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

当输入通过第4个Conv2D图层时,输出形状已经为(4,80)。由于输出的第一个维度小于过滤器大小,因此无法应用具有过滤器大小(5,5)的其他Conv2D图层。

答案 1 :(得分:2)

您的卷积层可以非常快速地缩小图像大小。因此,一旦它的尺寸仅为4,就不能再应用5x5卷积。

如果没有填充,卷积层的输出尺寸为(input_dimension - kernel_size)/strides。多次抽取7(或5)并不重要,但将尺寸缩小两倍会使尺寸变得非常快。

解决方案要么不使用步幅(在第一层之后)。添加填充有助于防止由于内核而导致的大小减小,但不是由于步幅。