首页 > 解决方案 > 多类训练后如何提取预测结果?

问题描述

我正在尝试使用 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% 的准确率等糟糕的结果之后。对于每个时代,它都没有改变。我教导说,也许我的训练输出并不顺利。我尝试使用以下代码预测初始数据库的每 100 个图像:

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如果我的 y 数据是一次性编码的,我怎么能上课1,2,4 and 5?我在考虑 y 变量,如果我用 one-hot 编码进行训练,也许我应该解码以进行预测或什么?

提前致谢!不要犹豫,询问详情

标签: pythontensorflowmachine-learningkerasneural-network

解决方案


推荐阅读