Как реализовать неизвестный класс в нейронных сетях глубокого обучения? - PullRequest
0 голосов
/ 27 февраля 2020

Я работаю над многоклассовой классификацией вредителей. У меня есть 10 классов насекомых для идентификации. Но требование проекта также должно включать неизвестный класс, т. Е. Если поступает какой-либо вход, который не принадлежит ни одному из 10 классов, модель должна классифицировать его как «неизвестный класс». Я не могу определить этот неизвестный класс. Если у кого-нибудь есть идеи, пожалуйста, помогите мне. Нет, я не использовал ни одного примера «неизвестного класса». На самом деле это неосуществимо, поскольку есть неограниченное количество вещей, которые могут выйти за пределы 10 класса, который я имею, который можно рассматривать как «неизвестный класс». Ниже мой код:

import pandas as pd
import numpy as np
import os
import keras
import matplotlib.pyplot as plt
from keras.layers import Dense,GlobalAveragePooling2D
from keras.applications import MobileNet, ResNet50, InceptionResNetV2
from keras.preprocessing import image
from keras.applications.mobilenet import preprocess_input
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Model
from keras.optimizers import Adam

base_model=ResNet50(weights='imagenet',include_top=False)

x=base_model.output
x=GlobalAveragePooling2D()(x)
x=Dense(1024,activation='relu')(x)
x=Dense(1024,activation='relu')(x)
x=Dense(512,activation='relu')(x) 
preds=Dense(10,activation='softmax')(x)

model=Model(inputs=base_model.input,outputs=preds)
class_names = ["acronicta_tridens_caterpillar", "helicoverpa_A",
"helicoverpa_B","helicoverpa_C","helicoverpa_D","helicoverpa_E",
"helicoverpa_F","helicoverpa_H","horned_caterpillar",
"Thistle_Caterpillars"]

for layer in model.layers[:-4]:
    layer.trainable=False
for layer in model.layers[-4:]:
    layer.trainable=True

train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input) 
#included in our dependencies

train_generator=train_datagen.flow_from_directory('./project/', # this is 
where you specify the path to the main data folder
                                             target_size=(224,224),
                                             color_mode='rgb',
                                             batch_size=32,
                                             class_mode='categorical',
                                             shuffle=True)

model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics= 
['accuracy'])


step_size_train=train_generator.n//train_generator.batch_size
model.fit_generator(generator=train_generator,
               steps_per_epoch=step_size_train,
               epochs=5)

fn =  "insects.h5"
model.save_weights(fn)

import os
fn =  "insects.h5"
cwd = os.getcwd()
fn2 = cwd+"\\"+fn
print(fn2)
model.load_weights(fn2)

import cv2
gray = cv2.imread("insect1.jpg", cv2.IMREAD_COLOR)
print(gray.shape)
gray = cv2.resize(gray,(224, 224))
print(gray.shape)
pr = model.predict(gray.reshape(1, 224, 224, 3))
pr = model.predict(gray)
print(pr)
for i in range(len(pr)):
    z=[np.argmax(pr[i])]
    print("pr=%s, Predicted=%s" % (pr, z))
import matplotlib.pyplot as plt
plt.imshow(gray, cmap=plt.get_cmap("Spectral"))
cv2.imshow("", gray)
cv2.waitKey(0)

class_names = ["acronicta_tridens_caterpillar", "helicoverpa_A", 
"helicoverpa_B","helicoverpa_C","helicoverpa_D","helicoverpa_E",
"helicoverpa_F","helicoverpa_H","horned_caterpillar",
"Thistle_Caterpillars"]
o=class_names[z[0]]
print(o)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...