偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

對(duì)比圖像分類五大方法:KNN、SVM、BPNN、CNN和遷移學(xué)習(xí)

開發(fā) 開發(fā)工具
本文是對(duì)五種用于圖像分類的方法(KNN、SVM、BP 神經(jīng)網(wǎng)絡(luò)、CNN 和遷移學(xué)習(xí))進(jìn)行的實(shí)驗(yàn)比較。

圖像分類是人工智能領(lǐng)域的基本研究主題之一,研究者也已經(jīng)開發(fā)了大量用于圖像分類的算法。近日,Shiyu Mou 在 Medium 上發(fā)表了一篇文章,對(duì)五種用于圖像分類的方法(KNN、SVM、BP 神經(jīng)網(wǎng)絡(luò)、CNN 和遷移學(xué)習(xí))進(jìn)行了實(shí)驗(yàn)比較,該研究的相關(guān)數(shù)據(jù)集和代碼也已經(jīng)被發(fā)布在了 GitHub 上。

項(xiàng)目地址:https://github.com/Fdevmsy/Image_Classification_with_5_methods

圖像分類,顧名思義,就是為輸入圖像打上固定類別的標(biāo)簽。這是計(jì)算機(jī)視覺(jué)領(lǐng)域的核心問(wèn)題之一。盡管聽起來(lái)很簡(jiǎn)單,但圖像分類有大量不同的實(shí)際應(yīng)用。

一、傳統(tǒng)方式:特征描述和檢測(cè)

特征描述和檢測(cè)

也許對(duì)一些樣本任務(wù)有好處,但實(shí)際情況要復(fù)雜得多。

特征描述和檢測(cè)

因此,我們并沒(méi)有通過(guò)代碼的形式直接指出每一類型的外觀(visual appearance),而是使用機(jī)器學(xué)習(xí)——為計(jì)算機(jī)提供每一類的諸多實(shí)例,接著開發(fā)學(xué)習(xí)算法觀察這些實(shí)例,并學(xué)習(xí)每一類的外觀。

然而,圖像分類如此復(fù)雜,以至于其處理經(jīng)常用到深度學(xué)習(xí)模型,比如 CNN(卷積神經(jīng)網(wǎng)絡(luò))。我們已經(jīng)知道,我們?cè)谡n堂上學(xué)習(xí)的不少算法(如 KNN、SVM)通常很擅長(zhǎng)數(shù)據(jù)挖掘;但是對(duì)于圖像分類,它們卻不是最佳選擇。

因此,我們將對(duì)課堂中學(xué)到的以及 CNN 和遷移學(xué)習(xí)等算法做一個(gè)對(duì)比。

二、目標(biāo)

我們的目標(biāo)是:

1. 把 KNN、SVM、BP 神經(jīng)網(wǎng)絡(luò)與業(yè)界處理圖像識(shí)別問(wèn)題的算法——CNN 和遷移學(xué)習(xí)——進(jìn)行對(duì)比。

2. 獲得深度學(xué)習(xí)經(jīng)驗(yàn)。

3. 通過(guò) TensorFlow 探索機(jī)器學(xué)習(xí)框架。

三、系統(tǒng)設(shè)計(jì) & 實(shí)現(xiàn)細(xì)節(jié)

1. 算法與工具

本項(xiàng)目使用的 5 個(gè)方法是 KNN、SVM、BP 神經(jīng)網(wǎng)絡(luò)、CNN 和遷移學(xué)習(xí)。

