web-dev-qa-db-de.com

Keras input_shape für conv2d und manuell geladene Bilder

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?

6
Stormsson

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

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)
1
thefifthjack005

Ich denke, das Folgende könnte Ihren Fehler beheben.

  1. 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. 

  2. Die Form Ihrer Eingabe kann sein (batch_size, 286,384,1)

Hilft Ihnen das?

0
Harsha Pokkalla