Уровень Keras Maxpooling2d дает ValueError

Я пытаюсь реплицировать модель VGG16 в keras, следующий мой код:

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].

Что может быть причиной этого? Как это решить?

Изменить: Более подробный журнал ошибок:


Traceback ValueError (последний вызов последний) в()      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 в добавить (self, слой)     306 output_shapes = [self.outputs [0]._ keras_shape])     307: → 308 output_tensor = layer (self.outputs [0])     309, если тип (output_tensor) - это список:     310 raise Exception ( "Все слои в последовательной модели"

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc в вызов (self, x, mask)     512, если inbound_layers:     513 # это вызовет layer.build(), если необходимо → 514 self.add_inbound_node (inbound_layers, node_indices, tensor_indices)     515 input_added = True     516

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc в add_inbound_node (self, inbound_layers, node_indices, tensor_indices)     570 # создание node автоматически обновляет 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 в create_node (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 в call (self, x, mask)     160 шагов = 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 в _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 в 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, strides, padding, data_format, name) 1391 padding = padding, 1392
data_format = data_format, → 1393 name = name) 1394 1395

/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.pyc в _max_pool (input, ksize, strides, padding, data_format, name)
1593 result = _op_def_lib.apply_op ( "MaxPool", input = input, ksize = ksize, 1594 strides = strides, обивка = обивка, → 1595 data_format = data_format, name = name) 1596 return result 1597

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.pyc в 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 _Restructure (ops.convert_n_to_tensor (выходы),

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc в create_op (self, op_type, input, 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 в set_shapes_for_outputs (op) 1783 raise RuntimeError ( "Нет функция формы, зарегистрированная для стандартного op:% s" 1784
% op.type) → 1785 forms = shape_func (op) 1786, если фигуры None: 1787 raise 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 как err: → 596 повысить значение ValueError (err.message)     597     598 # Преобразование значений TensorShapeProto в output_shapes.

ValueError: отрицательный размер размера, вызванный вычитанием 2 из 1 для 'MaxPool_7' (op: 'MaxPool') с формами ввода: [?, 1,112,128].

Ответ 1

Запрашивая ответ, упомянутый в github, вам нужно указать упорядочение размеров:

Keras - обертка над библиотеками Theano или Tensorflow. Keras использует переменную настройки image_dim_ordering, чтобы определить, является ли входной слой форматом Theano или Tensorflow. Этот параметр можно указать двумя способами -

  • укажите 'tf' или 'th' в ~/.keras/keras.json так же - image_dim_ordering: 'th'. Примечание: это json файл.
  • или укажите 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 из комментариев.

Ответ 2

Вы используете форму ввода как (3, x, y), чтобы изменить ее на input_shape = x, y, 3

Ответ 3

Для keras с TensorFlow выполните следующие действия:

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

Ответ 4

i также столкнулась с одной и той же проблемой при загрузке обучаемой модели VGG. поэтому я просто взял транспонирование тестовых изображений. фактическая команда приведена ниже:

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

Ответ 5

Принятый ответ работает. Но вы также можете сделать следующее:

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

Keras предполагает, что входные данные (width, height, channels) для бэкэнда TensorFlow и (channel, width, height) для бэкэнда Theano. Поскольку ваш input_shape=(3,224,224), указание data_format='channels_last' должно помочь.

Ответ 6

Добавление dim_ordering решило для меня ошибку:

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