webentwicklung-frage-antwort-db.com.de

Negative Dimensionsgröße, verursacht durch Subtraktion von 3 von 1 für 'conv2d_2/convolution'

Diese Fehlermeldung wurde bei der Deklaration der Eingabeebene in Keras angezeigt.

ValueError: Negative Bemaßungsgröße, die durch das Subtrahieren von 3 von 1 für .__ verursacht wird. 'conv2d_2/convolution' (op: 'Conv2D') mit Eingabeformen: [?, 1,28,28], [3,3,28,32].

Mein Code ist so

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

Beispielanwendung: https://github.com/IntellijSys/tensorflow/blob/master/Keras.ipynb

7
Mohammad Nurdin

Standardmäßig erwartet Convolution2D ( https://keras.io/layers/convolutional/ ), dass die Eingabe im Format (Samples, Zeilen, Cols, Channels) vorliegt. Dies ist "channels last". Ihre Daten scheinen in dem Format (Samples, Channels, Zeilen, Spalten) zu sein. Sie sollten dies mit dem optionalen Schlüsselwort data_format = 'channels_first' beheben können, wenn Sie den Convolution2D-Layer deklarieren.

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

Ich hatte das gleiche Problem und die Lösung in diesem Thread hat mir nicht geholfen. Nach langem Nachdenken fand ich die Lösung, die es in meinem Fall gelöst hat.

Um zu beginnen, hier ist mein Code (ich weiß, dass es nicht gut ist, ich lerne immer noch)

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

Und erst nachdem ich jede Möglichkeit durchgegangen war, fand ich den Fehler:

Die Bildgröße ist 32 x 32. Nach der ersten Faltungsschicht haben wir sie um 30 auf 30 reduziert (ich denke, wenn ich die Faltung richtig verstanden habe) 

Dann reduziert die Pooling-Schicht sie um die Hälfte, also 15 mal 15.

Und so weiter .. Am Ende ist meine Feature-Map so klein, dass meine Pooling-Ebene (oder Faltungs-Layer) zu groß ist, um darüber zu gehen - und den Fehler verursacht

Somit konnte der Fehler leicht gelöst werden, indem die Bildgröße vergrößert wurde oder Faltungs- oder Pooling-Ebenen reduziert wurden.

6
charel-f

Keras ist mit folgender Backend-Kompatibilität verfügbar:

TensorFlow: Durch google Theano: Entwickelt von Lisa lab, CNTK: Von Microsoft

Wenn Sie einen Fehler mit [?, X, X, X], [X, Y, Z, X] sehen, ist dies ein Kanalproblem, um dieses Problem zu beheben, verwenden Sie den automatischen Modus von Keras:

Einführen

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

"tf" -Format bedeutet, dass die Faltungskerne die Form haben (Zeilen, Spalten, input_depth, Tiefe).

Das wird immer funktionieren ...

2
Reeves