全項(xiàng)目可分為 3 類方法:

  • 第一類方法:使用 KNN、SVM、BP 神經(jīng)網(wǎng)絡(luò)這些課堂算法。這些算法強(qiáng)大易實(shí)現(xiàn)。我們主要使用 sklearn 實(shí)現(xiàn)這些算法。
  • 第二類方法:盡管傳統(tǒng)的多層感知器模型已成功應(yīng)用于圖像識(shí)別,但由于其節(jié)點(diǎn)之間的全連接性,它們?cè)庥隽司S度的難題,從而不能很好地?cái)U(kuò)展到更高分辨率的圖像。因此我們使用深度學(xué)習(xí)框架 TensorFlow 打造了一個(gè) CNN。
  • 第三個(gè)方法:重新訓(xùn)練一個(gè)被稱作 Inception V3 的預(yù)訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的最后一層,同樣由 TensorFlow 提供。Inception V3 是為 ImageNet 大型視覺(jué)識(shí)別挑戰(zhàn)賽訓(xùn)練的,使用了 2012 年的數(shù)據(jù)。這是計(jì)算機(jī)視覺(jué)的常規(guī)任務(wù),其中模型試圖把全部圖像分為 1000 個(gè)類別,比如斑馬、達(dá)爾阿提亞人和洗碗機(jī)。為了再訓(xùn)練這一預(yù)訓(xùn)練網(wǎng)絡(luò),我們要保證自己的數(shù)據(jù)集沒(méi)有被預(yù)訓(xùn)練。

2. 實(shí)現(xiàn)

第一類方法:預(yù)處理數(shù)據(jù)集,并使用 sklearn 實(shí)現(xiàn) KNN、SVM、BP 神經(jīng)網(wǎng)絡(luò)。

首先,我們使用 OpenCV 包定義了 2 個(gè)不同的預(yù)處理函數(shù):第一個(gè)是圖像到特征向量,它可以重調(diào)圖像大小,并把圖像轉(zhuǎn)化為行像素列表;第二個(gè)是提取顏色直方圖,即使用 cv2.normalize 從 HSV 顏色空間提取 3D 顏色直方圖,并平化(flatten)結(jié)果。

接著,建構(gòu)若干個(gè)我們需要解析的參數(shù)。由于想要同時(shí)測(cè)試整個(gè)數(shù)據(jù)集和帶不同數(shù)量標(biāo)簽的子數(shù)據(jù)集的精確度,我們構(gòu)建了一個(gè)作為參數(shù)的數(shù)據(jù)集并解析進(jìn)我們的程序。我們同樣構(gòu)建了用于 k-NN 方法的鄰元素?cái)?shù)作為解析參數(shù)。

之后,我們開始提取數(shù)據(jù)集中的每一圖像特征,并將其放入數(shù)組。我們使用 cv2.imread 讀取每一圖像,通過(guò)從圖像名稱中提取字符串來(lái)拆分標(biāo)簽。在我們的數(shù)據(jù)集中,我們使用相同格式——類別標(biāo)簽. 圖像序號(hào).jpg——設(shè)置名稱,因此我們可以輕易提取每張圖像的分類標(biāo)簽。接著我們使用這兩個(gè)函數(shù)提取 2 種特征并附加到數(shù)組 rawImages,而之前提取的標(biāo)簽附加到數(shù)組標(biāo)簽。

下一步是使用從 sklearn 包導(dǎo)入的函數(shù) train_test_split 拆分?jǐn)?shù)據(jù)集。這個(gè)集具有后綴 RI,RL 是 rawImages 和標(biāo)簽對(duì)的拆分結(jié)果,另一個(gè)是特征和標(biāo)簽對(duì)的拆分結(jié)果。我們使用 85% 的數(shù)據(jù)集作為訓(xùn)練集,余下的 15% 作為測(cè)試集。

最后,我們應(yīng)用 KNN、SVM、BP 神經(jīng)網(wǎng)絡(luò)函數(shù)評(píng)估數(shù)據(jù)。對(duì)于 KNN 我們使用 KNeighborsClassifier,對(duì)于 SVM 我們使用 SVC,對(duì)于 BP 神經(jīng)網(wǎng)絡(luò)我們使用 MLPClassifier。

第二類方法:使用 TensorFlow 構(gòu)建 CNN。TensorFlow 的全部目的在于使你打造一張計(jì)算圖(使用 Python 等語(yǔ)言),接著在 C++ 中執(zhí)行該圖(在相同計(jì)算量的情況下,C++比 Python 更高效)。

TensorFlow 也可自動(dòng)計(jì)算優(yōu)化圖變量所需的梯度,從而使模型表現(xiàn)更好。這是由于該圖由簡(jiǎn)單的數(shù)學(xué)表達(dá)式組合而成,因此可通過(guò)導(dǎo)數(shù)鏈?zhǔn)椒▌t計(jì)算全圖的梯度。

