> Photo by Jaime Spaniol on Unsplash
CNN,Mobile-Net,KNN,Random Forest和MLP。 哪種算法最好?
故事
一切始于我年輕的表弟,他在自己的世界里迷路,在繪畫本上涂鴉。 我問他在做什么。 他回答說他正在養貓。 看起來根本不像貓。 他要求我和他一起玩游戲,我會認出他在畫什么。 一段時間以來,這很有趣,但是很快,我就感到無聊。 我不想不和他玩耍來傷害他的感情,所以我用自己的計算機視覺和Python技巧來制作一個Doodle分類器。 現在的問題是,我將如何實施它? 有數百種方法可以對Doodle進行分類,而我必須選擇一種最準確的涂鴉,即花費最少的時間進行訓練,占用更少的內存,需要更少的處理能力并且不需要TB的數據即可提供有意義的信息 結果。
上網瀏覽后,我發現了可以以最佳方式完成此任務的前5種算法,但是我訪問的每個網站都講述了一個不同的故事。 有些人說CNN是最好的,而另一些人說移動網絡是最好的。 我想-好吧,讓我們測試一下所有這些。 我在Kaggle競賽中找到了一個包含大量帶有標簽的涂鴉的出色數據集,可以免費下載。
圖像分類是一個巨大的話題,因為有很多算法可用于各種應用。 圖像分類是如此之大和千變萬化,以至于每天都在創建新的算法,并且它的新應用也在不斷涌現。 因此,即使它們有數百種變體,我也很難手動選擇一些算法。 因此,本文將研究哪種算法最適合涂鴉分類。
我還將測試這些算法在其他情況下(例如手寫字符分類,車牌識別等)的可靠性。
涵蓋范圍
· 研究中使用的機器學習技術簡介
· 評估指標
· 選擇用于研究的參數的詳細信息
· 結果
· 局限性和結論
讓我們首先簡要介紹所使用的機器學習算法
涂鴉分類的算法有數千種,在這里我列出了一些我將探索的著名算法-
1)隨機森林
我們可以將隨機森林算法用于分類和回歸。 就像決策樹一樣,只是它使用數百個決策樹得出結論。 決策樹根據相似的特征將數據分為各種類別。 對于每個數據點,它檢查是否具有特定功能,大多數常見數據屬于同一類。 在隨機森林算法中,我們采用許多決策樹,并隨機給它們提供較少的特征以供檢查,例如,如果我們有100個特征,則可能給每棵樹10個隨機特征。 一些樹將分配不正確的類,但是許多樹將是正確的! 我們以多數為準,并創建我們的分類模型。
2)KNN
K最近鄰(KNN)既可以用作分類算法,也可以用作回歸算法。 在KNN中,數據點分為幾類,以預測新樣本點的分類。 為了實現此任務,它使用距離公式來計算各個數據點之間的距離,然后基于該距離,然后為每個類別定義區域邊界。 任何新的數據點都將屬于這些區域之一,并將被分配給該類。
3)MLP
多層感知(MLP)是前饋人工神經網絡的一種形式。 MLP有許多層,但在其隱藏層中只有一個邏輯函數,而在輸出層中只有一個softmax函數。 該算法以單個大向量作為輸入,并對輸入層和隱藏層執行矩陣運算,然后結果通過邏輯函數,其輸出通過另一個隱層。 重復此過程,直到網絡到達輸出層為止,在此使用softmax函數生成單個輸出。
4)CNN
卷積神經網絡(CNN)是最容易實現的深度學習計算機視覺算法之一。首先,它獲取給定尺寸的輸入圖像,并為其創建多個濾鏡/特征檢測器(最初是給定尺寸的隨機生成的矩陣),濾鏡的目的是識別圖像中的某些圖案,然后在濾鏡上移動在矩陣和圖像之間進行圖像和矩陣相乘。該濾鏡在整個圖像中滑動以收集更多特征,然后我們使用激活函數(主要是整流的線性單位函數)來增加非線性或僅保留重要特征,然后使用max-pooling函數將給定值中的所有值相加矩陣大小(例如,如果我們選擇4的矩陣,則它將所有4個值相加以創建1個值),從而減小輸出的大小以使其更快。最后一步是展平最終矩陣,該矩陣作為輸入傳遞到基本ANN(人工神經網絡)并獲得類預測。
5)移動網
Mobile-Net體系結構使用深度方向可分離卷積,其中包括深度方向卷積和點方向卷積。 深度方向卷積是通道方向Dk * Dk空間卷積,假設我們在圖像中有3個通道(R,G,B),那么我們將具有3 * Dk * Dk空間卷積。 在逐點卷積中,我們的內核大小為1 * 1 * M,其中M是在深度卷積中的通道數,在這種情況下為3。因此,我們有一個大小為1 * 1 * 3的內核。 我們通過3 * Dk * Dk輸出迭代這個內核以獲得Dk * Dk * 1輸出。 我們可以創建N 1 * 1 * 3個內核,每個內核輸出一個Dk * Dk * 1圖像,以獲得形狀為Dk * Dk * N的最終圖像。 最后一步是將深度方向卷積添加到點方向卷積。 這種類型的體系結構減少了訓練時間,因為我們需要調整的參數較少,而對精度的影響較小。
評估指標

