Глубокое обучение и нейронная сеть - PullRequest
1 голос
/ 30 января 2020
# 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%. что делать, чтобы он не мог предсказать изображения вне классов.

Ответы [ 3 ]

1 голос
/ 30 января 2020

Но когда я предсказываю это для house.jpg или laptop.jpg или изображений, отличных от этих 3-х классов, то это также предсказывает среди этих 3-х классов.

Это нормальное поведение, поскольку нейронная сеть в последнем слое

model.add(Dense(3, activation="softmax"))

возвращает вероятностей для каждого класса из вашей проблемы.

Итак, если вы используете laptop.jpg image может быть, он возвращает три малые вероятности, а самая большая дает выходные данные.

Поскольку вы не используете laptop изображений в вашем наборе training, то neural network не имеет никакого представления о it.

Одним из подходов может быть установка пороговой вероятности, скажем, 50%, и если никто из этих 3 вероятностей не превысит этот порог, выведите Unknown.

с другими Другими словами, если вы используете распределение softmax для своей классификации, то вы можете определить базовый уровень max probability для правильно классифицированных выборок, а затем сделать вывод, что для новой выборки нет 'б Относительно любого из ваших известных классов, если его максимальная вероятность ниже некоторого вида threshold.

Эта идея взята из исследования , в котором объясняется такая ситуация: Базовая линия для обнаружения примеров рассекреченных и не распространяемых в нейронных сетях

0 голосов
/ 30 января 2020

Вы все делаете хорошо. Если вы не предоставляете своей сети возможность выбрать другой класс для вашего ноутбука.jpg, ваша модель будет пытаться понять, имеет ли изображение этого ноутбука больше общего с кошкой, собакой или цветком. Допустим, с цветком ваша сеть может предсказать цветок класса для любого изображения ноутбука, которое вы ему дадите!

Пока :)

0 голосов
/ 30 января 2020

Ваша проблема в том, что в вашей сети есть только три варианта ("кошка", "собака" или "цветок").

Лучший способ go здесь - добавить четвертую опцию ("Неизвестно" ").

Поэтому вам необходимо добавить несколько случайных картинок к вашим тренировочным данным с пометкой" Неизвестно ". Конечно, эти картинки не должны содержать кошек, собак или цветов.

Таким образом, ваша сеть не только учится предсказывать заданные объекты, но и учится определять, нет ли на снимке ни одного из известных объектов.

Чаще говоря: Вы должны обучить свою сеть как можно ближе к ее практическому применению .

В вашем случае: почему у вас есть house.jpg, но вы не используете его для обучения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...