一張 TensorFlow 圖包含以下幾個(gè)部分,每一部分將在下文詳述:

  • 占位符變量,用于輸入數(shù)據(jù)到圖。
  • 優(yōu)化向量以使卷積網(wǎng)絡(luò)表現(xiàn)更好。
  • 卷積網(wǎng)絡(luò)的數(shù)學(xué)公式。
  • 可用于指導(dǎo)變量?jī)?yōu)化的成本衡量標(biāo)準(zhǔn)。
  • 更新變量的優(yōu)化方法。
  • CNN 架構(gòu)由一堆不同的層組成,這些層通過(guò)可微分函數(shù)可把輸入量轉(zhuǎn)化為輸出量。

因此,在我們的實(shí)現(xiàn)中,第一層是保存圖像,接著我們使用 2 x 2 最大池化和修正線性單元(ReLU)的構(gòu)建 3 個(gè)卷積層。輸入是 4 維張量:

  • 圖像序號(hào)。
  • 每一圖像的 Y 軸。
  • 每一圖像的 X 軸。
  • 每一圖像的通道(channel)。

輸出是另一個(gè) 4 維張量:

  • 圖像序號(hào),與輸入相同。
  • 每一圖像的 Y 軸。如果使用 2x2 池化,接著輸入圖像的高和寬除以 2。
  • 每一圖像的 X 軸。同上。
  • 由卷積濾波器生成的通道。

接著,我們我們?cè)诰W(wǎng)絡(luò)末端構(gòu)建了 2 個(gè)全連接層。輸入是一個(gè) 2 維的形狀張量 [num_images、num_inputs]。輸出也是一個(gè) 2 維的形狀張量 [num_images、num_outputs]

然而,為了連接卷積層和全連接層,我們需要一個(gè)平層(Flatten Layer)以把 4 維向量減少至可輸入到全連接層的 2 維。

CNN 末端通常是一個(gè) softmax 層,它可歸一化來(lái)自全連接層的輸出,因此每一元素被限制在 0 與 1 之間,并且所有元素總和為 1。

為了優(yōu)化訓(xùn)練結(jié)果,我們需要一個(gè)成本衡量標(biāo)準(zhǔn)并在每次迭代中將成本降至最少。這里我們使用的成本函數(shù)是交叉熵(tf.nn.oftmax_cross_entropy_with_logits()),并在所有的圖像分類中取交叉熵的平均值。優(yōu)化方法是 tf.train.AdamOptimizer(),它是梯度下降的高級(jí)形式。這是一個(gè)可被調(diào)節(jié)的參數(shù)學(xué)習(xí)率。

第三種方法:再訓(xùn)練 Inception V3?,F(xiàn)代目標(biāo)識(shí)別模型有數(shù)以百萬(wàn)計(jì)的參數(shù),并可能需要花費(fèi)數(shù)周的時(shí)間才能完全訓(xùn)練一個(gè)模型。遷移學(xué)習(xí)是一種采用在分類數(shù)據(jù)集(如 ImageNet)中已訓(xùn)練的模型而快速完成這一工作的方法,因?yàn)槠渲恍枰匦掠?xùn)練新類別的權(quán)重就行。雖然這樣的模型并沒(méi)有完全訓(xùn)練的模型表現(xiàn)好,但對(duì)于許多應(yīng)用來(lái)說(shuō),這是非常高效的,因?yàn)槠洳恍枰? GPU 并可以在筆記本上花半個(gè)小時(shí)就完成訓(xùn)練。

讀者可以點(diǎn)擊一下鏈接進(jìn)一步了解遷移學(xué)習(xí)的訓(xùn)練過(guò)程:https://www.tensorflow.org/tutorials/image_retraining

