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
Vous devez vous connecter pour publier un commentaire.
Citant une réponse mentionné dans github, vous devez spécifier la dimension de la commande:
Keras est un wrapper sur Théano ou Tensorflow bibliothèques. Keras utilise le paramètre variable
image_dim_ordering
de décider si la couche d'entrée est Théano ou Tensorflow format. Ce paramètre peut être spécifié dans les 2 sens -'tf'
ou'th'
dans~/.keras/keras.json
commeimage_dim_ordering: 'th'
. Note: ceci est un fichier json.image_dim_ordering
dans votre modèle comme suit:model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))
Annexe:
image_dim_ordering
dans'th'
de mode, les canaux de dimension (la profondeur) est à l'index 1 (par exemple 3, 256, 256). Dans'tf'
mode est à l'indice 3 (par exemple, 256, 256, 3). Citant @naoko de commentaires.n'a pas remarqué que!
Remarque:
dim_ordering
, Dans'th'
mode, les canaux de dimension (la profondeur) est à l'index 1, dans'tf'
mode est à l'indice 3. Pour tensorflow 0.10 serait d'utiliser "tf" (par défaut) et 0,11 serait d'utiliser "th". Vous pouvez régler ce problème en~/.keras/keras.json
En vous à l'annexe, n'est-ce pas l'Indice 0 et l'Indice 2 au lieu de 1 et 3?
OriginalL'auteur Srikar Appalaraju
Vous utilisez l'entrée de la forme (3,x,y), changez input_shape=x,y,3
ValueError: Negative dimension size caused by subtracting 3 from 1 for 'conv2d_2/convolution' (op: 'Conv2D') with input shapes: [?,20,1,32], [3,3,32,32].
OriginalL'auteur hello
Pour keras avec TensorFlow essayer suivantes:
OriginalL'auteur user1662255
j'ai aussi rencontré le même problème lors du chargement d'une par-formés VGG modèle. donc j'ai juste pris le transposer des images de test. la commande est donnée ci-dessous:
kerasImage = kerasImage.transpose(1,2,0)
OriginalL'auteur Khan
La accepté de répondre à des œuvres. Mais vous pouvez également effectuer les opérations suivantes:
Keras suppose d'entrée à
(width, height, channels)
pour TensorFlow backend et(channel, width, height)
pour Théano backend. Depuis votreinput_shape=(3,224,224)
, en précisantdata_format='channels_last'
devrait faire l'affaire.OriginalL'auteur Anakin
Ajoutant
dim_ordering
résolu d'erreur pour moi:OriginalL'auteur rishirich76