【发布时间】: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