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.