首先我們需要獲取預(yù)訓(xùn)練模型,并移除舊的頂層神經(jīng)網(wǎng)絡(luò),然后再基于我們的數(shù)據(jù)集重新訓(xùn)練一個(gè)輸出層。雖然貓的所有品種并沒(méi)有在原始 ImageNet 數(shù)據(jù)集和全訓(xùn)練的模型中體現(xiàn),但遷移學(xué)習(xí)的神奇之處就在于其可以利用已訓(xùn)練模型用來(lái)識(shí)別某些目標(biāo)的底層特征,因?yàn)榈讓犹卣骺梢栽诤芏嗖桓牡那闆r下應(yīng)用于很多識(shí)別任務(wù)。然后我們分析本地的所有圖片并計(jì)算每張的瓶頸值(bottleneck values)。因?yàn)槊繌垐D片在訓(xùn)練過(guò)程中重復(fù)使用了多次,所以計(jì)算每個(gè)瓶頸值需要花費(fèi)大量時(shí)間,但我們可以加快緩存這些瓶頸值,也就可以省去重復(fù)的計(jì)算。

該腳本將運(yùn)行 4000 次訓(xùn)練步。每一步從訓(xùn)練集中隨機(jī)選擇 10 張圖片,并從緩存中搜索其瓶頸值,然后再將它們訓(xùn)練最后一層以得到預(yù)測(cè)。這些預(yù)測(cè)會(huì)通過(guò)對(duì)比真實(shí)標(biāo)注值而通過(guò)反向傳播過(guò)程更新最后一層的權(quán)重。

四、實(shí)驗(yàn)

1. 數(shù)據(jù)集

Oxford-IIIT Pet 數(shù)據(jù)集:http://www.robots.ox.ac.uk/~vgg/data/pets/

該數(shù)據(jù)集有 25 種狗和 12 種貓。每一種類別有 200 張相片。我們?cè)谠擁?xiàng)目中只會(huì)使用 10 種貓。

數(shù)據(jù)集

在該項(xiàng)目中我們用的類別為 [斯芬克斯貓、暹羅貓、布偶貓、波斯貓、緬因貓、英國(guó)短毛貓、孟買貓、伯曼貓、孟加拉豹貓、阿比西尼亞貓]。

因此在數(shù)據(jù)集中我們總共有 2000 張圖片。雖然圖片的尺寸是不同的,但我們可以調(diào)整為固定的大小如 64x64 或 128x128。

2. 預(yù)處理

在該項(xiàng)目中,我們主要使用 OpenCV 對(duì)圖片進(jìn)行預(yù)處理,如讀取圖片放入陣列或調(diào)整為我們需要的大小等。

提升圖像訓(xùn)練結(jié)果的一個(gè)常用方法就是對(duì)訓(xùn)練輸入隨機(jī)進(jìn)行變形、裁剪或亮度調(diào)整處理。由于采用了同一圖片所有可能的變體,該方法不僅具有擴(kuò)展有效訓(xùn)練數(shù)據(jù)大小的優(yōu)點(diǎn),同時(shí)還傾向幫助網(wǎng)絡(luò)使用分類器學(xué)習(xí)處理所有在現(xiàn)實(shí)生活中可能出現(xiàn)的畸變。

具體請(qǐng)查看:https://github.com/aleju/imgaug.

3. 評(píng)估

(1) 第一個(gè)方法:第一部分為預(yù)處理數(shù)據(jù)集和使用 sklearn 應(yīng)用 KNN、SVM 和 BP 神經(jīng)網(wǎng)絡(luò)。

在程序中有很多參數(shù)可以調(diào)整:在 image_to_feature_vector 函數(shù)中,我們?cè)O(shè)置的圖片尺寸為 128x128,我們之前也嘗試過(guò)使用其他尺寸(如 8x8、 64x64、256x256)進(jìn)行訓(xùn)練。我們發(fā)現(xiàn)雖然圖片的尺寸越大效果越好,但大尺寸的圖片同樣也增加了執(zhí)行時(shí)間和內(nèi)存需求。因此我們最后決定使用 128x128 的圖片尺寸,因?yàn)槠洳⒉惶螅瑫r(shí)還保證了準(zhǔn)確度。

在 extract_color_histogram 函數(shù)中,我們將每個(gè)通道的二進(jìn)制值設(shè)置為 32,32,32。在先前的函數(shù)中,我們還嘗試了 8, 8, 8 和 64, 64, 64。雖然更高的數(shù)值能有更優(yōu)的結(jié)果,但同時(shí)也要求更長(zhǎng)的執(zhí)行時(shí)間,因此我們認(rèn)為 32,32,32 是比較合適的。

