成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對比圖像分類五大方法:KNN、SVM、BPNN、CNN和遷移學習

開發 開發工具
本文是對五種用于圖像分類的方法(KNN、SVM、BP 神經網絡、CNN 和遷移學習)進行的實驗比較。

圖像分類是人工智能領域的基本研究主題之一,研究者也已經開發了大量用于圖像分類的算法。近日,Shiyu Mou 在 Medium 上發表了一篇文章,對五種用于圖像分類的方法(KNN、SVM、BP 神經網絡、CNN 和遷移學習)進行了實驗比較,該研究的相關數據集和代碼也已經被發布在了 GitHub 上。

項目地址:https://github.com/Fdevmsy/Image_Classification_with_5_methods

圖像分類,顧名思義,就是為輸入圖像打上固定類別的標簽。這是計算機視覺領域的核心問題之一。盡管聽起來很簡單,但圖像分類有大量不同的實際應用。

一、傳統方式:特征描述和檢測

特征描述和檢測

也許對一些樣本任務有好處,但實際情況要復雜得多。

特征描述和檢測

因此,我們并沒有通過代碼的形式直接指出每一類型的外觀(visual appearance),而是使用機器學習——為計算機提供每一類的諸多實例,接著開發學習算法觀察這些實例,并學習每一類的外觀。

然而,圖像分類如此復雜,以至于其處理經常用到深度學習模型,比如 CNN(卷積神經網絡)。我們已經知道,我們在課堂上學習的不少算法(如 KNN、SVM)通常很擅長數據挖掘;但是對于圖像分類,它們卻不是最佳選擇。

因此,我們將對課堂中學到的以及 CNN 和遷移學習等算法做一個對比。

二、目標

我們的目標是:

1. 把 KNN、SVM、BP 神經網絡與業界處理圖像識別問題的算法——CNN 和遷移學習——進行對比。

2. 獲得深度學習經驗。

3. 通過 TensorFlow 探索機器學習框架。

三、系統設計 & 實現細節

1. 算法與工具

本項目使用的 5 個方法是 KNN、SVM、BP 神經網絡、CNN 和遷移學習。

全項目可分為 3 類方法:

  • 第一類方法:使用 KNN、SVM、BP 神經網絡這些課堂算法。這些算法強大易實現。我們主要使用 sklearn 實現這些算法。
  • 第二類方法:盡管傳統的多層感知器模型已成功應用于圖像識別,但由于其節點之間的全連接性,它們遭遇了維度的難題,從而不能很好地擴展到更高分辨率的圖像。因此我們使用深度學習框架 TensorFlow 打造了一個 CNN。
  • 第三個方法:重新訓練一個被稱作 Inception V3 的預訓練深度神經網絡的最后一層,同樣由 TensorFlow 提供。Inception V3 是為 ImageNet 大型視覺識別挑戰賽訓練的,使用了 2012 年的數據。這是計算機視覺的常規任務,其中模型試圖把全部圖像分為 1000 個類別,比如斑馬、達爾阿提亞人和洗碗機。為了再訓練這一預訓練網絡,我們要保證自己的數據集沒有被預訓練。

2. 實現

第一類方法:預處理數據集,并使用 sklearn 實現 KNN、SVM、BP 神經網絡。

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

接著,建構若干個我們需要解析的參數。由于想要同時測試整個數據集和帶不同數量標簽的子數據集的精確度,我們構建了一個作為參數的數據集并解析進我們的程序。我們同樣構建了用于 k-NN 方法的鄰元素數作為解析參數。

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

下一步是使用從 sklearn 包導入的函數 train_test_split 拆分數據集。這個集具有后綴 RI,RL 是 rawImages 和標簽對的拆分結果,另一個是特征和標簽對的拆分結果。我們使用 85% 的數據集作為訓練集,余下的 15% 作為測試集。

最后,我們應用 KNN、SVM、BP 神經網絡函數評估數據。對于 KNN 我們使用 KNeighborsClassifier,對于 SVM 我們使用 SVC,對于 BP 神經網絡我們使用 MLPClassifier。

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

TensorFlow 也可自動計算優化圖變量所需的梯度,從而使模型表現更好。這是由于該圖由簡單的數學表達式組合而成,因此可通過導數鏈式法則計算全圖的梯度。

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

  • 占位符變量,用于輸入數據到圖。
  • 優化向量以使卷積網絡表現更好。
  • 卷積網絡的數學公式。
  • 可用于指導變量優化的成本衡量標準。
  • 更新變量的優化方法。
  • CNN 架構由一堆不同的層組成,這些層通過可微分函數可把輸入量轉化為輸出量。

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

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

輸出是另一個 4 維張量:

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

