8
votes

KERAS CONVOLUDE2D INPUT: Erreur lors de la vérification de la saisie du modèle: Convoled Convolution2D_Input_1 pour avoir la forme

Je travaille à travers Ce grand tutoriel sur la création d'un classificateur d'image à l'aide de Keras. Une fois que j'ai entraîné le modèle, je l'enregistre dans un fichier puis la rechargez plus tard dans un modèle dans un script de test ci-dessous.

Je reçois l'exception suivante lorsque j'évalue le modèle à l'aide d'un nouveau, jamais auparavant vu Image: P>

ERREUR: P>

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


2 commentaires

Vous avez commenté X = img_to_array (IMG) # Ceci est un tableau numpy avec forme (3, 150, 150) x = x.Reshape (((1,) + x.shape) # Il s'agit d'une matrice numpue avec forme (1, 3, 150, 150) mais le message d'erreur indique le contraire. Ce n'est pas une réponse complète mais, de déboguer, essayez de sortir la forme de votre entrée avant d'évaluer le modèle.


Merci. Cela a aidé. J'avais édité l'image pour être 150 x 150, mais aperçu de l'ajustement automatique de la hauteur à l'échelle avec la largeur; Donc, c'est là que le 198 est venu.


3 Réponses :


1
votes

Le problème était deux fois:

  1. L'image de test était la mauvaise taille. C'était 150 x 198 et devait être 150 x 150.

  2. Je devais changer la couche dense de modèle.add (dense (10)) à modèle.add (dense (1)) .

    Je ne comprends pas encore comment obtenir le modèle de me donner la prédiction, mais du moins maintenant, l'évaluation du modèle fonctionne.


1 commentaires

Vous pouvez accepter votre propre réponse comme accepté pour montrer que la question est résolue.



5
votes

Le problème est dû à la mauvaise taille des images de test. Pour moi,

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


0 commentaires

0
votes

J'ai le même problème et utilisez cette fonction: Toutes les images du dossier cible (.jpg et .png) seront redimensionnées à la hauteur et à la largeur. Et divisé par 255. Plus ajouté 1 dimension supplémentaire (forme d'entrée requise).

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 commentaires