Ich erstelle mein Datensatz manuell aus einer Anzahl von 384 x 286 Schwarzweißbildern.
Ich lade ein Bild wie folgt:
x = []
for f in files:
img = Image.open(f)
img.load()
data = np.asarray(img, dtype="int32")
x.append(data)
x = np.array(x)
dies führt dazu, dass x ein Array ist (num_samples, 286, 384)
print(x.shape) => (100, 286, 384)
ich lese die Keras-Dokumentation und überprüfe mein Backend. Ich sollte dem Faltungsschritt eine input_shape bereitstellen, die aus (Zeilen, Spalten, Kanälen) besteht.
da ich die Stichprobengröße nicht willkürlich kenne, hätte ich erwartet, als Eingabegröße zu übergeben, ähnlich wie in
( None, 286, 384, 1 )
das Modell ist wie folgt aufgebaut:
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
# other steps...
das Übergeben als input_shape (286, 384, 1) bewirkt:
Fehler beim Prüfen der Eingabe: Es wurde erwartet, dass conv2d_1_input 4 Dimensionen hat, aber ein Array mit der Form (85, 286, 384) erhalten hat.
das Übergeben von as_input_shape (None, 286, 384, 1) verursacht:
Die Eingabe 0 ist mit der Schicht conv2d_1 nicht kompatibel: erwartet ndim = 4, gefunden ndim = 5
was mache ich falsch ? Wie muss ich das Eingabearray umformen?
Setzen Sie den input_shape
auf (286.384,1). Nun erwartet das Modell eine Eingabe mit 4 Dimensionen. Das bedeutet, dass Sie Ihr Image mit .reshape(n_images, 286, 384, 1)
umformen müssen. Jetzt haben Sie eine zusätzliche Dimension hinzugefügt, ohne die Daten zu ändern, und Ihr Modell kann nun ausgeführt werden. Grundsätzlich müssen Sie Ihre Daten in (n_images
, x_shape
, y_shape
, n_steps
) umformen.
Überprüfen Sie das Beispiel unten.
Das Coole ist, dass Sie auch ein RGB-Bild als Eingabe verwenden können. Ändern Sie einfach n_steps
in 3.
import numpy as np
from keras.models import Sequential
from keras.layers.convolutional import Convolution2D
from keras.layers.core import Flatten, Dense, Activation
from keras.utils import np_utils
#Create model
model = Sequential()
model.add(Convolution2D(32, kernel_size=(3, 3), activation='relu', input_shape=(286,384,1)))
model.add(Flatten())
model.add(Dense(2))
model.add(Activation('softmax'))
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
#Create random data
n_images=100
data = np.random.randint(0,2,n_images*286*384)
labels = np.random.randint(0,2,n_images)
labels = np_utils.to_categorical(list(labels))
#add dimension to images
data = data.reshape(n_images,286,384,1)
#Fit model
model.fit(data, labels, verbose=1)
ihre input_shape-Dimension ist korrekt, dh input_shape (286, 384, 1)
formiere dein input_image auf 4D um
input_image=input_image.reshape(85,286, 384,1)
während
model.fit(input_image,label)
Ich denke, das Folgende könnte Ihren Fehler beheben.
input_shape, das wir für first conv2d (erste Schicht des sequentiellen Modells) bereitstellen, sollte etwa (286,384,1) oder (Breite, Höhe, Kanäle) sein. Es ist keine Dimension "Keine" für batch_size erforderlich.
Die Form Ihrer Eingabe kann sein (batch_size, 286,384,1)
Hilft Ihnen das?