web-dev-qa-db-fra.com

La couche Keras Maxpool2d donne ValueError

J'essaie de répliquer le modèle VGG16 en keras, voici mon code:

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'))

La couche maxpool2d donne une erreur sur la ligne commentée

L'erreur dit:

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

Quelle pourrait être la raison derrière cela? Comment résoudre ça?

Modifier: un journal des erreurs plus détaillé:


ValueError Traceback (dernier appel le plus récent) dans () 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 en addition (self, layer) 306 output_shapes = [self.outputs [0] ._ keras_shape]) 307 else: -> 308 output_tensor = layer (self.outputs [0]) 309 si le type (output_tensor) est list: 310 lever Exception ('Toutes les couches dans un modèle séquentiel'

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in call (self, x, mask) 512 if inbound_layers: 513 # cela appellera layer.build () si nécessaire -> 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 dans add_inbound_node (self, inbound_layers, node_indices, tensor_indices) 570 # la création du nœud met automatiquement à jour self.inbound_nodes 571 # ainsi que outbound_nodes sur couches entrantes. -> 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 dans create_node (cls, outbound_layer, inbound_layers, node_indices, tensor_indices) 147148 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: essayez d'auto-inférer forme si une exception est déclenchée par get_output_shape_for

/usr/local/lib/python2.7/dist-packages/keras/layers/pool.pyc en appel (self, x, mask) 160 foulées = self.strides, 161 border_mode = self.border_mode, -> 162 dim_ordering = self.dim_ordering) 163 sortie de retour 164

/usr/local/lib/python2.7/dist-packages/keras/layers/pool.pyc dans la fonction _pool_fonction (self, inputs, pool_size, strides, border_mode, dim_ordering) 210 border_mode, dim_ordering): 211 output = K.pool2d ( entrées, pool_size, strides, -> 212 border_mode, dim_ordering, pool_mode = 'max') 213 return output 214

/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.pyc dans pool2d (x, pool_size, strides, border_mode, dim_ordering, pool_mode) 1699 1700 si 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 dans max_pool (valeur, 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 dans _max_pool (entrée, ksize, strides, padding, data_format, nom)
1593 resultat = _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

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.pyc dans apply_op (self, op_type_name, nom, ** mots-clés) 747 op = g.create_op (op_type_name, entrées, output_types, name = scope, 748 input_types = input_types, attrs = attr_protos, -> 749 op_def = op_def) 750 sorties = op.outputs 751 return _Restructure (ops.convert_n_to_tensor (sorties),

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc dans 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 si 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 dans set_shapes_for_outputs (op) 1783 augmenter RuntimeError ("Aucune fonction de forme enregistrée pour l'op standard:% s" 1784
% op.type) -> 1785 formes = shape_func (op) 1786 si les formes sont None: 1787 lever RuntimeError (

/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.pyc dans call_cpp_shape_fn (op, input_tensors_needed, debug_python_shape_fn) 594 status) 595 sauf error.InvalidArgumentEr6 (err.message) 597 598 # Convertit les valeurs TensorShapeProto en output_shapes.

ValueError: taille de dimension négative causée par la soustraction de 2 à 1 pour "MaxPool_7" (op: "MaxPool") avec des formes d'entrée: [?, 1,112,128].

22
Pranay Mathur

Citant une réponse mentionnée dans github , vous devez spécifier l'ordre des dimensions:

Keras est un wrapper sur les bibliothèques Theano ou Tensorflow. Keras utilise la variable de réglage image_dim_ordering Pour décider si la couche d'entrée est au format Theano ou Tensorflow. Ce paramètre peut être spécifié de 2 manières -

  1. spécifiez 'tf' ou 'th' dans ~/.keras/keras.json comme ceci - image_dim_ordering: 'th'. Remarque: il s'agit d'un fichier json .
  2. ou spécifiez le image_dim_ordering dans votre modèle comme ceci: model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))

Annexe: image_dim_ordering En mode 'th' La dimension des canaux (la profondeur) est à l'index 1 (par exemple 3, 256 , 256). En mode 'tf', Il est à l'index 3 (par exemple 256, 256, 3). Citant @naoko à partir de commentaires.

22

Vous utilisez la forme d'entrée car (3, x, y) devrait la changer en forme_entrée = x, y, 3

1
hello

Pour les keras avec TensorFlow, essayez ce qui suit:

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

La réponse acceptée fonctionne. Mais vous pouvez également effectuer les opérations suivantes:

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

Keras suppose que l'entrée est (width, height, channels) Pour le backend TensorFlow et (channel, width, height) Pour le backend Theano. Puisque votre input_shape=(3,224,224), spécifier data_format='channels_last' Devrait faire l'affaire.

0
Anakin

Ajouter dim_ordering erreur résolue pour moi:

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

j'ai également rencontré le même problème lors du chargement d'un modèle VGG . donc je viens de prendre la transposition des images de test. la commande réelle est donnée ci-dessous:

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

0
Khan