對(duì)于數(shù)據(jù)集,我們訓(xùn)練了 3 種。第一種是有 400 張圖片、2 種標(biāo)注的子數(shù)據(jù)集。第二種是有 1000 張圖片、5 種標(biāo)注的子數(shù)據(jù)集。最后一種是有 1997 張圖片、10 種標(biāo)注的全數(shù)據(jù)集。我們將不同的數(shù)據(jù)集解析為程序中的參數(shù)。

在 KNeighborsClassifier 中,我們只改變近鄰的數(shù)量并儲(chǔ)存每一種數(shù)據(jù)集最優(yōu) K 值的分類結(jié)果。其他所有參數(shù)都設(shè)為默認(rèn)。

在 MLPClassifier 中,我們?cè)O(shè)置每一個(gè)隱藏層有 50 個(gè)神經(jīng)元。我們確實(shí)測(cè)試了多個(gè)隱藏層,但好像對(duì)最后的結(jié)果沒(méi)有明顯的變化。最大的迭代次數(shù)設(shè)置為 1000,并且為了確保模型能夠收斂,我們?nèi)萑滩钤O(shè)置為 1e-4。同時(shí)還需要設(shè)置 L2 罰項(xiàng)的參數(shù) alpha 為默認(rèn)值,隨機(jī)狀態(tài)為 1,求解器設(shè)置為學(xué)習(xí)速率為 0.1 的「sgd」。

在 SVC 中,最大迭代次數(shù)為 1000,類別權(quán)重設(shè)置為「balanced」。

我們程序的運(yùn)行時(shí)間并不會(huì)太久,對(duì)于我們的三種數(shù)據(jù)集大概分別花 3 到 5 分鐘左右。

(2) 第二種方法:使用 TensorFlow 構(gòu)建 CNN

使用整個(gè)大數(shù)據(jù)集會(huì)需要很長(zhǎng)的時(shí)間計(jì)算模型的梯度,因此我們?cè)趦?yōu)化器每一次迭代中都只使用小批量的圖片更新權(quán)重,批量大小一般是 32 或 64。該數(shù)據(jù)集分為包含 1600 張圖片的訓(xùn)練集、包含 400 張圖片的驗(yàn)證集和包含 300 張圖片的測(cè)試集。

該模型同樣有許多參數(shù)需要調(diào)整。

首先是學(xué)習(xí)率。優(yōu)良的學(xué)習(xí)率因?yàn)槠渥銐蛐《苋菀琢钅P褪諗浚瑫r(shí)又足夠大令模型的收斂速度不至于太慢。所以我們選擇了 1 x 10^-4。

第二個(gè)需要調(diào)整的參數(shù)是投入到網(wǎng)絡(luò)的圖片尺寸。我們訓(xùn)練了 64x64 和 128x128 兩種圖片尺寸,結(jié)果表明尺寸越大模型精度就越高,但代價(jià)是運(yùn)行時(shí)間會(huì)更長(zhǎng)。

然后是神經(jīng)網(wǎng)絡(luò)層級(jí)數(shù)和它的形狀。然而實(shí)際上由于這一方面有太多的參數(shù)可以調(diào)整,所以很難在所有的參數(shù)間找到一個(gè)最優(yōu)值。

根據(jù)網(wǎng)上的很多資源,我們發(fā)現(xiàn)對(duì)于構(gòu)建神經(jīng)網(wǎng)絡(luò),參數(shù)的選擇很大一部分都是根據(jù)已有的經(jīng)驗(yàn)。

最開始,我們希望構(gòu)建相當(dāng)復(fù)雜的神經(jīng)網(wǎng)絡(luò),其所采用的參數(shù)如下:

  1. # Convolutional Layer 1. filter_size1 = 5 num_filters1 = 64 
  2. # Convolutional Layer 2. filter_size2 = 5 num_filters2 = 64 
  3. # Convolutional Layer 3. filter_size3 = 5 num_filters3 = 128 
  4. # Fully-connected layer 1. fc1_size = 256 
  5. # Fully-connected layer 2. fc1_size = 256 

我們采用 3 個(gè)卷積層和 2 個(gè)全連接層,它們的結(jié)構(gòu)都比較復(fù)雜。

