web-dev-qa-db-fra.com

Taille de dimension négative provoquée par la soustraction de 3 de 1 pour 'conv2d_2/convolution'

J'ai reçu ce message d'erreur lors de la déclaration de la couche d'entrée dans Keras.

ValueError: taille de dimension négative provoquée par la soustraction de 3 de 1 pour 'conv2d_2/convolution' (op: 'Conv2D') avec des formes en entrée: [?, 1,28,28], [3,3,28,32].

Mon code est comme ça

model.add(Convolution2D(32, 3, 3, activation='relu', input_shape=(1,28,28)))

Exemple d'application: https://github.com/IntellijSys/tensorflow/blob/master/Keras.ipynb

7
Mohammad Nurdin

Par défaut, Convolution2D ( https://keras.io/layers/convolutional/ ) s’attend à ce que l’entrée soit au format (échantillons, lignes, colonnes, canaux), qui est "channel-last". Vos données semblent être dans le format (échantillons, canaux, lignes, colonnes). Vous devriez pouvoir résoudre ce problème en utilisant le mot clé facultatif data_format = 'channels_first' lors de la déclaration du calque Convolution2D.

model.add(Convolution2D(32, (3, 3), activation='relu', input_shape=(1,28,28), data_format='channels_first'))
17
ml4294

J'ai eu le même problème et la solution fournie dans ce fil ne m'a pas aidé… .. Après de longues réflexions, j'ai trouvé la solution qui l'a résolu dans mon cas.

Pour commencer, voici mon code (je sais que ce n'est pas bon, j'apprends encore)

imageSize=32
classifier=Sequential() 

classifier.add(Conv2D(64, (3, 3), input_shape = (imageSize, imageSize, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu')) 
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu')) 
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu')) 
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Flatten())

Et seulement après avoir passé en revue toutes les possibilités, j'ai trouvé l'erreur:

La taille de l'image est de 32 sur 32. Après la première couche de convolution, nous l'avons réduite à 30 sur 30 (je pense, si j'ai bien compris la convolution). 

Ensuite, la couche de regroupement le réduit de moitié, donc 15 sur 15 ..

Et ainsi de suite. Au final, ma carte de fonctionnalités est si petite que ma couche de pooling (ou couche de convolution) est trop grande pour la survoler - et cause l'erreur

Ainsi, l’erreur a été facilement résolue en augmentant la taille de l’image ou en réduisant les couches de convolution ou de regroupement.

6
charel-f

Keras est disponible avec la compatibilité backend suivante:

TensorFlow: Par Google, Theano: Développé par Lisa Lab, CNTK: Par Microsoft

Chaque fois que vous voyez une erreur avec [?, X, X, X], [X, Y, Z, X], c'est un problème de canal pour corriger cette utilisation du mode automatique de Keras:

Importation

from keras import backend as K
K.set_image_dim_ordering('th')

Le format "tf" signifie que les noyaux convolutifs auront la forme (lignes, colonnes, entrée_depth, profondeur)

Cela fonctionnera toujours ...

2
Reeves