Keras Maxpooling2d 层给出 ValueError

新手上路,请多包涵

我正在尝试在 keras 中复制 VGG16 模型,以下是我的代码:

 model = Sequential()
model.add(ZeroPadding2D((1,1),input_shape=(3,224,224)))
model.add(Convolution2D(64, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(64, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2))) ###This line gives error
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1000, activation='softmax'))

maxpooling2d 层在被注释的行中给出错误

错误说:

 ValueError: Negative dimension size caused by subtracting 2 from 1 for 'MaxPool_7' (op: 'MaxPool') with input shapes: [?,1,112,128].

这背后的原因可能是什么?如何解决这个问题?

编辑:更详细的错误日志:


() 12 model.add(Convolution2D(128, 3, 3, activation=‘relu’)) 13 —> 14 model.add(MaxPooling2D((2,2), strides =(2,2))) 15 16 model.add(ZeroPadding2D((1,1)))

/usr/local/lib/python2.7/dist-packages/keras/models.pyc in add(self, layer) 306 output_shapes=[self.outputs[0]._keras_shape]) 307 else: –> 308 output_tensor =层(self.outputs[0])309 如果类型(output_tensor)是列表:310 raise Exception(’顺序模型中的所有层’

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in call (self, x, mask) 512 if inbound_layers: 513 # 这将在必要时调用 layer.build() –>第 514 章

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in add_inbound_node(self, inbound_layers, node_indices, tensor_indices) 570 # 创建节点自动更新 self.inbound_nodes 571 # 以及 outbound_nodes入站图层。 –> 572 Node.create_node(self, inbound_layers, node_indices, tensor_indices) 573 574 def get_output_shape_for(self, input_shape):

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in create_node(cls, outbound_layer, inbound_layers, node_indices, tensor_indices) 147 148 if len(input_tensors) == 1: –> 149 output_tensors = to_list(outbound_layer.call(input_tensors[0], mask=input_masks[0])) 150 output_masks = to_list(outbound_layer.compute_mask(input_tensors[0], input_masks[0])) 151 # TODO: 尝试自动推断如果 get_output_shape_for 引发异常则形状

/usr/local/lib/python2.7/dist-packages/keras/layers/pooling.pyc in call(self, x, mask) 160 strides=self.strides, 161 border_mode=self.border_mode, –> 162 dim_ordering =self.dim_ordering) 163 返回输出 164

/usr/local/lib/python2.7/dist-packages/keras/layers/pooling.pyc in _pooling_function(self, inputs, pool_size, strides, border_mode, dim_ordering) 210 border_mode, dim_ordering): 211 output = K.pool2d( inputs, pool_size, strides, –> 212 border_mode, dim_ordering, pool_mode=‘max’) 213 返回输出 214

/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.pyc in pool2d(x, pool_size, strides, border_mode, dim_ordering, pool_mode) 1699 1700 如果 pool_mode == ‘max’: -> 1701 x = tf.nn.max_pool(x, pool_size, strides, padding=padding) 1702 elif pool_mode == ‘avg’: 1703

x = tf.nn.avg_pool(x, pool_size, strides, padding=padding)

/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_ops.pyc in max_pool(value, ksize, strides, padding, data_format, name) 1391 padding=padding, 1392

数据格式=数据格式,-> 1393 名称=名称)1394 1395

/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.pyc in _max_pool(input, ksize, strides, padding, data_format, name)

1593 result = _op_def_lib.apply_op(“MaxPool”, input=input, ksize=ksize, 1594 strides=strides, padding=padding, -> 1595 data_format=data_format, name=name) 1596 返回结果 1597

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.pyc in apply_op(self, op_type_name, name, **keywords) 747 op = g.create_op(op_type_name, inputs, output_types, name=scope, 748 input_types=input_types, attrs=attr_protos, –> 749 op_def=op_def) 750 输出 = op.outputs 751 return _Restructure(ops.convert_n_to_tensor(outputs),

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc in create_op(self, op_type, inputs, dtypes, input_types, name, attrs, op_def, compute_shapes, compute_device) 2388

original_op=self._default_original_op, op_def=op_def) 2389 if compute_shapes: -> 2390 set_shapes_for_outputs(ret) 2391 self._add_op(ret) 2392

self._record_op_seen_by_control_dependencies(ret)

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc in set_shapes_for_outputs(op) 1783 raise RuntimeError(“No shape function registered for standard op: %s” 1784

% op.type) -> 1785 shapes = shape_func(op) 1786 if shapes is None: 1787 raise RuntimeError(

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.pyc in call_cpp_shape_fn(op, input_tensors_needed, debug_python_shape_fn) 594 status) 595 除了errors.InvalidArgumentError as err: –> 596 raise ValueError (err.message) 597 598 # 转换 output_shapes 中的 TensorShapeProto 值。

ValueError:对于输入形状为 [?,1,112,128] 的“MaxPool_7”(op:“MaxPool”)从 1 中减去 2 导致的负维度大小。

原文由 Pranay Mathur 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 672
2 个回答

引用 github 中提到的一个答案,需要指定维度排序:

Keras 是 Theano 或 Tensorflow 库的包装器。 Keras 使用设置变量 image_dim_ordering 来决定输入层是 Theano 还是 Tensorflow 格式。可以通过两种方式指定此设置 -

  1. 指定 'tf' ~/.keras/keras.json 'th' image_dim_ordering: 'th' 注意:这是一个 json 文件
  2. 或者像这样在你的模型中指定 image_dim_orderingmodel.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))

更新:2020 年 4 月 Keras 2.2.5 链接 似乎有更新的 API,其中 dim_ordering 更改为 data_format 所以:

keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format='channels_first') 获取NCHW或使用 channels_last 获取NHWC

附录: image_dim_ordering'th' 模式下通道维度(深度)在索引1处(例如3、256、256)。在 'tf' 模式中,它位于索引 3(例如 256、256、3)。从评论中引用@naoko。

原文由 Srikar Appalaraju 发布,翻译遵循 CC BY-SA 4.0 许可协议

我遇到了同样的问题,我通过将 padding: ‘valid’ 更改为 padding:‘SAME’: 我想它足以添加参数 padding:‘same’ 来解决它

model.add(MaxPooling2D((2,2), strides=(2,2), padding='same'))

原文由 megh_sat 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题