然而,我們的結(jié)果是:過(guò)擬合。對(duì)于這樣的復(fù)雜網(wǎng)絡(luò),訓(xùn)練精度在迭代一千次后就達(dá)到了 100%,但測(cè)試精度僅僅只有 30%。最開始,我們十分疑惑為什么模型會(huì)過(guò)擬合,然后開始隨機(jī)調(diào)整參數(shù),但這時(shí)候模型的表現(xiàn)卻又變好了。幸好幾天后我碰巧讀到了 Google 在討論深度學(xué)習(xí)的一篇文章:https://medium.com/@blaisea/physiognomys-new-clothes-f2d4b59fdd6a 該文章指出他們所主導(dǎo)的項(xiàng)目是有問(wèn)題的:「一個(gè)技術(shù)性的問(wèn)題是如果少于 2000 個(gè)樣本,那么其是不足以訓(xùn)練和測(cè)試如同 AlexNet 那樣的卷積神經(jīng)網(wǎng)絡(luò)而不出現(xiàn)過(guò)擬合情況?!顾晕也乓庾R(shí)到我們的數(shù)據(jù)集實(shí)在是太小了,而網(wǎng)絡(luò)構(gòu)架又太復(fù)雜,這才產(chǎn)生了過(guò)擬合現(xiàn)象。

4. 我們的數(shù)據(jù)集正好包含 2000 張圖片

因此,我開始減少神經(jīng)網(wǎng)絡(luò)的層級(jí)數(shù)和核函數(shù)的大小。我嘗試調(diào)整了很多參數(shù),以下是我們最后使用的神經(jīng)網(wǎng)絡(luò)架構(gòu)參數(shù):

  1. # Convolutional Layer 1. filter_size1 = 5 num_filters1 = 64 
  2. # Convolutional Layer 2. filter_size2 = 3 num_filters2 = 64 
  3. # Fully-connected layer 1. fc1_size = 128 
  4. # Number of neurons in fully-connected layer. 
  5. # Fully-connected layer 2. fc2_size = 128 
  6. # Number of neurons in fully-connected layer. 
  7. # Number of color channels for the images: 1 channel for gray-scale. num_channels = 3 

我們僅僅使用 2 個(gè)小型的卷積層和 2 個(gè)全連接層。訓(xùn)練結(jié)果并不好,在迭代 4000 次后同樣出現(xiàn)了過(guò)擬合現(xiàn)象,但測(cè)試精度還是要比前面的模型高 10%。

我們?nèi)匀辉趯ふ医鉀Q的辦法,然而一個(gè)顯然易見的原因是我們的數(shù)據(jù)集實(shí)在是太小了,我們也沒(méi)有足夠的時(shí)間做更多的改進(jìn)。

作為最后的結(jié)果,我們?cè)?5000 次迭代后大概實(shí)現(xiàn)了 43% 的精度,該訓(xùn)練花了一個(gè)半小時(shí)。實(shí)際上,我們對(duì)這一結(jié)果比較沮喪,因此我們準(zhǔn)備使用另一標(biāo)準(zhǔn)數(shù)據(jù)集 CIFAR-10。

標(biāo)準(zhǔn)數(shù)據(jù)集

CIFAR-10 數(shù)據(jù)集由 60000 張 32x32 10 類彩色圖片,每一個(gè)類別都有 6000 張圖片。該數(shù)據(jù)集包含了 50000 張訓(xùn)練集和 10000 張測(cè)試集。

我們使用了和上面相同的神經(jīng)網(wǎng)絡(luò)架構(gòu),在 10 小時(shí)的訓(xùn)練后,我們?cè)跍y(cè)試集上實(shí)現(xiàn)了 78% 的準(zhǔn)確度。

(3) 第三種方法:再訓(xùn)練 Inception V3,我們隨機(jī)選取一些圖片進(jìn)行訓(xùn)練,而另一批圖片用于驗(yàn)證。

該模型同樣有許多參數(shù)需要調(diào)整。

首先是訓(xùn)練步,默認(rèn)值是 4000 步。我們也可以根據(jù)情況增加或減少以盡快獲得一個(gè)可接受的結(jié)果。

