【问题标题】:“ValueError: Input 0 is incompatible with layer cropping2d_1: expected ndim=4, found ndim=3”“ValueError: Input 0 is in compatible with layercropping2d_1: expected ndim=4, found ndim=3”
【发布时间】:2018-08-21 19:14:32
【问题描述】:

我正在将单色通道图像添加到数组中

image = cv2.cvtColor(cv2.imread(path), cv2.COLOR_BGR2HSV)
tmp = image[:,:,1].reshape(160, 320, 1)
images.append(tmp)

但是,在顺序模型的启动过程中,我得到了

ValueError:输入 0 与图层cropping2d_1 不兼容:预期 ndim=4,发现 ndim=3

Cropping2D 如何处理单色通道图像??

模型开始如下:

model = Sequential()
model.add(Lambda(lambda x: x/255.0 - 0.5, input_shape=(160, 320, 1)))
model.add(Cropping2D(cropping=((50, 20), (0, 0))))

【问题讨论】:

    标签: python python-3.x tensorflow opencv keras


    【解决方案1】:

    根据to the documentationCropping2D 层的预期输入张量形状是:

    (samples, depth, first_axis_to_crop, second_axis_to_crop)
    

    第一个维度是您的批量大小或示例数量。第二个维度是通道数(在您的情况下为 1),最后第三个和第四个参数是您要裁剪图像的行数和列数。

    您尚未提供完整的设置,因此我们不知道您预期的批量大小。让我们假设它现在是 None,这意味着您将在以后决定批量大小。

    罪魁祸首很可能是您将图像转换为灰度:

    model.add(Lambda(lambda x: x/255.0 - 0.5, input_shape=(160, 320, 1)))
    

    您需要更改它以适应Cropping2D 层的尺寸。具体来说,没有input_shape参数as far as I can see from the documentation。另外,你需要左右移动尺寸,让通道先出现,然后是行和列,所以切换reshape中的参数:

    image = cv2.cvtColor(cv2.imread(path), cv2.COLOR_BGR2HSV)
    tmp = image[:,:,1].reshape(1, 160, 320)
    images.append(tmp)
    

    回到input_shape,您实际上应该让input_shape 从前一层推断出来,因此假设您已正确设置层,只需将其省略即可:

    model.add(Lambda(lambda x: x/255.0 - 0.5))
    

    【讨论】:

    • Lambda 是第一层
    • @dodawamo 没错。 Lambda 的预期输入形状应该与下一层兼容。你不这样做。您必须切换通道,以便之后可以将其馈送到Cropping2D 层。
    猜你喜欢
    • 2017-10-26
    • 2019-07-19
    • 2018-05-19
    • 2017-07-28
    • 2019-01-03
    • 1970-01-01
    • 2021-09-23
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多