【问题标题】: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]Keras - 输入形状为 [?,4,80,64], [5,5,64,64] 的“conv2d_5/convolution”(操作:“Conv2D”)的 4 减去 5 导致的负维度大小
【发布时间】:2018-07-09 03:53:41
【问题描述】:

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

对于输入形状为 [?,4,80,64], [5,5,64,64] 的“conv2d_5/convolution”(操作:“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))

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

【问题讨论】:

    标签: python neural-network keras


    【解决方案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
    

    当输入通过第 4 个 Conv2D 层时,输出形状已经是 (4,80)。您不能应用过滤器大小为 (5, 5) 的另一个 Conv2D 层,因为输出的第一个维度小于过滤器大小。

    【讨论】:

    • 谢谢,我会在用不同的过滤器训练模型后回复你
    【解决方案2】:

    您的卷积层堆栈非常快地减小了图像大小。因此,一旦它沿一维的大小只有 4,就不能再应用 5x5 卷积了。

    如果没有填充,卷积层的输出维度为(input_dimension - kernel_size)/strides。多次减去 7(或 5)并不那么重要,但是将大小减少 2 倍可以很快将维度降低到 4。

    解决方案是不使用步幅(在前几层之后)。添加填充有助于防止由于内核而不是由于步幅而导致大小丢失。

    【讨论】:

    • 谢谢,我现在更清楚地理解了错误。我通过玩大步得到了一些模型。训练好模型后我会通知你
    • @DJ_Stuffy_K 降低图像变小的速度为我解决了这个问题。我可以通过移除某些层的步幅、减少 7x7 等大尺寸层的数量、用 3x3 层替换一些 5x5 层等来获得多个模型
    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多