圖片從預處理到分類的過程

參考: 圖片預處理
分類

1. 圖片預處理

(1.1)建立2個文件夾

一個是訓練集文件夾,另一個是測試集文件夾

(1.2)訓練集文件夾

訓練集文件夾中有1個.csv文件和1個圖像文件夾,.圖像文件夾存放所有的訓練圖片,.csv文件存放圖片名稱,以及其對應的圖片標籤

(1.3)測試集文件夾

我們的測試集中的.csv文件不同於訓練集中的.csv文件。該測試集.csv文件包含所有測試圖像的名稱,但是它們沒有任何相應的標籤。你能猜出爲什麼嗎?我們的模型將在訓練集中存在的圖像上進行訓練,標籤預測將在測試集中的圖像上進行。

注意:如果您的數據不是上述格式,則需要對其進行相應的轉換(否則,預測將不正確且非常無用)

2. 加載和預處理數據

首先,需要創建一個驗證集。這是從訓練集劃分過來的。

簡而言之,我們在訓練數據上訓練模型,並在驗證數據上對其進行驗證。一旦對驗證集上的模型性能感到滿意,就可以將其用於對測試數據進行預測。

3. 定義模型結構

在定義模型結構之前,必須先知道幾個問題:
(a)我們想要多少個卷積層?
(b)每層的激活函數應該是什麼?
(c)每層應有多少個隱藏單元?

還有很多。這些本質上是模型的超參數,在決定預測的好壞方面起着巨大的作用。

我們如何確定這些超參數?

這是一個很好的問題!一個想法是根據現有的研究來選擇這些超參數。另一個想法是繼續嘗試這些值,直到找到最佳匹配爲止,但這可能是一個非常耗時的過程。

4. 訓練模型

爲了訓練模型,我們需要:
(a)訓練圖像及其對應的真實標籤
(b)驗證圖像及其相應的真實標籤(我們僅在訓練階段使用這些標籤來驗證模型,而未使用它們)

5.評估模型

最後,我們加載測試數據(圖像)並在此進行預處理步驟。然後,我們使用訓練好的模型來預測這些圖像的類別。

6.實現

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import to_categorical
from keras.preprocessing import image
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from tqdm import tqdm

#加載數據
train = pd.read_csv('train.csv')
#將訓練集的圖片轉成訓練的數據
#我們將讀取所有訓練圖像,將它們存儲在列表中,最後將該列表轉換爲numpy數組。
#我們具有灰度圖像,因此在加載圖像時,我們將保持灰度= True,如果您具有RGB圖像,則應將灰度設置爲False
train_image = []
for i in tqdm(range(train.shape[0])):
    img = image.load_img('train/'+train['id'][i].astype('str')+'.png', target_size=(28,28,1), grayscale=True)
    img = image.img_to_array(img)
    img = img/255
    train_image.append(img)
X = np.array(train_image)

#由於這是一個多類分類問題(10個類),我們將對標籤進行一次編碼。
y=train['label'].values
y = to_categorical(y)

#根據訓練集劃分出驗證集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)```

#定義模型結構
#定義2個卷積層,1一個全連接的隱藏層和輸出層
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=(28,28,1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

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

#訓練模型
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))

#預測數據
#讀取預測的數據
test = pd.read_csv('test.csv')
test_image = []
for i in tqdm(range(test.shape[0])):
    img = image.load_img('test/'+test['id'][i].astype('str')+'.png', target_size=(28,28,1), grayscale=True)
    img = image.img_to_array(img)
    img = img/255
    test_image.append(img)
test = np.array(test_image)

#開始預測
prediction = model.predict_classes(test)

#保持預測的結果
sample = pd.read_csv('sample_submission_I5njJSF.csv')
sample['label'] = prediction
sample.to_csv('sample_cnn.csv', header=True, index=False)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章