簡體   English   中英

Keras Maxpooling2d 層給出了 ValueError

[英]Keras Maxpooling2d layer gives 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].

這背后的原因可能是什么? 如何解決這個問題?

編輯:更詳細的錯誤日志:


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('順序模型中的所有層'

/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 on入站層。 --> 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, input, pool_size, strides, border_mode, dim_ordering) 210 border_mode, dim_ordering): 211 output = K.pool2d(輸入,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 if 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 結果 = _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, input, 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 如果計算形狀:-> 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(“沒有為標准操作注冊形狀函數:%s”1784
% op.type) -> 1785 形狀 = shape_func(op) 1786 如果形狀是 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 (err.message) 597 598 # 在 output_shapes 中轉換 TensorShapeProto 值。

ValueError:輸入形狀為 [?,1,112,128] 的“MaxPool_7”(操作:“MaxPool”)從 1 中減去 2 導致的負尺寸大小。

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

Keras 是 Theano 或 Tensorflow 庫的包裝器。 image_dim_ordering使用設置變量image_dim_ordering來決定輸入層是 Theano 還是 Tensorflow 格式。 可以通過兩種方式指定此設置 -

  1. ~/.keras/keras.json指定'tf''th'像這樣 - image_dim_ordering: 'th' 注意:這是一個json 文件
  2. 或在您的模型中指定image_dim_ordering ,如下所示: model.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(例如image_dim_ordering )。 'tf'模式下,它位於索引 3(例如 256、256、3)。 從評論中引用@naoko。

我遇到了同樣的問題,我通過將 padding: 'valid' 更改為 padding:'SAME' 來解決它:我想它足以添加一個參數 padding:' same'

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

您正在使用輸入形狀作為 (3,x,y) 應將其更改為 input_shape=x,y,3

對於帶有 TensorFlow 的 keras,請嘗試以下操作:

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

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

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

Keras 假設 TensorFlow 后端的輸入為(width, height, channels) (channel, width, height) ,Theano 后端的輸入為(channel, width, height) 由於您的input_shape=(3,224,224) ,指定data_format='channels_last'應該可以解決問題。

我在加載經過訓練的VGG模型時也遇到了同樣的問題。 所以我只是對測試圖像進​​行了轉置。 實際命令如下:

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

添加dim_ordering為我解決了錯誤:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM