Как извлечь результаты прогнозов после обучения мультикласса? - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь провести мультиклассовую классификацию изображений в стиле VGG, но, к сожалению, я не могу достичь своей цели, и мне кажется, что в моем коде есть глупая ошибка.

У меня почти 16K изображений с 4 категории, скажем 1,2,3 and 4. С помощью следующего кода я импортирую все изображения. Я не хочу писать для каждой категории, чтобы не делать огромный пост. 4 раза такие строки:

path_101 = ("/media/data/working_dir/categories/101/")
train_101 = []
for png in os.listdir(path_101):
    imageread = img.imread(path_101+png)
    imageread = cv2.resize(imageread, (320,240)) #resizing
    train_101.append(imageread)

После того, как я объединю их в одну x_data переменную.

x_data = np.concatenate((train_101, train_102, train_104, train_105), axis=0)

После этого я создаю свои категориальные данные и выполняю кодирование One Hot:

# We create our classify data. 
one = np.ones(len(train_101))
four = np.ones(len(train_104)) +3
two = np.ones(len(train_102)) + 1
five = np.ones(len(train_105)) + 4

y = np.concatenate((one, two, four, five), axis= 0).reshape(-1,1)

from sklearn.preprocessing import OneHotEncoder
labels=OneHotEncoder(categories = "auto", handle_unknown = "ignore")
y=labels.fit_transform(y).toarray()

И после всего этого я выполняю обучающую часть, как вы можете видеть ниже:

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x_data, y, test_size = 0.2)
# import Keras and layers libraries
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPool2D , Flatten

model = Sequential()
model.add(Conv2D(input_shape=(240,320,3),filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(Conv2D(filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Flatten())
model.add(Dense(units=512,activation="relu"))
model.add(Dense(units=64, activation="relu"))
model.add(Dense(units=4, activation="softmax"))
model.add(Dense(units=4, activation="softmax"))

from keras.optimizers import Adam
opt = Adam(lr=0.001)
model.compile(optimizer=opt , loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])

model.fit(x_train, y_train, verbose=1, epochs=5, validation_split=0.2)

results = model.evaluate(x_test, y_test, batch_size=64)

После того, как у меня были ужасные результаты, такие как 25% точности. И для каждой эпохи оно не менялось. Я учил, что, возможно, мои результаты тренировок идут не очень хорошо. Я пытаюсь предсказать каждое сотое изображение моего начального БД с помощью этого кода:

prs=[]
for k in np.arange(1,15000,100):
    imgg=x_data[k]
    imgg=imgg[np.newaxis,...]
    pr=model.predict_classes(imgg)
    prs.append(pr[0])
print(prs)

И я получал только 0 или 2 с в зависимости от класса, в котором больше входных изображений. Так что с этим что-то не так.

Я новичок в нейронных сетях и, возможно, я занимался любительскими вещами. Как я могу иметь класс 0, если мои данные были закодированы в горячем виде 1,2,4 and 5? Я думал о переменной y, если я тренировался с одноразовым кодированием, может, мне стоит декодировать для предсказаний или что?

Заранее спасибо! Не стесняйтесь спрашивать подробности

...