# set the matplotlib backend so figures can be saved in the background
import matplotlib
matplotlib.use("Agg")
# import the necessary packages
from keras.layers.core import Dropout, Activation
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.optimizers import SGD
import matplotlib.pyplot as plt
from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint
from keras.layers import Dense, Conv2D, Flatten
from keras.layers.convolutional import MaxPooling2D
(trainX, testX, trainY, testY) = train_test_split(data,labels, test_size=0.25, random_state=42)
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)
#create model
model = Sequential()
#add model layers
model.add(Conv2D(32, kernel_size=3, activation="relu", input_shape=(32,32,3)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(32, kernel_size=3, activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, kernel_size=3, 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(3, activation="softmax"))
# initialize our initial learning rate and # of epochs to train for
INIT_LR = 0.001
EPOCHS = 500
opt = SGD(lr=INIT_LR, clipvalue=0.5)
model.compile(loss="categorical_crossentropy", optimizer=opt,metrics=["accuracy"])
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=200)
mc = ModelCheckpoint('best_model_500Epoch.h5', monitor='val_accuracy', mode='max', verbose=1, save_best_only=True)
H = model.fit(trainX, trainY, validation_data=(testX, testY),epochs=EPOCHS, batch_size=32,callbacks=[es, mc])
Использование следующего сценария для прогнозирования.
from keras.models import load_model
import pickle
import cv2
import os
import matplotlib.pyplot as plt
from keras import backend as k
new_model = load_model('model_name.h5')
lb = pickle.loads(open("Label_Binarizer", "rb").read())
dirName = "Other_than_class"
listOfFile = os.listdir(dirName)
# Iterate over all the entries
for entry in listOfFile:
# Create full path
fullPath = os.path.join(dirName, entry)
# If entry is a directory then get the list of files in this
directory
image = cv2.imread(fullPath)
output = image.copy()
image = cv2.resize(image, (32, 32))
# scale the pixel values to [0, 1]
image = image.astype("float") / 255.0
# check to see if we should flatten the image and add a batch
# dimension
image = image.flatten()
image = image.reshape((1, image.shape[0]))
# preds = new_model.predict(image)
preds = new_model.predict(image.reshape(1, 32, 32, 3))
print(preds[0])
k.clear_session()
# find the class label index with the largest corresponding
probability
i = preds.argmax(axis=1)[0]
label = lb.classes_[i]
plt.grid(False)
plt.imshow(output)
plt.xlabel("Actual: " + str(entry))
plt.title("Prediction: " + str(preds[0][i] * 100)+" "+str(label))
plt.show()
Я разработал модель с использованием вышеуказанной архитектуры для 3-х классов кошки, собаки и цветка. это дает хороший результат, когда я предсказываю любое невидимое изображение этих классов. но когда я предсказываю это для house.jpg или laptop.jpg или изображений, отличных от этих 3-х классов, тогда это также предсказывает среди этих 3-х классов, что так отвратительно. что я делаю не так?
Точность прогнозирования house.jpg или laptop.jpg также выше 85%. что делать, чтобы он не мог предсказать изображения вне классов.