> Sample of doodles used for research
以上是用于本研究的Doodle樣本。
我在Kaggle quickdraw數據集上訓練了機器學習模型,該數據集包含5000萬張不同類型的Doodle圖像。 我將龐大的數據集分為兩部分:用于訓練的35000張圖像和用于測試的15000張圖像。 然后,我針對隨機選擇的5種不同類型的Doodle計算每種算法的訓練時間。 在測試集上,我計算了每種算法的平均平均精度,準確性和召回率。
評估指標
訓練時間
平均平均精度
準確性
召回
Shashwat Tiwari 16MCA0068的更多有關評估指標的信息
選擇的參數的詳細信息
1)隨機森林
n_estimators —森林中決策樹的數量。 [10,50,100]
max_features-拆分['auto','sqrt']時要考慮的功能
max_depth —樹中的最大級別數[2,4,6,8,10]
n_jobs-并行運行的進程數,通常設置為-1以一次執行最大進程。
準則—這是一種計算損失并因此更新模型以使損失越來越小的方法。 ['熵','cross_validation']
我使用"自動"作為max_feature; 8作為max_depth; -1作為n_jobs,"熵"作為我的標準,因為它們通常會產生最佳效果。

> the Graph to find an optimum number of trees
但是,為了找出最佳的樹數,我使用了GridSearchCV。 它嘗試所有給定的參數組合并創建一個表以顯示結果。 從圖中可以看出,在80棵樹之后測試分數沒有顯著增加。 因此,我決定在80棵樹上訓練我的分類器。
2)K最近鄰居(KNN)
n_neighbors —要比較的最近數據點數[2,5,8]
n_jobs-并行運行的進程數,通常設置為-1以一次執行最大進程
我沒有更改此模型的任何默認參數,因為它們會提供最佳結果。
但是,為了找到n_neighbors的最佳數量,我使用了GridSearchCV,這是我得到的圖形:

> The graph to find an optimum number of N-neighbors
根據該圖,測試分數在5 n_neighbors之后下降,這意味著5是最佳鄰居數。
3)多層感知器(MLP)
alpha-最常用的學習速率,它告訴網絡調整梯度的速度。 [0.01,0.0001,0.00001]
hidden_layer_sizes —它是一個值的元組,由每層的隱藏節點數組成。 [(50,50),(100,100,100),(750,750)]
激活—一種功能,可以為圖像中的重要特征提供價值,并刪除不相關的信息。 ['relu','tanh','logistic']。
求解器(也稱為優化器),該參數告訴網絡使用哪種技術來訓練網絡中的權重。 ['sgd','adam']。
batch_size —這是一次要處理的圖像數。 [200,100,200]。
我將激活選擇為" relu",將求解器選擇為" adam",因為這些參數可提供最佳結果。
但是,為了選擇隱藏層和alpha的數量,我使用了GridSearchCV。