接著,我們我們在網絡末端構建了 2 個全連接層。輸入是一個 2 維的形狀張量 [num_images、num_inputs]。輸出也是一個 2 維的形狀張量 [num_images、num_outputs]

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

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

為了優化訓練結果,我們需要一個成本衡量標準并在每次迭代中將成本降至最少。這里我們使用的成本函數是交叉熵(tf.nn.oftmax_cross_entropy_with_logits()),并在所有的圖像分類中取交叉熵的平均值。優化方法是 tf.train.AdamOptimizer(),它是梯度下降的高級形式。這是一個可被調節的參數學習率。

第三種方法:再訓練 Inception V3。現代目標識別模型有數以百萬計的參數,并可能需要花費數周的時間才能完全訓練一個模型。遷移學習是一種采用在分類數據集(如 ImageNet)中已訓練的模型而快速完成這一工作的方法,因為其只需要重新訓練新類別的權重就行。雖然這樣的模型并沒有完全訓練的模型表現好,但對于許多應用來說,這是非常高效的,因為其不需要 GPU 并可以在筆記本上花半個小時就完成訓練。

讀者可以點擊一下鏈接進一步了解遷移學習的訓練過程:https://www.tensorflow.org/tutorials/image_retraining

首先我們需要獲取預訓練模型,并移除舊的頂層神經網絡,然后再基于我們的數據集重新訓練一個輸出層。雖然貓的所有品種并沒有在原始 ImageNet 數據集和全訓練的模型中體現,但遷移學習的神奇之處就在于其可以利用已訓練模型用來識別某些目標的底層特征,因為底層特征可以在很多不更改的情況下應用于很多識別任務。然后我們分析本地的所有圖片并計算每張的瓶頸值(bottleneck values)。因為每張圖片在訓練過程中重復使用了多次,所以計算每個瓶頸值需要花費大量時間,但我們可以加快緩存這些瓶頸值,也就可以省去重復的計算。

該腳本將運行 4000 次訓練步。每一步從訓練集中隨機選擇 10 張圖片,并從緩存中搜索其瓶頸值,然后再將它們訓練最后一層以得到預測。這些預測會通過對比真實標注值而通過反向傳播過程更新最后一層的權重。

四、實驗

1. 數據集

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

該數據集有 25 種狗和 12 種貓。每一種類別有 200 張相片。我們在該項目中只會使用 10 種貓。

數據集

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

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

2. 預處理

在該項目中,我們主要使用 OpenCV 對圖片進行預處理,如讀取圖片放入陣列或調整為我們需要的大小等。

提升圖像訓練結果的一個常用方法就是對訓練輸入隨機進行變形、裁剪或亮度調整處理。由于采用了同一圖片所有可能的變體,該方法不僅具有擴展有效訓練數據大小的優點,同時還傾向幫助網絡使用分類器學習處理所有在現實生活中可能出現的畸變。

具體請查看:https://github.com/aleju/imgaug.

3. 評估

(1) 第一個方法:第一部分為預處理數據集和使用 sklearn 應用 KNN、SVM 和 BP 神經網絡。

在程序中有很多參數可以調整:在 image_to_feature_vector 函數中,我們設置的圖片尺寸為 128x128,我們之前也嘗試過使用其他尺寸(如 8x8、 64x64、256x256)進行訓練。我們發現雖然圖片的尺寸越大效果越好,但大尺寸的圖片同樣也增加了執行時間和內存需求。因此我們最后決定使用 128x128 的圖片尺寸,因為其并不太大,同時還保證了準確度。

在 extract_color_histogram 函數中,我們將每個通道的二進制值設置為 32,32,32。在先前的函數中,我們還嘗試了 8, 8, 8 和 64, 64, 64。雖然更高的數值能有更優的結果,但同時也要求更長的執行時間,因此我們認為 32,32,32 是比較合適的。

對于數據集,我們訓練了 3 種。第一種是有 400 張圖片、2 種標注的子數據集。第二種是有 1000 張圖片、5 種標注的子數據集。最后一種是有 1997 張圖片、10 種標注的全數據集。我們將不同的數據集解析為程序中的參數。

在 KNeighborsClassifier 中,我們只改變近鄰的數量并儲存每一種數據集最優 K 值的分類結果。其他所有參數都設為默認。

在 MLPClassifier 中,我們設置每一個隱藏層有 50 個神經元。我們確實測試了多個隱藏層,但好像對最后的結果沒有明顯的變化。最大的迭代次數設置為 1000,并且為了確保模型能夠收斂,我們容忍差設置為 1e-4。同時還需要設置 L2 罰項的參數 alpha 為默認值,隨機狀態為 1,求解器設置為學習速率為 0.1 的「sgd」。

