【问题标题】:MaxPooling2D is giving ValueErrorMaxPooling2D 给出 ValueError
【发布时间】:2021-02-07 13:57:59
【问题描述】:

我得到的错误如下:

ValueError: Negative dimension size caused by subtracting 2 from 1 for '{{node max_pooling2d_2/MaxPool}} = MaxPool[T=DT_FLOAT, data_format="NCHW", explicit_paddings=[], ksize=[1, 1, 2, 2], padding="VALID", strides=[1, 1, 2, 2]](Placeholder)' with input shapes: [?,128,1,1].

我的模型如下:

def get_unet():
inputs = Input((1,img_rows, img_cols))
conv1 = Convolution2D(32, 3, 3, activation='relu', padding='same')(inputs)
conv1 = Convolution2D(32, 3, 3, activation='relu', padding='same')(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)

conv2 = Convolution2D(64, 3, 3, activation='relu', padding='same')(pool1)
conv2 = Convolution2D(64, 3, 3, activation='relu', padding='same')(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)

conv3 = Convolution2D(128, 3, 3, activation='relu', padding='same')(pool2)
conv3 = Convolution2D(128, 3, 3, activation='relu', padding='same')(conv3)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)

conv4 = Convolution2D(256, 3, 3, activation='relu', padding='same')(pool3)
conv4 = Convolution2D(256, 3, 3, activation='relu', padding='same')(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)

conv5 = Convolution2D(512, 3, 3, activation='relu', padding='same')(pool4)
conv5 = Convolution2D(512, 3, 3, activation='relu', padding='same')(conv5)

up6 = merge([UpSampling2D(size=(2, 2))(conv5), conv4], mode='concat', concat_axis=1)
conv6 = Convolution2D(256, 3, 3, activation='relu', padding='same')(up6)
conv6 = Convolution2D(256, 3, 3, activation='relu', padding='same')(conv6)

up7 = merge([UpSampling2D(size=(2, 2))(conv6), conv3], mode='concat', concat_axis=1)
conv7 = Convolution2D(128, 3, 3, activation='relu', padding='same')(up7)
conv7 = Convolution2D(128, 3, 3, activation='relu', padding='same')(conv7)

up8 = merge([UpSampling2D(size=(2, 2))(conv7), conv2], mode='concat', concat_axis=1)
conv8 = Convolution2D(64, 3, 3, activation='relu', padding='same')(up8)
conv8 = Convolution2D(64, 3, 3, activation='relu', padding='same')(conv8)

up9 = merge([UpSampling2D(size=(2, 2))(conv8), conv1], mode='concat', concat_axis=1)
conv9 = Convolution2D(32, 3, 3, activation='relu', padding='same')(up9)
conv9 = Convolution2D(32, 3, 3, activation='relu', padding='same')(conv9)

conv10 = Convolution2D(1, 1, 1, activation='sigmoid')(conv9)

model = Model(input=inputs, output=conv10)

model.compile(optimizer=Adam(lr=1.0e-5), loss=dice_coef_loss, metrics=[dice_coef])

return model

对于输入,我使用了 img_rows 和 img_cols

img_rows=512
img_cols=512

由于我希望后端是 theano,所以我使用以下代码行

K.set_image_data_format('channels_first')  # Theano dimension ordering in this code

输入是一个 .npy 文件,其形状为 (100,3,512,512)。 基本上它由 100 张图片组成。

错误日志如下:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py", line 1853, in _create_c_op

    c_op = pywrap_tf_session.TF_FinishOperation(op_desc)

tensorflow.python.framework.errors_impl.InvalidArgumentError: Negative dimension size caused by subtracting 2 from 1 for '{{node max_pooling2d_2/MaxPool}} = MaxPool[T=DT_FLOAT, data_format="NCHW", explicit_paddings=[], ksize=[1, 1, 2, 2], padding="VALID", strides=[1, 1, 2, 2]](Placeholder)' with input shapes: [?,128,1,1].

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "LUNA_train_unet.py", line 147, in <module>
    train_and_predict(True)

  File "LUNA_train_unet.py", line 103, in train_and_predict
    model = get_unet()

  File "LUNA_train_unet.py", line 50, in get_unet
    pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py", line 952, in __call__
    input_list)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py", line 1091, in _functional_construction_call
    inputs, input_masks, args, kwargs)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py", line 822, in _keras_tensor_symbolic_call
    return self._infer_output_signature(inputs, args, kwargs, input_masks)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py", line 863, in _infer_output_signature
    outputs = call_fn(inputs, *args, **kwargs)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/pooling.py", line 300, in call
    data_format=conv_utils.convert_data_format(self.data_format, 4))

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/util/dispatch.py", line 201, in wrapper
    return target(*args, **kwargs)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn_ops.py", line 4613, in max_pool
    name=name)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/gen_nn_ops.py", line 5330, in max_pool
    data_format=data_format, name=name)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py", line 750, in _apply_op_helper
    attrs=attr_protos, op_def=op_def)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/func_graph.py", line 592, in _create_op_internal
    compute_device)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py", line 3536, in _create_op_internal
    op_def=op_def)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py", line 2016, in __init__
    control_input_ops, op_def)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py", line 1856, in _create_c_op
    raise ValueError(str(e))

ValueError: Negative dimension size caused by subtracting 2 from 1 for '{{node max_pooling2d_2/MaxPool}} = MaxPool[T=DT_FLOAT, data_format="NCHW", explicit_paddings=[], ksize=[1, 1, 2, 2], padding="VALID", strides=[1, 1, 2, 2]](Placeholder)' with input shapes: [?,128,1,1].

我尝试寻找解决此问题的方法,并遇到了类似问题的帖子。他们建议将 data_format='channels_first' 添加为

keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format='channels_first')

我试过了,但是没有用。我遇到的另一个解决方案是更改输入的尺寸,但我不确定它会如何工作。

如前所述,我的 .npy 文件的形状为 (100,3,512,512),我的模型将输入作为 (1,512,512),即每个图像的每个通道。

【问题讨论】:

    标签: python tensorflow keras deep-learning neural-network


    【解决方案1】:

    指定图片格式为MaxPooling op:

    MaxPooling2D(pool_size=(2, 2), data_format='channels_first')
    

    【讨论】:

    • 我确实尝试过,但没有成功。但是,我尝试将 padding='same' 放在池化层中,结果成功了。但这不会改变我的输出形状吗?
    • 形状是什么意思?每进行一次 2x2 池化,您的图像就会减半。
    • @Frightera,是的,每 2x2 池化图像就会减半。但是,当我使用 padding='same' 进行池化时,大小将保持不变对吗?当我使用相同的填充时,错误得到解决,但我面临另一个与大小相关的错误。
    • 您误解了填充,当您不指定strides 时,它将等于pool_size,即(2,2)使您的图像减半。如果您想避免将strides 视为一个。
    猜你喜欢
    • 2017-02-10
    • 2021-12-28
    • 2021-07-20
    • 2020-04-29
    • 1970-01-01
    • 2018-08-25
    • 2020-11-17
    • 2019-04-22
    • 1970-01-01
    相关资源
    最近更新 更多