> Table to find an optimum number of N-neighbors
從表中可以看出,當alpha為0.001,hidden_layer_sizes為(784,784)時,可獲得最佳結果。 因此,我決定使用那些參數。
4)卷積神經網絡(CNN)
learning_rate-告訴網絡調整梯度的速度。 [0.01,0.0001,0.00001]
hidden_layer_sizes —它是一個值的元組,由每層的隱藏節點數組成。 [(50,50),(100,100,100),(750,750)]
激活—一種功能,可以為圖像中的重要特征提供價值,并刪除不相關的信息。 ['relu','tanh','logistic']。
求解器(也稱為優化器),該參數告訴網絡使用哪種技術來訓練網絡中的權重。 ['sgd','adam']。
batch_size —這是一次要處理的圖像數。 [200,100,200]
時期-程序應運行的次數或應訓練模型的次數。 [10,20,200]
我將激活函數選擇為" relu",將求解器選擇為" adam",因為這些參數通常會產生最佳效果。 在網絡中,我添加了3個卷積層,2個maxpool層,3個輟學層,最后添加了一個softmax激活函數。 我在這里沒有使用GridSearchCV,因為可以嘗試很多可能的組合,但是結果不會有太大差異。
5)移動網
Input_shape-是由圖像尺寸組成的元組。 [(32,32,1),(128,128,3)]。
Alpha-網絡的寬度。 [<1,> 1,1]
激活—一種功能,可以為圖像中的重要特征提供價值,并刪除不相關的信息。 ['relu','tanh','logistic']。
優化器—也稱為求解器,此參數告訴網絡使用哪種技術來訓練網絡中的權重。 ['sgd','adam']。
batch_size —這是一次要處理的圖像數。 [200,100,200]。 時期-程序應運行的次數或應訓練模型的次數。 [10,20,200]
classes-要分類的類數。 [2,4,10]
損失-告訴網絡使用哪種方法來計算損失,即預測值與實際值之差。 ['categorical_crossentropy','RMSE']
首先,我將28 * 28圖像的大小調整為140 * 140圖像,因為移動網絡最少需要32 * 32圖像,所以我使用的最終input_shape值為(140,140,1),其中1是圖像通道(在 這種情況下,黑色和白色)。 我將alpha設置為1,因為它通常會產生最佳效果。 激活功能被設置為默認值,即" relu"。 我使用了" Adadelta"優化器,因為它可以提供最佳效果。 batch_size設置為128以更快地訓練模型。 我已經使用20個紀元來提高準確性。 由于我們有5個類別可以分類,因此將類別設置為5。
結果

> Final Results (Fingers crossed)
以上是所使用的所有機器學習技術的性能。 指標包括準確性,召回率,準確性和培訓時間。 令我震驚的是,Mobile Net的訓練時間為46分鐘,因為它被認為是輕巧的模型。 我不確定為什么會這樣,如果您知道為什么,請告訴我。
局限性和結論
· 在這項研究中,只使用了28 * 28大小的黑白涂鴉,而在現實世界中,不同的顏色可能會表現出不同的意思或表示不同的事物,并且圖像大小可能會有所不同。 因此,在這些情況下,算法的行為可能會有所不同。
· 在所有討論的算法中,都有許多可以更改和使用的超參數,它們可能會給出不同的結果。
· 訓練這些算法的訓練集僅限于35000張圖像,添加更多圖像可以提高這些算法的性能。
結果表明,移動網絡實現了最高的準確性,準確性和查全率,因此就這三個參數而言,它是最佳算法。 但是,移動網絡的培訓時間也是最高的。 如果將其與CNN進行比較,我們可以看到CNN花費更少的時間進行訓練,從而提供了相似的準確性,準確性和召回率。 因此,根據這項研究,我可以得出結論,CNN是最好的算法。
在進行了這項研究之后,我得出結論,像移動網絡和CNN這樣的算法可用于硬文字識別,車牌檢測以及世界各地的銀行。 諸如移動網絡和CNN之類的算法實現了超過97%的準確度,這優于95%的平均人類績效。 因此,這些算法可以在現實生活中使用,從而使困難或耗時的過程自動化。
私信譯者獲得本文代碼
(本文翻譯自Shubh Patni的文章《Ultimate Showdown of machine Learning Algorithms》,參考:https://towardsdatascience.com/ultimate-showdown-of-machine-learning-algorithms-af68fbb90b06)