【问题标题】:Keras Maxpooling2d layer gives ValueErrorKeras Maxpooling2d 层给出 ValueError
【发布时间】:2017-02-10 10:45:50
【问题描述】:

我正在尝试在 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, 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 在 add(self, 层) 306 输出形状=[self.输出[0]._keras_shape]) 307 其他: --> 308 output_tensor = layer(self.outputs[0]) 309 如果类型(输出张量)是列表: 310 raise Exception('顺序模型中的所有层'

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc 在 调用(自我、x、面具) 512 如果入站层: 513 # 如果需要,这将调用 layer.build() --> 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(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章

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc 在 create_node(cls, outbound_layer, inbound_layers, node_indices, 张量索引) 147 148 如果 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 呼叫(自我,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(self,inputs,pool_size,strides,border_mode,dim_ordering) 210 边界模式,暗淡排序): 211 输出 = K.pool2d(输入,池大小,步幅, --> 212 边界模式,dim_ordering,pool_mode='max') 213返回输出 214

/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.pyc 在 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 在 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 strides=strides, 填充=填充, -> 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, name, **keywords) 第747章 第748章 --> 749 op_def=op_def) 750 个输出 = op.outputs 第751章

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc 在 create_op(self, op_type, 输入, dtypes, input_types, name, attrs, op_def、compute_shapes、compute_device) 2388
original_op=self._default_original_op, op_def=op_def) 2389 如果 计算形状: -> 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 在 set_shapes_for_outputs(op) 1783 中引发 RuntimeError("否 为标准操作注册的形状函数:%s" 1784
% 操作类型) -> 1785 形状 = shape_func(op) 1786 如果形状为无:1787 引发 RuntimeError(

/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 # 在 output_shapes 中转换 TensorShapeProto 值。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      1. ~/.keras/keras.json 中指定'tf''th',就像这样-image_dim_ordering: 'th'。注意:这是json file
      2. 或在模型中指定image_dim_ordering,如下所示:model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))

      更新:2020 年 4 月Keras 2.2.5 link 似乎有一个更新的 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)。引用 cmets 的 @naoko。

      【讨论】:

      • @PranayMathur 没有注意到这一点!
      • 注意:dim_ordering,在'th' 模式下,通道维度(深度)位于索引 1,在'tf' 模式下,它位于索引 3。对于 tensorflow 0.10 将使用“tf "(默认)和 0.11 将使用 "th"。您可以在~/.keras/keras.json 中设置此行为
      • @SrikarAppalaraju 在您的附录中,那不是索引 0 和索引 2 而不是 1 和 3 吗?
      • TF2:关键字参数不理解:'dim_ordering'
      • 这个答案对 keras 2.2.5 有效吗?因为MaxPooling2D 似乎没有dim_ordering 参数! keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
      【解决方案3】:

      添加dim_ordering 为我解决了错误:

      model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))
      

      【讨论】:

        【解决方案4】:

        接受的答案有效。但您也可以执行以下操作:

            model.add(MaxPooling2D((2, 2), name='block1_pool', data_format='channels_last')
        

        Keras 假设 TensorFlow 后端的输入为 (width, height, channels),而 Theano 后端的输入为 (channel, width, height)。由于您的input_shape=(3,224,224),指定data_format='channels_last' 应该可以解决问题。

        【讨论】:

          【解决方案5】:

          我在加载经过训练的 VGG 模型时也遇到了同样的问题。所以我只是对测试图像进​​行了转置。实际命令如下:

          kerasImage = kerasImage.transpose(1,2,0)

          【讨论】:

            【解决方案6】:

            对于带有 TensorFlow 的 keras,请尝试以下操作:

            model.add(ZeroPadding2D((1, 1), input_shape=(img_rows, img_cols, channel)))
            

            【讨论】:

              【解决方案7】:

              您使用的输入形状为 (3,x,y) 应将其更改为 input_shape=x,y,3

              【讨论】:

              • 请扩展您的答案,我收到如下错误:ValueError: Negative dimension size caused by subtracting 3 from 1 for 'conv2d_2/convolution' (op: 'Conv2D') with input shapes: [?,20,1,32], [3,3,32,32].
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-04-29
              • 2018-09-06
              • 2021-12-28
              • 2021-08-02
              • 2018-06-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多