-
1 # 喵喵學習
-
2 # 你看我獨角獸嗎
有個很簡單的機器學習Demo,我們可以使用MNIST資料集在10分鐘內進行影象分類,當您開始使用神經網路學習深度學習時,您會意識到最強大的受監督的深度學習技術之一就是卷積神經網路(簡稱為“ CNN”)。CNN的最終結構實際上與規則神經網路(RegularNets)非常相似,其中存在具有權重和偏差的神經元。另外,就像在RegularNets中一樣,我們在CNN中使用損失函式(例如交叉熵或softmax)和啟用函式(例如adam)。另外,在CNN中,還包括卷積層,池化層和全連線層。CNN主要用於影象分類,儘管您可能會發現其他應用領域,例如自然語言處理等等。
CNN中的圖層我們能夠在卷積神經網路中使用許多不同的層。但是,卷積、池化和全連線層是最重要的。因此,在實現它們之前,我將快速介紹這些層。
卷積層
卷積層是我們從資料集中的影象中提取特徵的第一層。由於畫素僅與相鄰畫素和緊密畫素相關,因此卷積允許我們保留影象不同部分之間的關係。卷積基本上是使用較小的畫素過濾器對影象進行過濾,以減小影象的大小,而不會丟失畫素之間的關係。當我們透過使用步幅為1x1的3x3濾鏡(每步偏移1個畫素)將卷積應用於5x5影象時。我們最終將獲得3x3的輸出(複雜度降低了64%)。
池化層
構造CNN時,通常在每個卷積層之後插入池化層,以減小表示的空間大小,從而減少引數計數,從而降低計算複雜度。此外,合併層還有助於解決過度擬合問題。基本上,我們選擇池大小以透過選擇這些畫素內的最大值,平均值或總和值來減少引數數量。最大池化是最常見的池化技術之一,可以透過以下方式進行演示:
全連線層
一個完全連線的網路是我們的CNN,其中每個引數相互連結,以確定每個引數在標籤上的真實關係和效果。由於卷積和池化層大大降低了時空複雜度,因此我們可以最終構建一個完全連線的網路來對影象進行分類。一組完全連線的層如下所示:
既然您對我們將要使用的各個層有了一些瞭解,我認為現在該分享一個完整的卷積神經網路的概貌。
現在,您有了可以構建的用於影象分類的卷積神經網路的概念,我們可以獲得用於分類的最陳詞濫調的資料集:MNIST資料集,它代表改良的美國國家標準技術研究院資料庫。是一個龐大的手寫數字資料庫,通常用於訓練各種影象處理系統。
下載Mnist資料MNIST資料集是用於影象分類的最常見資料集之一,可從許多不同來源訪問。實際上,甚至Tensorflow和Keras都允許我們直接從其API匯入和下載MNIST資料集。因此,我將從以下兩行開始,以在Keras API下匯入tensorflow和MNIST資料集。
NIST資料庫包含60,000張訓練影象和10,000張測試影象,這些影象是從美華人口普查局員工和美國高中學生那裡拍攝的。因此,在第二行中,我將這兩個組分別作為訓練和測試,並且還分離了標籤和影象。x_train和x_test部分包含灰度RGB程式碼(從0到255),而y_train和y_test部分包含從0到9的標籤,這些標籤代表它們實際的編號。為了形象化這些數字,我們可以從matplotlib獲得幫助。
當我們執行上面的程式碼時,我們將獲得RGB程式碼的灰度視覺化效果,如下所示。
建立卷積神經網路我們將使用高階Keras API構建模型,該API在後端使用TensorFlow或Theano。我想提到的是,有幾種高階TensorFlow API,例如Layers,Keras和Estimators,它們可以幫助我們建立具有高階知識的神經網路。但是,由於它們的實現結構各不相同,因此可能會造成混亂。因此,即使它們都使用了張量流,但如果您看到的是相同神經網路的完全不同的程式碼,這就是原因。我將使用最直接的API,即Keras。因此,我將從Keras匯入順序模型並新增Conv2D,MaxPooling,Flatten,Dropout和Dense圖層。我已經討論過Conv2D,Maxpooling和Dense層。此外,Dropout層透過在訓練時忽略某些神經元來對抗過度擬合,而Flatten層在構建完全連線的層之前將2D陣列展平為1D陣列。
我們可以為第一個Dense層嘗試任何數字;但是,由於我們有10個數字類別(0、1、2,…,9),因此輸出層必須具有10個神經元。您可以始終在第一個Dense層中嘗試核心大小,池大小,啟用函式,丟失率和神經元數量的實驗,以獲得更好的結果。
編譯和擬合模型使用上面的程式碼,我們建立了一個未經最佳化的空CNN。現在是時候為最佳化器設定一個使用度量的給定損失函式。然後,我們可以使用火車資料擬合模型。我們將使用以下程式碼來完成這些任務:
您可以嘗試使用啟用函式,損失函式,調參等等。但是,我可以說adam通常勝過其他啟用函式。我不確定您是否可以更改多類分類的損失函式。請隨意在下面進行實驗和評論。這樣簡單的測可以達到98–99%的測試精度。由於MNIST資料集不需要大量的計算能力,因此您也可以輕鬆地嘗試好幾次訓練試試看。
評估模型最後,您可以使用一行程式碼透過x_test和y_test評估訓練後的模型:
model.evaluate(x_test, y_test)對於一個如此簡單的模型,結果是相當不錯的。
評估顯示,測試儀的準確性為98.5%!
透過這種基本模型,我們達到了98.5%的準確性。坦率地說,在許多影象分類案例中(例如,對於自動駕駛汽車),我們甚至不能容忍0.1%的誤差,因為作為類比,這就像在1000例案例中雖然導致1次事故但很嚴重一樣。但是,對於我們的第一個模型,這結果已經相當不錯了。
回覆列表
推薦兩本書 《深度學習 基於keras的Python實踐》
本書教你如何構建和評估一個神經網路模型。
• 如何使用更加先進的技術構建一個深度學習的模型。
• 如何構建一個影象或文字相關的模型。
• 如何改善模型的效能。
《Python資料探勘與機器學習實戰》
案例包括:·使用決策樹演算法對鳶尾花資料集進行分類;
·使用隨機森林對葡萄酒資料集進行分類;
·SVM中採用三種核函式進行時間序列曲線預測;
·HMM模型用於中文分詞;
·用TensorFlow實現BP神經網路;
·樸素貝葉斯分類器在破產預測中的應用。
·採用卷積神經網路實現了雷達剖面圖識別例項;
·使用LSTM模型實現了一個聊天機器人的程式;
·透過DCGAN網路來訓練資料,從而產生人臉影象。