Keras Maxpooling2d couche donne ValueError

Je suis en train de répliquer VGG16 modèle dans 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 maxpooling2d couche donne une erreur à la ligne qui est commenté

Le message d'erreur indique:

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 tout cela? Comment résoudre ce problème?

Edit:
Une erreur plus détaillé journal:


ValueError Traceback (most recent call
dernier) ()
12 modèle.ajouter(Convolution2D(128, 3, 3, activation='relu'))
13
---> 14 modèle.ajouter(MaxPooling2D((2,2), foulées=(2,2)))
15
16 modèle.ajouter(ZeroPadding2D((1,1)))

/usr/local/lib/python2.7/dist-packages/keras/modèles.pyc en ajouter(self,
couche)
306 output_shapes=[self.sorties[0]._keras_shape])
307 d'autre:
--> 308 output_tensor = couche(de soi.sorties[0])
309 si type(output_tensor) est la liste:
310 raise Exception ("Tous les calques dans l'ordre du modèle '

/usr/local/lib/python2.7/dist-packages/keras/moteur/de la topologie.pyc dans
appel(self, x, masque)
512 si inbound_layers:
513 # appel de la couche.build() si nécessaire
--> 514 auto.add_inbound_node(inbound_layers, node_indices, tensor_indices)
515 input_added = True
516

/usr/local/lib/python2.7/dist-packages/keras/moteur/de la topologie.pyc dans
add_inbound_node(auto, inbound_layers, node_indices, tensor_indices)
570 # création du nœud automatiquement les mises à jour auto.inbound_nodes
571 # ainsi que outbound_nodes entrants couches.
--> 572 Nœud.create_node(auto, inbound_layers, node_indices, tensor_indices)
573
574 def get_output_shape_for(auto, input_shape):

/usr/local/lib/python2.7/dist-packages/keras/moteur/de la topologie.pyc dans
create_node(cls, outbound_layer, inbound_layers, node_indices,
tensor_indices)
147
148 si len(input_tensors) == 1:
--> 149 output_tensors = to_list(outbound_layer.appel(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-déduire la forme si une exception est déclenchée par get_output_shape_for

/usr/local/lib/python2.7/dist-packages/keras/couches/mise en commun.pyc dans
appel(self, x, masque)
160 progrès=auto.progrès,
161 border_mode=auto.border_mode,
--> 162 dim_ordering=auto.dim_ordering)
163 retour de sortie
164

/usr/local/lib/python2.7/dist-packages/keras/couches/mise en commun.pyc dans
_pooling_function(de soi, des intrants, des pool_size, progrès, border_mode, dim_ordering)
210 border_mode, dim_ordering):
211 sortie = K. pool2d(entrées, pool_size, progrès,
--> 212 border_mode, dim_ordering, pool_mode='max')
213 retour de sortie
214

/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.pyc
dans pool2d(x, pool_size, progrès, border_mode, dim_ordering, pool_mode)
1699 1700 si pool_mode == 'max':
-> 1701 x = tf.nn.max_pool(x, pool_size, progrès, rembourrage=rembourrage) 1702 elif pool_mode == 'moy': 1703
x = tf.nn.avg_pool(x, pool_size, progrès, rembourrage=rembourrage)

/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_ops.pyc
dans max_pool(valeur, ksize, progrès, rembourrage, data_format, nom) 1391
rembourrage=rembourrage, 1392
data_format=data_format,
-> 1393 nom=nom) 1394 1395

/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.pyc
dans _max_pool(entrée, ksize, progrès, rembourrage, data_format, nom)
1593 résultat = _op_def_lib.apply_op("MaxPool", input=entrée,
ksize=ksize, 1594 progrès=progrès,
rembourrage=rembourrage,
-> 1595 data_format=data_format, nom=nom) 1596 résultat de retour en 1597

/usr/local/lib/python2.7/dist-packages/tensorflow/python/cadre/op_def_library.pyc
dans apply_op(auto, op_type_name, nom, **mots-clés)
747 op = g.create_op(op_type_name, les entrées, les output_types, nom=portée,
748 input_types=input_types, attrs=attr_protos,
--> 749 op_def=op_def)
750 sorties = op.sorties
751 retour _Restructure(fpo.convert_n_to_tensor(sorties),

/usr/local/lib/python2.7/dist-packages/tensorflow/python/cadre/fpo.pyc
dans create_op(auto, op_type, les entrées, les dtypes, input_types, nom, attrs,
op_def, compute_shapes, compute_device) 2388
original_op=auto._default_original_op, op_def=op_def) 2389 si
compute_shapes:
-> 2390 set_shapes_for_outputs(ret) 2391 auto._add_op(ret) 2392
auto._record_op_seen_by_control_dependencies(ret)

/usr/local/lib/python2.7/dist-packages/tensorflow/python/cadre/fpo.pyc
dans set_shapes_for_outputs(op) 1783 élever RuntimeError("Pas de
la forme de la fonction enregistrée pour la norme op: %s" 1784
% d'op.type)
-> 1785 formes = shape_func(op) 1786 si les formes n'est: 1787 élever RuntimeError(

/usr/local/lib/python2.7/dist-packages/tensorflow/python/cadre/common_shapes.pyc
dans call_cpp_shape_fn(op, input_tensors_needed, debug_python_shape_fn)
594 état)
595 sauf erreurs.InvalidArgumentError comme erreur:
--> 596 raise ValueError(err.le message)
597
598 # Convertir TensorShapeProto valeurs dans output_shapes.

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

OriginalL'auteur Pranay Mathur | 2016-10-02