隨后是學(xué)習(xí)率,該參數(shù)控制了在訓(xùn)練期間更新至最后一層的量級(jí)。直觀地說(shuō),如果學(xué)習(xí)速率小,那么需要更多的時(shí)間進(jìn)行學(xué)習(xí),但最終其可能收斂到更優(yōu)的全局精度。訓(xùn)練批量大小控制了在一個(gè)訓(xùn)練步中檢查圖片的多少,又因?yàn)閷W(xué)習(xí)率應(yīng)用于每一個(gè)批量,如果能以更大的批量獲得相似的全局效果,我們需要減少它。

因?yàn)樯疃葘W(xué)習(xí)任務(wù)所需要的運(yùn)行時(shí)間通常很長(zhǎng),所以我們并不希望模型在訓(xùn)練幾小時(shí)后實(shí)際上表現(xiàn)很糟糕。所以我們需要經(jīng)常獲得驗(yàn)證精度的報(bào)告。這樣我們同樣可以避免過(guò)擬合。數(shù)據(jù)集的分割是將 80% 的圖片投入到主要的訓(xùn)練中,10% 的圖片作為訓(xùn)練期間經(jīng)常進(jìn)行的驗(yàn)證集,而剩下 10% 的圖片作為最終的測(cè)試集以預(yù)測(cè)分類器在現(xiàn)實(shí)世界中的表現(xiàn)。

五、結(jié)果

(1) 第一類方法:預(yù)處理數(shù)據(jù)集并使用 sklearn 實(shí)現(xiàn) KNN、SVM 和 BP 神經(jīng)網(wǎng)絡(luò)。

結(jié)果在下表中。由于 SVM 結(jié)果非常差,甚至低于隨機(jī)猜測(cè),我們不再展示其結(jié)果。

SVM

從結(jié)果中我們看到:

  • 在 k-NN 中,原始像素和直方圖精確度是相對(duì)等同的。在 5 個(gè)標(biāo)簽的子數(shù)據(jù)集,直方圖精確度比原始像素高一點(diǎn);但是整體來(lái)講,原始像素的結(jié)果更好。
  • 在神經(jīng)網(wǎng)絡(luò) MLP 分類器中,原始像素精確度遠(yuǎn)低于直方圖。對(duì)于整個(gè)數(shù)據(jù)集(10 個(gè)標(biāo)簽),原始像素精確度甚至低于隨機(jī)猜測(cè)。
  • 所有這 2 個(gè) sklearn 方法并沒(méi)有良好表現(xiàn),在整個(gè)數(shù)據(jù)集中(10 標(biāo)簽數(shù)據(jù)集)識(shí)別正確分類的精確度僅約有 24%。這些結(jié)果說(shuō)明,通過(guò) sklearn 分類圖像效果欠佳,它們?cè)谑褂枚鄠€(gè)類別分類復(fù)雜圖像時(shí)表現(xiàn)并不好。但是相比于隨機(jī)猜測(cè),它們確實(shí)有提升,只是還不夠。

基于以上結(jié)果,我們發(fā)現(xiàn)為了提升精確度,使用一些深度學(xué)習(xí)方法很必要。

(2) 第二類方法:使用 TensorFlow 構(gòu)建 CNN。如上所述,由于過(guò)擬合我們不能獲取好的結(jié)果。

使用 TensorFlow 構(gòu)建 CNN

正常情況下訓(xùn)練需要半個(gè)小時(shí),然而由于結(jié)果過(guò)擬合,我們認(rèn)為這一運(yùn)行時(shí)間并不重要。通過(guò)和第一類方法的比較,我們看到:盡管 CNN 過(guò)擬合訓(xùn)練數(shù)據(jù),我依然得到了更好的結(jié)果。

(3) 第三類方法:再訓(xùn)練 Inception V3

整個(gè)訓(xùn)練過(guò)程不超過(guò) 10 分鐘。我們獲得了極好的結(jié)果,并真正看到了深度學(xué)習(xí)和遷移學(xué)習(xí)的力量。

演示:

再訓(xùn)練 Inception V3

六、結(jié)論