在 SVC 中,最大迭代次數為 1000,類別權重設置為「balanced」。

我們程序的運行時間并不會太久,對于我們的三種數據集大概分別花 3 到 5 分鐘左右。

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

使用整個大數據集會需要很長的時間計算模型的梯度,因此我們在優化器每一次迭代中都只使用小批量的圖片更新權重,批量大小一般是 32 或 64。該數據集分為包含 1600 張圖片的訓練集、包含 400 張圖片的驗證集和包含 300 張圖片的測試集。

該模型同樣有許多參數需要調整。

首先是學習率。優良的學習率因為其足夠小而很容易令模型收斂,同時又足夠大令模型的收斂速度不至于太慢。所以我們選擇了 1 x 10^-4。

第二個需要調整的參數是投入到網絡的圖片尺寸。我們訓練了 64x64 和 128x128 兩種圖片尺寸,結果表明尺寸越大模型精度就越高,但代價是運行時間會更長。

然后是神經網絡層級數和它的形狀。然而實際上由于這一方面有太多的參數可以調整,所以很難在所有的參數間找到一個最優值。

根據網上的很多資源,我們發現對于構建神經網絡,參數的選擇很大一部分都是根據已有的經驗。

最開始,我們希望構建相當復雜的神經網絡,其所采用的參數如下:

  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 個卷積層和 2 個全連接層,它們的結構都比較復雜。

然而,我們的結果是:過擬合。對于這樣的復雜網絡,訓練精度在迭代一千次后就達到了 100%,但測試精度僅僅只有 30%。最開始,我們十分疑惑為什么模型會過擬合,然后開始隨機調整參數,但這時候模型的表現卻又變好了。幸好幾天后我碰巧讀到了 Google 在討論深度學習的一篇文章:https://medium.com/@blaisea/physiognomys-new-clothes-f2d4b59fdd6a 該文章指出他們所主導的項目是有問題的:「一個技術性的問題是如果少于 2000 個樣本,那么其是不足以訓練和測試如同 AlexNet 那樣的卷積神經網絡而不出現過擬合情況。」所以我才意識到我們的數據集實在是太小了,而網絡構架又太復雜,這才產生了過擬合現象。

4. 我們的數據集正好包含 2000 張圖片

因此,我開始減少神經網絡的層級數和核函數的大小。我嘗試調整了很多參數,以下是我們最后使用的神經網絡架構參數:

  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 個小型的卷積層和 2 個全連接層。訓練結果并不好,在迭代 4000 次后同樣出現了過擬合現象,但測試精度還是要比前面的模型高 10%。

我們仍然在尋找解決的辦法,然而一個顯然易見的原因是我們的數據集實在是太小了,我們也沒有足夠的時間做更多的改進。

作為最后的結果,我們在 5000 次迭代后大概實現了 43% 的精度,該訓練花了一個半小時。實際上,我們對這一結果比較沮喪,因此我們準備使用另一標準數據集 CIFAR-10。

標準數據集

CIFAR-10 數據集由 60000 張 32x32 10 類彩色圖片,每一個類別都有 6000 張圖片。該數據集包含了 50000 張訓練集和 10000 張測試集。

我們使用了和上面相同的神經網絡架構,在 10 小時的訓練后,我們在測試集上實現了 78% 的準確度。

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

該模型同樣有許多參數需要調整。

首先是訓練步,默認值是 4000 步。我們也可以根據情況增加或減少以盡快獲得一個可接受的結果。

隨后是學習率,該參數控制了在訓練期間更新至最后一層的量級。直觀地說,如果學習速率小,那么需要更多的時間進行學習,但最終其可能收斂到更優的全局精度。訓練批量大小控制了在一個訓練步中檢查圖片的多少,又因為學習率應用于每一個批量,如果能以更大的批量獲得相似的全局效果,我們需要減少它。

因為深度學習任務所需要的運行時間通常很長,所以我們并不希望模型在訓練幾小時后實際上表現很糟糕。所以我們需要經常獲得驗證精度的報告。這樣我們同樣可以避免過擬合。數據集的分割是將 80% 的圖片投入到主要的訓練中,10% 的圖片作為訓練期間經常進行的驗證集,而剩下 10% 的圖片作為最終的測試集以預測分類器在現實世界中的表現。

五、結果

(1) 第一類方法:預處理數據集并使用 sklearn 實現 KNN、SVM 和 BP 神經網絡。

結果在下表中。由于 SVM 結果非常差,甚至低于隨機猜測,我們不再展示其結果。

SVM

