it-swarm.com.de

Keras Convolution2D-Eingabe: Fehler beim Überprüfen der Modelleingabe: Konvolution2d_input_1 erwartete Form

Ich arbeite durch dieses großartige Tutorial zum Erstellen eines Image-Klassifikators mit Keras. Nachdem ich das Modell trainiert habe, speichere ich es in einer Datei und lade es später erneut in ein Modell in einem unten gezeigten Testskript.

Ich erhalte die folgende Ausnahme, wenn ich das Modell mit einem neuen, nie zuvor gesehenen Bild auswerte:

Error:

Traceback (most recent call last):
  File "test_classifier.py", line 48, in <module>
    score = model.evaluate(x, y, batch_size=16)
  File "/Library/Python/2.7/site-packages/keras/models.py", line 655, in evaluate
    sample_weight=sample_weight)
  File "/Library/Python/2.7/site-packages/keras/engine/training.py", line 1131, in evaluate
    batch_size=batch_size)
  File "/Library/Python/2.7/site-packages/keras/engine/training.py", line 959, in _standardize_user_data
exception_prefix='model input')
  File "/Library/Python/2.7/site-packages/keras/engine/training.py", line 108, in standardize_input_data
str(array.shape))
Exception: Error when checking model input: expected convolution2d_input_1 to have shape (None, 3, 150, 150) but got array with shape (1, 3, 150, 198)`

Ist das Problem mit dem von mir trainierten Modell oder mit der Art und Weise, wie ich die Auswertemethode aufrufe?

Code:

    from keras.preprocessing.image import ImageDataGenerator
    from keras.models import Sequential
    from keras.layers import Convolution2D, MaxPooling2D
    from keras.layers import Activation, Dropout, Flatten, Dense
    from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

    import numpy as np
    img_width, img_height = 150, 150
    train_data_dir = 'data/train'
    validation_data_dir = 'data/validation'
    nb_train_samples = 2000
    nb_validation_samples = 800
    nb_Epoch = 5
    model = Sequential()
    model.add(Convolution2D(32, 3, 3, input_shape=(3, img_width, img_height)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Convolution2D(32, 3, 3))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Convolution2D(64, 3, 3))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Flatten())
    model.add(Dense(64))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    model.compile(loss='binary_crossentropy',
          optimizer='rmsprop',
          metrics=['accuracy'])
    model.load_weights('first_try.h5')
    img = load_img('data/test2/ferrari.jpeg')
    x = img_to_array(img)  # this is a Numpy array with shape (3, 150, 150)
    x = x.reshape( (1,) + x.shape )  # this is a Numpy array with shape (1, 3, 150, 150)
    y = np.array([0])
    score = model.evaluate(x, y, batch_size=16)`
7
JessicaOwensby

Das Problem war zweifach:

  1. Das Testbild hatte die falsche Größe. Es war 150 x 198 und musste 150 x 150 sein.

  2. Ich musste die dichte Schicht von model.add(Dense(10)) in model.add(Dense(1)) ändern.

Ich verstehe noch nicht, wie ich das Modell dazu bringen kann, mir die Vorhersage zu geben, aber jetzt läuft die Modellbewertung.

1
JessicaOwensby

Das Problem liegt in der falschen Größe der Testbilder. Für mich,

train_datagen.flow_from_directory(
        'C:\\Users\\...\\train',  # this is the target directory
        target_size=(150, 150),  # all images will be resized to 150x150
        batch_size=32,
        class_mode='binary')

funktionierte nicht richtig. Also habe ich einen matlab-Befehl verwendet, um die Größe aller Testbilder zu ändern

5
user7343629

Ich habe dasselbe Problem und verwende diese Funktion: Alle Bilder im Zielordner (.jpg und .png) werden in Höhe und Breite geändert. Und durch 255 dividiert. Außerdem wurde eine weitere Dimension hinzugefügt (erforderliche Eingabeform).

from scipy import misc
import os

def readImagesAsNumpyArrays(targetPath, i_height, i_width):
    files = os.listdir(targetPath)
    npList = list()
    for file in files:
        if ".jpg" or ".png" in str(file):
            path = os.path.join(targetPath, file)
            img = misc.imread(path)
            img = misc.imresize(img, (i_height, i_width))
            img = img * (1. / 255)
            img = img[None, :, :,: ]
            npList.append(img)
    return npList
0
Vitalii