Keras Maxpooling2d层给出了ValueError

Pra*_*hur 22 python neural-network deep-learning keras tensorflow

我想在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'))
Run Code Online (Sandbox Code Playgroud)

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

错误说:

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

这背后可能是什么原因?怎么解决这个?

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


ValueError Traceback(最近一次调用last)in()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 = layer(self.outputs [0])309如果type(output_tensor)是list:310 raise Exception('Sequential model中的所有图层'

调用中的 /usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc(self,x,mask)512 if inbound_layers:513#如果需要,这将调用layer.build() - > 514 self.add_inbound_node(inbound_layers,node_indices,tensor_indices)515 input_added = True 516

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

create_node中的/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc(cls,outbound_layer,inbound_layers,node_indices,tensor_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(self,x,mask)160 strides = self.strides,161 border_mode = self.border_mode, - > 162 dim_ordering = self.dim_ordering)163返回输出164

_pooling_function中的/usr/local/lib/python2.7/dist-packages/keras/layers/pooling.pyc(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

pool2d中的/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.pyc(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)

max_pool中的/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_ops.pyc(va​​lue,ksize,strides,padding,data_format,name)1391 padding = padding,1392
data_format = data_format, - > 1393 name = name)1394 1395

_max_pool中的/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.pyc(输入,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 return result 1597

apply_op中的/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.pyc(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 outputs = op.outputs 751 return _Restructure(ops.convert_n_to_tensor(outputs),

create_op中的/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc(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)

set_shapes_for_outputs(op)中的/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc 1783引发RuntimeError("没有为标准操作注册的形状函数:%s"1784
%op.type ) - > 1785个shapes = shape_func(op)1786如果形状为None:1787引发RuntimeError(

call_cpp_shape_fn中的/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.pn(op,input_tensors_needed,debug_python_shape_fn)594 status)595除了errors.InvalidArgumentError为错误: - > 596引发ValueError (err.message)597 598#在output_shapes中转换TensorShapeProto值.

ValueError:通过输入形状为"MaxPool_7"(op:'MaxPool')从1减1而导致的负尺寸大小:[?,1,112,128].

Sri*_*aju 23

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

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

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

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