從結果中我們看到:

  • 在 k-NN 中,原始像素和直方圖精確度是相對等同的。在 5 個標簽的子數據集,直方圖精確度比原始像素高一點;但是整體來講,原始像素的結果更好。
  • 在神經網絡 MLP 分類器中,原始像素精確度遠低于直方圖。對于整個數據集(10 個標簽),原始像素精確度甚至低于隨機猜測。
  • 所有這 2 個 sklearn 方法并沒有良好表現,在整個數據集中(10 標簽數據集)識別正確分類的精確度僅約有 24%。這些結果說明,通過 sklearn 分類圖像效果欠佳,它們在使用多個類別分類復雜圖像時表現并不好。但是相比于隨機猜測,它們確實有提升,只是還不夠。

基于以上結果,我們發現為了提升精確度,使用一些深度學習方法很必要。

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

使用 TensorFlow 構建 CNN

正常情況下訓練需要半個小時,然而由于結果過擬合,我們認為這一運行時間并不重要。通過和第一類方法的比較,我們看到:盡管 CNN 過擬合訓練數據,我依然得到了更好的結果。

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

整個訓練過程不超過 10 分鐘。我們獲得了極好的結果,并真正看到了深度學習和遷移學習的力量。

演示:

再訓練 Inception V3

六、結論

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

  • KNN、SVM 和 BP 神經網絡對于某些特定圖像分類任務是不夠的。
  • 雖然我們會在 CNN 中過擬合,但這仍然比那些課堂方法要好。
  • 遷移學習在圖像分類問題上效率很高,功能強大。它準確快速,可以在短時間內完成訓練——而且不需要 GPU 的幫助。即使你只有一個很小的數據集,它也可以達到很好的效果,并且減少了過擬合的概率。

我們已經從圖像分類任務中學到了很多,這類任務與課堂上的其他分類任務大不相同。數據集相對較大且稠密,需要的網絡十分復雜,且大多方法依賴于 GPU 的計算能力。

經驗:

  • 裁剪或重調圖像,使其更小
  • 在訓練的每個迭代中隨機選擇一個小 batch
  • 在驗證集進行驗證的時候隨機選擇一個小 batch,在訓練過程中頻繁記錄驗證分數
  • 可以使用 Image Augmentation 處理圖片,增大數據集體量
  • 對于圖像分類任務,我們需要比 200 x 10 的更大的數據集,CIFAR-10 數據集包含 6 萬張圖像。
  • 越復雜的網絡需要越大的數據集進行訓練
  • 小心過擬合

注: 第一種方法由 Ji Tong 實現:https://github.com/JI-tong 

七、參考文獻

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專欄機構機器之心的原創譯文,微信公眾號“機器之心( id: almosthuman2014)”】

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

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2011-09-06 16:21:16

路由器分類路由器

2010-07-29 13:41:57

Flex性能優化

2015-06-10 14:28:34

數據中心數據中心優化

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

2022-08-23 10:58:37

智能家居黑客網絡攻擊

2015-02-02 09:16:49

公有云云應用程序優化

2023-08-04 11:06:49

數據科學機器學習

2010-08-26 11:27:35

CSS居中

2015-06-08 11:12:20

TCP

2015-09-02 10:00:55

虛擬化存儲數據中心

2020-03-23 07:18:22

機器學習教育AI

2022-06-09 15:03:40

智能家居物聯網安全

2023-03-15 10:12:13

2019-08-23 10:10:58

Nginx反向代理防盜鏈

2014-01-22 10:09:09

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 四虎影院新地址 | 91久久精品国产 | 精品久久不卡 | 成年免费大片黄在线观看一级 | 天天看天天爽 | 久久亚洲美女 | 久久视频一区 | 午夜在线影院 | 欧美激情亚洲天堂 | 国产在线视频一区 | 欧美日韩1区2区3区 欧美久久一区 | 中文字幕人成乱码在线观看 | 成人小视频在线观看 | 中文字幕视频在线免费 | 亚洲精品一区二区 | 国产美女一区二区 | 午夜色婷婷 | 毛片在线看看 | 亚洲免费在线观看 | 国产999精品久久久 日本视频一区二区三区 | 成人福利视频网站 | 日本久久一区 | 亚洲精品国产第一综合99久久 | 羞羞视频一区二区 | 亚洲精品美女视频 | 久久国产精品99久久久久 | 久久久久91 | 亚洲精品福利视频 | 国产精品免费福利 | 欧美群妇大交群中文字幕 | 亚洲一区二区国产 | 国产精品免费福利 | 又爽又黄axxx片免费观看 | 日韩中文字幕网 | 国产一级在线观看 | 色av一区| 国产精品久久久久久 | 91麻豆精品国产91久久久久久久久 | 国产精品资源在线 | 欧美高清dvd| 欧美午夜一区二区三区免费大片 |