“在幾分鍾內建立一個深度學習模型?訓練需要幾個小時!我甚至沒有一台足夠好的機器。“我曾經無數次地聽過數據科學家這樣的抱怨,他們不願在自己的機器上建立深度學習模型。
事實上,完全可以在幾分鍾內從頭開始構建自己的神經網絡,而無需租用大型服務器。 Fast.ai的學生在18分鍾內在Imagenet數據集上設計了一個模型 – 我將在本文中展示類似的內容。
深度學習是一個廣闊的領域,因此我們將縮小我們的注意力並聚焦在解決圖像分類項目的挑戰。此外,我們將使用一個非常簡單的深度學習架構來獲得令人印象深刻的準確度分數。
您可以將本文中看到的Python代碼視為構建圖像分類模型的基準。一旦掌握了這個概念,就可以繼續使用代碼,參加比賽並登上排行榜前列!
如果您剛接觸深度學習並且對計算機視覺領域著迷(誰不是?!),請查看’使用深度學習的計算機視覺‘當然。
目錄
- 什麽是圖像分類及其用例
- 設置圖像數據的結構
- 打破模型構建過程
- 設置問題陳述和理解數據
- 構建圖像分類模型的步驟
- 迎接另一個挑戰
什麽是圖像分類?
考慮下麵的圖像:
你會立即認出它 – 它是一輛(時髦的)汽車。退後一步,分析你是如何得出這個結論的 – 你被展示了一個圖像,你將它所屬的類別分類(在這種情況下是一輛汽車)。簡而言之,這就是圖像分類的全部意義所在。
手動檢查和分類圖像是一個非常繁瑣的過程。當我們麵對大量的圖像,比如10000張或甚至100,000張時,任務變得幾乎不可能。如果我們能夠自動完成整個過程並根據相應的類快速標記圖像,那將會有多大用處?
自動駕駛汽車是了解現實世界中圖像分類使用的一個很好的例子。為了實現自動駕駛,我們可以構建一種圖像分類模型,用於識別道路上的各種物體,例如車輛,人,移動物體等。
接下來讓我們深入探討如何構建圖像分類模型,它的先決條件是什麽,以及如何在Python中實現它。
設置圖像數據結構
我們的數據需要采用特定格式才能解決圖像分類問題。
您應該有2個數據文件,一個用於訓練,另一個用於測試集。在訓練集中,您將擁有.csv文件和圖像文件夾:
- .csv文件包含所有訓練圖像的名稱及其對應的真實標簽
- 圖像文件夾包含所有訓練圖像。
我們的測試集中的.csv文件與訓練集中的文件不同。此測試集.csv文件包含所有測試圖像的名稱,但它們不要有任何相應的標簽。我們的模型將根據訓練集中的圖像進行訓練,標簽預測將在測試集圖像上進行
如果您的數據不是上述格式,則需要相應地進行轉換。
打破模型構建過程
在深入研究Python代碼之前,讓我們花點時間了解一下圖像分類模型的設計方式。我們可以將這個過程大致分為4個階段。每個階段都需要一定的時間來執行:
- 加載數據和預處理數據 – 30%的時間
- 定義模型結構 – 10%的時間
- 訓練模型 – 50%的時間
- 性能評估 – 10%時間
讓我更詳細地解釋上述每個步驟。這部分是至關重要的,因為不是每個模型都是一步到位的。您需要在每次迭代後返回,調優您的步驟,然後再次運行它。深入了解基本概念將大大加快整個過程。
階段1:加載和預處理數據
就深度學習模型而言,數據是黃金(數據挖的天花板上數據本省)。如果您在訓練集中擁有大量圖像,則您的圖像分類模型將有更好的表現。此外,數據的形式根據我們使用的架構/框架而有所不同。
因此,關鍵數據預處理步驟(任何項目中永恒的重要步驟)。我強烈建議你去看看’Python中圖像處理的基礎知識‘了解更多有關預處理如何處理圖像數據的信息。
為了了解我們的模型如何對看不見的數據的執行效果,我們需要創建一個驗證集。這是通過劃分訓練集數據來完成的。
簡而言之,我們在訓練數據上訓練模型並在驗證數據上進行驗證。一旦我們對模型在驗證集上的性能感到滿意,我們就可以使用它來對測試數據進行預測。
此步驟所需的時間:2-3分鍾左右。
第2階段:定義模型的結構
這是我們深度學習模型構建過程中的另一個關鍵步驟。我們必須定義我們的模型的結構,並且需要回答以下問題:
- 我們想要多少個卷積層?
- 每層的激活函數應該是什麽?
- 每層應該有多少隱藏節點?
除此之外,還有很多需要考察的點。這些本質上是模型的超參數,它在決定預測的好壞方麵起著很大的作用。
我們如何決定這些超參數值?好問題!一個好主意是根據現有的研究/調查選擇這些值。另一個想法是不斷嘗試不同的值,直到找到最佳匹配,但這可能是一個非常耗時的過程。
此步驟所需的時間:需要1分鍾定義模型的體係結構。
第3階段:訓練模型
為了訓練模型,我們要求:
- 訓練圖像及其相應的真實標簽
- 驗證圖像及其相應的真實標簽(我們僅使用這些標簽來驗證模型,而不是在訓練階段)
我們還定義了此步驟中的epochs(將訓練數據完整跑一遍成為一個epoch)。對於初學者,我們將運行模型10個epochs(您可以稍後更改epochs的數量)。
此步驟所需的時間:由於訓練需要模型來學習結構,我們需要大約5分鍾完成這一步。
接下來可以做預測了!
第4階段:估計模型的性能
最後,我們加載測試數據(圖像)並在此處完成預處理步驟。然後,我們使用訓練模型預測這些圖像的類別。
此步驟所需的時間:~1分鍾。
設置問題和理解數據
我們將挑選一個非常酷的挑戰來理解圖像分類。我們要建立一個模型,可以根據服裝(襯衫,褲子,鞋子,襪子等)對一組給定的圖像進行分類。這實際上是許多電商零售商麵臨的問題,這使得它成為一個非常熱門的計算機視覺問題。
這一挑戰被稱為’識別服裝‘並且是我們對我們的DataHack平台實踐問題之一。您必須從上麵的鏈接注冊並下載數據集。
我們總共有70,000張圖像(28 x 28維),其中60,000張來自訓練集,10,000張來自測試集。根據服裝類型,訓練圖像已標記類別,總共10類。當然,測試圖像沒有標記。挑戰在於確定所有測試圖像中存在的服裝類型。
我們將在穀歌Colab建立我們的模型,因為它提供了免費的GPU來訓練我們的模型。
構建模型的步驟
是時候使用Python技能開始幹活了!
- 設置Google Colab
- 導入庫
- 加載和預處理數據 – (3分鍾)
- 創建驗證集
- 定義模型結構 – (1分鍾)
- 訓練模型 – (5分鍾)
- 做出預測 – (1分鍾)
讓我們詳細看一下每一步。
步驟1:設置Google Colab
由於我們從Google雲端硬盤鏈接導入數據,因此我們需要在Google Colab筆記本中添加幾行代碼。創建一個新的Python 3筆記本並編寫以下代碼塊:
!pip install PyDrive
這將安裝PyDrive。現在我們將導入一些必需的庫:
import os
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
接下來,我們將創建一個驅動器變量來訪問Google雲端硬盤:
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
要下載數據集,我們將使用Google雲端硬盤上傳文件的ID:
download = drive.CreateFile({'id': '1BZOv422XJvxFUnGh-0xVeSvgFgqVY45q'})
將上述代碼中的“id”替換為您的文件ID。現在我們將下載此文件並解壓縮:
download.GetContentFile('train_LbELtWX.zip') !unzip train_LbELtWX.zip
每次啟動筆記本時都必須運行這些代碼塊。
第2步:導入我們在模型構建階段需要的庫。
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
第3步:回想一下前麵討論過的預處理步驟。我們將在加載數據後在這裏使用它們。
train = pd.read_csv('train.csv')
接下來,我們將讀取所有訓練圖像,將它們存儲在列表中,最後將該列表轉換為numpy數組。
# We have grayscale images, so while loading the images we will keep grayscale=True, if you have RGB images, you should set grayscale as 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個類),我們將使用one-hot編碼目標變量。
y=train['label'].values
y = to_categorical(y)
第4步:從訓練數據創建驗證集。
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)
第5步:定義模型結構。
我們將創建一個具有2個卷積層,一個dense隱藏層和一個輸出層的簡單架構。
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'])
第6步:訓練模型。
在這一步中,我們將在訓練集圖像上訓練模型,並通過是否猜對了驗證集來驗證它。
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
第7步:做出預測!
我們最初將遵循我們在處理訓練數據時執行的步驟。加載測試圖像並使用。預測它們的類別,model.predict_classes()函數。
download = drive.CreateFile({'id': '1KuyWGFEpj7Fr2DgBsW8qsWvjqEzfoJBY'})
download.GetContentFile('test_ScVgIM0.zip')
!unzip test_ScVgIM0.zip
讓我們導入測試文件:
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)
# making predictions
prediction = model.predict_classes(test)
我們還將創建一個提交文件,以便在DataHack平台頁麵上傳(以查看我們的結果在排行榜上的表現)。
download = drive.CreateFile({'id': '1z4QXy7WravpSj-S4Cs9Fk8ZNaX-qh5HF'})
download.GetContentFile('sample_submission_I5njJSF.csv')
# creating submission file
sample = pd.read_csv('sample_submission_I5njJSF.csv')
sample['label'] = prediction
sample.to_csv('sample_cnn.csv', header=True, index=False)
下載這個sample_cnn.csv提交並上傳到比賽頁麵以生成結果並檢查排行榜上的排名。這將為您提供基準解決方案,幫助您開始解決任何圖像分類問題!
您可以嘗試使用超參數調整和正則化技術來進一步提高模型的性能。建議你查看這篇文章,以更詳細地了解這個調優(fine-tuning)步驟 – ‘從頭開始學習卷積神經網絡的綜合教程”。
挑選不同的挑戰
讓我們在不同的數據集上測試我們的學習效果。這裏我們會實踐破解’識別數字‘。繼續下載數據集。在繼續之前,請嘗試自行解決此問題。你已經有了解決它的工具 – 你隻需要應用它們!
在這個挑戰中,我們需要識別給定圖像中的數字。我們共有70,000張圖像 – 訓練集中49,000個標記圖像,測試集中剩餘21,000個圖像(測試圖像未標記)。我們需要識別/預測這些未標記圖像的類別。
準備開始了嗎?真棒!創建一個新的Python 3筆記本並運行以下代碼:
# Setting up Colab
!pip install PyDrive
import os
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
# Replace the id and filename in the below codes
download = drive.CreateFile({'id': '1ZCzHDAfwgLdQke_GNnHp_4OheRRtNPs-'})
download.GetContentFile('Train_UQcUa52.zip')
!unzip Train_UQcUa52.zip
# Importing libraries
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')
# Reading the training images train_image = [] for i in tqdm(range(train.shape[0])): img = image.load_img('Images/train/'+train['filename'][i], 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)
# Creating the target variable
y=train['label'].values
y = to_categorical(y)
# Creating validation set X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)
# Define the model structure
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'))
# Compile the model model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
# Training the model
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
download = drive.CreateFile({'id': '1zHJR6yiI06ao-UAh_LXZQRIOzBO3sNDq'})
download.GetContentFile('Test_fCbTej3.csv')
test_file = pd.read_csv('Test_fCbTej3.csv')
test_image = []
for i in tqdm(range(test_file.shape[0])):
img = image.load_img('Images/test/'+test_file['filename'][i], 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)
download = drive.CreateFile({'id': '1nRz5bD7ReGrdinpdFcHVIEyjqtPGPyHx'})
download.GetContentFile('Sample_Submission_lxuyBuB.csv')
sample = pd.read_csv('Sample_Submission_lxuyBuB.csv')
sample['filename'] = test_file['filename']
sample['label'] = prediction
sample.to_csv('sample.csv', header=True, index=False)
在練習題頁麵上提交此文件以獲得相當不錯的準確度數字。這是一個良好的開端,但總有改進的餘地。繼續調整超參數值,看看你是否可以改進我們的基本模型。
後記
誰說深度學習模型需要數小時或數天來訓練。我的目標是展示你可以在短時間內搞定一個相當不錯的深度學習模型。您應該接受類似的挑戰,並嘗試編碼。沒有什麽比邊學邊做更有效了!