Keras Maxpooling2d 层给出 ValueError

2024-05-06

我正在尝试在 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].

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

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


ValueError Traceback(最近调用 最后)在() 12 model.add(Convolution2D(128, 3, 3, 激活='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 中的 add(self, 层) [第 306 章] 第307章: --> 308 输出张量 = 层(self.outputs[0]) [第 309 章] 310 raise Exception('顺序模型中的所有层'

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc 中call(自身,x,掩码) 第512章 第513章 --> 514 self.add_inbound_node(inbound_layers,node_indices,tensor_indices) 第515章 516

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc 中 add_inbound_node(自身,inbound_layers,node_indices,tensor_indices) 攀上漂亮女局长之后570 攀上漂亮女局长之后571 --> 572 Node.create_node(自身,inbound_layers,node_indices,tensor_indices) 第573章 第574章

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc 中 创建节点(cls,出站层,入站层,节点索引, 张量索引) 147 148 if len(input_tensors) == 1: --> 149 output_tensors = to_list(outbound_layer.call(input_tensors[0], mask=input_masks[0])) 第150章 151 # TODO:如果 get_output_shape_for 引发异常,则尝试自动推断形状

/usr/local/lib/python2.7/dist-packages/keras/layers/pooling.pyc 中 调用(自身,x,掩码) 160 步=self.strides, 第161章 --> 162 dim_ordering=self.dim_ordering) 163 返回输出 164

/usr/local/lib/python2.7/dist-packages/keras/layers/pooling.pyc 中 _pooling_function(自身,输入,pool_size,步幅,border_mode,dim_ordering) 210 边界模式,暗淡排序): [第 211 章] --> 212 border_mode, dim_ordering, pool_mode='max') 213 返回输出 214

/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.pyc 在 pool2d(x, pool_size, 步幅, border_mode, dim_ordering, pool_mode) 中 第1699章【1700】 第1701章 1702 第1702章 1703
x = tf.nn.avg_pool(x, pool_size, 步幅, 填充=填充)

/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_ops.pyc 在 max_pool(值,ksize,步幅,填充,data_format,名称)中 1391 填充=填充,1392
数据格式=数据格式, -> 1393 姓名=姓名) 1394 1395

/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.pyc 在 _max_pool(输入、ksize、步幅、填充、data_format、名称)
第1593章 ksize=ksize, 1594 步幅=步幅, 填充=填充, -> 1595 data_format=data_format, name=name) 1596 返回结果 1597

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.pyc 在 apply_op(self, op_type_name, 名称, **关键字) 第747章 第748章 --> 第 749 章 750 个输出 = op.outputs 第751章

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc 在 create_op(self, op_type, 输入, dtypes, input_types, 名称, attrs, op_def、计算形状、计算设备)2388
第2389章 计算形状: -> 2390 set_shapes_for_outputs(ret)2391 self._add_op(ret)2392
self._record_op_seen_by_control_dependency(ret)

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc 在 set_shapes_for_outputs(op) 1783 中引发 RuntimeError(“否 已为标准操作注册形状函数:%s”1784
% 操作类型) 第1785章 1786 第1786章 1787

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.pyc 在 call_cpp_shape_fn(op, input_tensors_needed, debug_python_shape_fn) 中 594状态) 595 错误除外。InvalidArgumentError 为错误: --> 596 引发 ValueError(err.message) 第597章 攀上漂亮女局长之后598

ValueError:从 1 减去 2 导致的负维度大小 'MaxPool_7'(操作:'MaxPool'),输入形状:[?,1,112,128]。


引用其中提到的一个答案github https://github.com/fchollet/keras/issues/3945,您需要指定维度顺序:

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

  1. specify 'tf' or 'th' in ~/.keras/keras.json就像这样-image_dim_ordering: 'th'。注意:这是一个json 文件 https://keras.io/backend/#kerasjson-details.
  2. 或指定image_dim_ordering在你的模型中像这样:model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))

更新:2020 年 4 月喀拉斯2.2.5link https://keras.io/layers/pooling/#maxpooling2d似乎有一个更新的 API,其中dim_ordering更改为data_format so:

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

附录: image_dim_ordering in 'th'模式通道尺寸(深度)位于索引 1(例如 3、256、256)。在'tf'模式是索引 3(例如 256、256、3)。从评论中引用@naoko。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keras Maxpooling2d 层给出 ValueError 的相关文章

随机推荐