深度學習在這些年是非常熱門的話題,特別是在計算機視覺應用方面,也許你會在新聞上有所耳聞並感到好奇。那麼現在的問題是,該如何入手?今天帶來一篇人工神經網絡的快速入門教程。
MNIST 數據集我們當中有許多人想在一個具體的例子中開始入手。那我就寫一個手把手快速教程,我們用一個常用的 MINIST 手寫數字數據集作為例子以使教程比較直觀的、易理解。Kaggle 剛好也在數字識別教程中使用這個數據集。你需要從 「Get the Data」 頁面中下載這些數據集:
train.csv – 訓練數據
test.csv – 測試數據
當你已經將上述文件下載到當前文件夾時,將訓練數據和測試數據都加載進 MATLAB,測試數據用於生成你的提交。
tr = csvread('train.csv', 1, 0); % 讀文件 train.csv sub = csvread('test.csv', 1, 0); % 讀文件 test.csv
第一列是數據集中每個樣本字符的正確標籤,每行一個樣本。剩餘的列中,每行表示一個28×28的手寫字符的圖像,所有像素都放在一行中,而不是原本的矩陣格式。如果要使字符可視化,我們需要將這些行重新組織成28×28的矩陣。 reshape 操作是按列進行的,所以除非你需要對數據進行轉置,否則可以用 reshape 函數實現這字符的可視化。
figure colormap(gray) for i = 1:25 subplot(5,5,i) digit = reshape(tr(i, 2:end), [28,28])'; imagesc(digit) title(num2str(tr(i, 1))) end
準備數據你可以使用神經網絡工具箱中的模式識別應用nprtool 。這個應用需要兩個數據集:
標籤的取值範圍是0到9,但由於MTLAB中的下表是從1開始的,所以我們可以用「10」表示「0」。
1 2 3 :0
數據集中的樣本是按列保存而不是按行保存的,所以你需要對數據進行轉置。然後,你需要將數據集分割,保留1/3的數據用作模型評估,僅用2/3的數據來訓練我們的人工神經網絡模型。
n = size(tr, 1); targets = tr(:,1); targets(targets == 0) = 10; targetsd = dummyvar(targets); inputs = tr(:,2:end); inputs = inputs'; targets = targets'; targetsd = targetsd'; rng(1); c = cvpartition(n,'Holdout',n/3); Xtrain = inputs(:, training(c)); Ytrain = targetsd(:, training(c)); Xtest = inputs(:, test(c)); Ytest = targets(test(c)); Ytestd = targetsd(:, test(c));
使用神經網絡工具箱中的圖形界面應用(GUI APP)
你可以通過鍵入命令 nnstart 來打開神經網絡的啟動圖形界面。
進入啟動界面後,可以通過單擊模式識別工具來打開神經網絡模式識別工具。你也可以通過命令 nprtool 來直接打開它。
單擊歡迎頁面上的「Next」(下一步),進入「Select Data」(數據選擇)界面。
選擇Xtrain作為輸入,Ytrain為訓練目標。
單擊「Next」(下一步),進入「Validation and Test Data」(數據驗證和檢查)界面。採用默認設置並再次單擊「Next」(下一步)。這一操作會將數據分割70個-15個-15個樣本,分別作為訓練、驗證和測試集。
在「Network Architecture」(網絡結構)界面,修改隱層神經元(hidden neurons)的個數值為100,並再次單擊「Next」。
在「Train Network」(網絡訓練)界面,單擊「Train」(訓練)按鈕開始訓練。訓練結束後,單擊「Next」。跳過「Evaluate Network」(驗證網絡)並點擊下一步。
在「Deploy Solution」(結果部署)界面,選擇「MATLAB Matrix-Only Function」(MATLAB矩陣函數)並保存生成的編碼。我將它保存為myNNfun.m。
如果你單擊「Next」並進入「Save Results」(結果保存)界面,你可以保存所創建的模型和對應腳步。我將這個簡單的腳本保存為myNNscript.m。
這是你通過圖片識別工具創造的人工神經網絡模型圖表。他有784個輸入神經元, 100個隱藏層神經元,以及10個輸出層神經元。
你的人工神經網絡模型學會了通過訓練權重來生產正確的輸出。
W在圖中代表權重,B代表偏置單元,他們是個體神經元的一部分。 隱藏層中的單個神經元看起來像是784個輸入數據和相應的權重, 1個偏置單元和10個輸出。
可視化已學習權重如果你看myNNfun,m,或像IW1_1和x1_step1_keep之類的變量,他們表示你的人工神經網絡模型通過訓練得到的權重。 因為我們有784個輸入數據和100個神經元, 在全層中1權重會變成100 x 784的矩陣。 讓我們將它們可視化.。這就是我們的神經元學習的成果!
計算分類精確度
現在您準備使用 myNNfun.m 來預測在 Xtest 伸出的數據的各種標籤並將它們和在 Ytest裡的實際標籤相比較。以防遇到不可見數據,那就給你提供了一次逼真的預測表演機會。這也是評價指標Kaggle用來打分的。
首先,您將看到網絡的實際輸出,它顯示每個可能的標籤出現的概率。您只需選擇最有可能的標籤作為您的預測標籤,然後將其與實際標籤進行比較。您應該看到95%的分類精確度。
Ypred = myNNfun(Xtest); Ypred(:, 1:5) [~, Ypred] = max(Ypred); sum(Ytest == Ypred) / length(Ytest)
網絡體系結構
您可能注意到,人工神經網絡模型生成於模式識別工具,而該工具只有一個隱藏層。如果您願意,您可以構建一個具有更多層的自定義模型,但是這種簡單的架構足以解決大多數常見問題。
你可能會問的下一個問題是,我是如何選擇100個當做隱藏神經元數目。一般的經驗法則是在輸入神經元的數目784個和輸出神經元的數目10個之間選擇一個數字,我只是隨意地選擇了100個。這意味著如果嘗試其他值,您可能會做得更好。這次我們已變成的方式做這件事間。採用myNNscript.m 會方便些——要做參數掃描的話,你可以簡單地改寫腳本。
現在,讓我們畫出分類精度相對隱層神經元數量的變化。
figureplot(sweep, scores, '.-')xlabel('number of hidden neurons')ylabel('categorization accuracy')title('Number of hidden neurons vs. accuracy')
看起來這個簡單的人工神經網絡模型在250個神經元附近獲得了最好的結果,最好的分類精度在0.96左右。
如您所見,如果您增加隱藏神經元的數量,您將獲得更高的精度,但隨後某個時刻精度會降低(由於權重的隨機初始化,您的結果可能會有所不同)。 當您增加神經元數量時,您的模型將能夠捕獲更多的特徵,但是如果您捕獲的特徵太多,那麼最終您的模型會過度擬合訓練數據,並且對於看不見的數據訓練得不好。 讓我們用300個隱藏神經元來檢查學習的權重。 你會看到更多的細節,但你也會看到更多的噪音。
現在你已經對人工神經網絡有了一些直覺——該網絡能自動根據輸入數據記錄下一切相關特性,並生成一個映射到輸出數據標籤的稀疏表示。如果我們把輸入數據作為目標值情形又如何?那樣你就不再需要訓練標籤了,並將其轉化為無監督學習法。這就是眾所周知的自編碼,也就變成了一個深度學習網絡的構建塊。有一個很好的有關自編碼的例子,是其專門用於深度神經網絡的數字分類 頁面上,該頁面就是神經網絡工具箱文檔的頁面,而該文檔也使用MNIST數據集。更多詳情,史丹福大學提供了一個很好的 UFLDL 教程,該教程也使用相同的數據集和基於MATLAB的入門代碼。
除了理解各種算法之外,還有一個實際問題就是如何第一時間生成輸入數據。有人曾花了很多時間準備MNIST數據集來保證其具有統一的大小,縮放,對比等。為了在實際應用中去使用你從這個數據集裡建立的模式,你必須能夠在新的數據上重複相同的處理模式。你自己是怎麼做這樣的準備的呢?
現在有一個有趣的視頻可告訴你如何使用一個網絡攝像頭來解決數獨謎題,該攝像頭使用不同的字符識別技術。沒用靜態圖像,使用現場直播來做這件事,他帶領你一步一步地完成前處理步驟。你一定查個明白: 使用網絡攝像頭解決數獨謎題.
將您的練習提交到Kaggle通過簡單地接受除隱藏神經元數量之外的默認設置,您可以獲得96%的分類準確率。 第一次嘗試還不錯。 因為您使用Kaggle數據集,因此現在可以將結果提交給Kaggle。
n = size(sub, 1); % num of samplessub = sub'; % transpose[~, highest] = max(scores); % highest scoring modelnet = models{highest}; % restore the modelYpred = net(sub); % label probabilities[~, Label] = max(Ypred); % predicted labelsLabel = Label'; % transpose LabelLabel(Label == 10) = 0; % change '10' to '0'ImageId = 1:n; ImageId = ImageId'; % image idswritetable(table(ImageId, Label), 'submission.csv');% write to csv
您現在可以在Kaggle的項目提交頁面上提交submission.csv。
結語在這個例子中,我們專注於使用手寫數字識別的具體例子來獲得對人工神經網絡的直觀理解。 我們沒有詳細介紹輸入權重和偏差單位如何組合,激活(activation )如何工作,如何訓練這樣一個網絡等等。但是現在您已經足夠了解在MATLAB中使用神經網絡工具箱來參與Kaggle競賽。
End.
聯科集團成立於2000年,致力以現代計算科技為客戶創造價值。我們以雲計算、 高性能計算、大數據和異構計算等技術, 為客戶解決海量數據處理、大規模計算、深度分析、人工智慧、無間斷服務等多種應用問題。我們的服務領域,包括金融工程(投資分析、風險管理、衍生物定價等)、商業智能(銷售預測、客戶管理、庫存管理等)、環境科技(氣象預報、暴雨及湍流預報、汙染分析與預測等)、智慧城巿(信息採集、信息分析、優化管理等)和網際網路應用(海量圖像處理、視頻儲存與傳送等)。我們也為各種規模的企業提供公共雲、私有雲和混合雲的解決方案。
如果您有相關需求,歡迎聯繫我們!
優秀案例如下:
專題分享——智慧檢察官系統(綜述)
專題分享——大數據下的智能選客(綜述)
專題分享——文本數據解決方案(綜述)
來源:36大數據
聲明:本公眾號部分信息來自網絡轉載,若無意中有侵犯您權益的信息,請聯繫我們,我們會在第一時間刪除!