基于以上比較,我們可以看到:

  • KNN、SVM 和 BP 神經(jīng)網(wǎng)絡(luò)對(duì)于某些特定圖像分類任務(wù)是不夠的。
  • 雖然我們會(huì)在 CNN 中過(guò)擬合,但這仍然比那些課堂方法要好。
  • 遷移學(xué)習(xí)在圖像分類問(wèn)題上效率很高,功能強(qiáng)大。它準(zhǔn)確快速,可以在短時(shí)間內(nèi)完成訓(xùn)練——而且不需要 GPU 的幫助。即使你只有一個(gè)很小的數(shù)據(jù)集,它也可以達(dá)到很好的效果,并且減少了過(guò)擬合的概率。

我們已經(jīng)從圖像分類任務(wù)中學(xué)到了很多,這類任務(wù)與課堂上的其他分類任務(wù)大不相同。數(shù)據(jù)集相對(duì)較大且稠密,需要的網(wǎng)絡(luò)十分復(fù)雜,且大多方法依賴于 GPU 的計(jì)算能力。

經(jīng)驗(yàn):

  • 裁剪或重調(diào)圖像,使其更小
  • 在訓(xùn)練的每個(gè)迭代中隨機(jī)選擇一個(gè)小 batch
  • 在驗(yàn)證集進(jìn)行驗(yàn)證的時(shí)候隨機(jī)選擇一個(gè)小 batch,在訓(xùn)練過(guò)程中頻繁記錄驗(yàn)證分?jǐn)?shù)
  • 可以使用 Image Augmentation 處理圖片,增大數(shù)據(jù)集體量
  • 對(duì)于圖像分類任務(wù),我們需要比 200 x 10 的更大的數(shù)據(jù)集,CIFAR-10 數(shù)據(jù)集包含 6 萬(wàn)張圖像。
  • 越復(fù)雜的網(wǎng)絡(luò)需要越大的數(shù)據(jù)集進(jìn)行訓(xùn)練
  • 小心過(guò)擬合

注: 第一種方法由 Ji Tong 實(shí)現(xiàn):https://github.com/JI-tong 

七、參考文獻(xiàn)

1. CS231n Convolutional Neural Networks for Visual Recognition:

ttp://cs231n.github.io/convolutional-networks/

2. TensorFlow Convolutional Neural Networks:

https://www.tensorflow.org/tutorials/deep_cnn

3. How to Retrain Inception』s Final Layer for New Categories:

https://www.tensorflow.org/tutorials/image_retraining

4. k-NN classifier for image classification:

http://www.pyimagesearch.com/2016/08/08/k-nn-classifier-for-image-classification/

5. Image Augmentation for Deep Learning With Keras:

http://machinelearningmastery.com/image-augmentation-deep-learning-keras/

6. Convolutional Neural Network TensorFlow Tutorial:

https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/02_Convolutional_Neural_Network.ipynb

【本文是51CTO專欄機(jī)構(gòu)機(jī)器之心的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2011-09-06 16:21:16

路由器分類路由器

2010-07-29 13:41:57

Flex性能優(yōu)化

2015-06-10 14:28:34

數(shù)據(jù)中心數(shù)據(jù)中心優(yōu)化

2009-07-06 13:18:35

Servlet方法

2011-05-16 10:30:02

2010-07-27 13:05:12

Flex

2015-01-21 14:04:31

2011-08-31 14:52:41

2011-04-19 13:40:27

2015-02-02 09:16:49

公有云云應(yīng)用程序優(yōu)化

2022-08-23 10:58:37

智能家居黑客網(wǎng)絡(luò)攻擊

2023-08-04 11:06:49

數(shù)據(jù)科學(xué)機(jī)器學(xué)習(xí)

2010-08-26 11:27:35

CSS居中

2015-06-08 11:12:20

TCP

2015-09-02 10:00:55

虛擬化存儲(chǔ)數(shù)據(jù)中心

2020-03-23 07:18:22

機(jī)器學(xué)習(xí)教育AI

2022-06-09 15:03:40

智能家居物聯(lián)網(wǎng)安全

2023-03-15 10:12:13

2019-08-23 10:10:58

Nginx反向代理防盜鏈

2014-01-22 10:09:09

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)