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)`
3 Réponses :
Le problème était deux fois: p>
L'image de test était la mauvaise taille. C'était 150 x 198 et devait être 150 x 150. P> Li>
Je devais changer la couche dense de 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. P> modèle.add (dense (10)) code> à
modèle.add (dense (1)) code>. p> li>
ol>
Vous pouvez accepter votre propre réponse comme accepté pour montrer que la question est résolue.
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')
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
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.