趙鈺
1 引言
1.1 背景
如上圖所示,分別是夜景、狗、百合花的照片,我們可以快速準確的識別出來,并且通常不會出錯。但是對于計算機而言,并不會很容易的識別出,甚至會非常困難。
然而,計算機可以在1秒內(nèi)計算出超級復雜的數(shù)字,而我們口算兩位數(shù)乘法都會比較困難。
因此,對比計算機與人類,發(fā)現(xiàn):
就此發(fā)現(xiàn),我們可以推測圖像的識別需要人類的智慧才可以解決,這才是人工智能的精髓。因此,我們就要找到新的算法賦予計算機,使他可以解決那些需要用到人類智慧的問題。
1.2 目的。1、識別手寫數(shù)字,比如說書寫者由于字跡潦草寫出的“4”、“9”分不清,利用神經(jīng)網(wǎng)絡(luò)分析具體是哪一個數(shù)字。2、識別長文本,比如說打開一個超級多數(shù)據(jù)的文本,其中的數(shù)據(jù)用逗號隔開,我們無法識別數(shù)字的排列規(guī)律以及數(shù)據(jù)個數(shù),因此要使用計算機識別。并給出其排列規(guī)律等需求。
2 建立神經(jīng)網(wǎng)絡(luò)
2.1 神經(jīng)元。神經(jīng)元是生物大腦中最基本的單位。他的傳遞方式就是將電信號從這一端傳遞到另一端,再沿著軸突,將電信號從這一樹突傳遞到另一樹突。這就實現(xiàn)了將這個信號從這一神經(jīng)元傳遞到下一個神經(jīng)元。經(jīng)過這樣一個個過程的傳遞,我們便有了感知聲、光、電、熱等信號的能力,我們便有了視覺、嗅覺、聽覺、觸覺等。而我們的大腦主要就是由神經(jīng)元構(gòu)成的,大約有1000億個神經(jīng)元。
2.2 權(quán)重。權(quán)重最重要的作用就是可以調(diào)節(jié)每一個節(jié)點之間連接的強度。權(quán)重越大即這兩個節(jié)點之間的連接就越強,也就是說要放大信號;權(quán)重越小,即兩個節(jié)點之間的連接就越弱,也就說要縮小信號。
2.3 搭建神經(jīng)網(wǎng)絡(luò)。搭建一個神經(jīng)網(wǎng)絡(luò),至少需要以下三個函數(shù):(1)初始化函數(shù)——設(shè)置節(jié)點的數(shù)量,包括輸入層節(jié)點、隱藏層節(jié)點、輸出層節(jié)點(2)訓練——讓機器學習給定的訓練集樣本,并將所給出的權(quán)重進行優(yōu)化(3)查詢——給定一個輸入值,得出一個輸出值。
3 手寫識別
我們將數(shù)據(jù)文件保存在“mnist_dataset”文件夾中,下面進行讀取數(shù)據(jù)并展示。
Data_file=open(“mnist_dataset/mnist_train_100.csv”,r)? (打開文件<路徑>,并且是只讀的模式)
Data_list=data_file.readlines() (讀取文件)
Data_file.close (關(guān)閉和清理文件)
在anaconda中跑一下,得出:
由上圖可觀察到,這是一個長度為100的列表,第一個數(shù)字是“5”,這可以看作是一個標簽。同時我們可以看到其他的784個數(shù)字是構(gòu)成圖像像素的顏色值。且顏色值的范圍為[0,255]。
下面我們就要將使用上圖所示的數(shù)組進行繪圖:
Import numpy
Import matplotlib。Pyplot
%matplotlib inline
All_values=data_list[0].split(‘,)? 將長的字符串進行拆分,并且打印出來
Image_array=numpy.asfarray(all_values[1:]).reshape((28,28))? ?要使用除了列表中的第一個數(shù)字外的所有數(shù)字,并且將這些字符串都轉(zhuǎn)化為實數(shù),而且要創(chuàng)建數(shù)組。將這個數(shù)組美經(jīng)過28個數(shù)字就折返一次,最終形成一個28*28的正方形矩陣
Matplotlib.pyplot.imshow(image_array,cmap=Grey,interpolation=None)? ?將輸出的畫布顏色調(diào)為灰色,以便更好地展示結(jié)果。
3.1 MNIST訓練數(shù)據(jù)
首要的是要將顏色的值進行整改,我們將較大的數(shù)字進行縮放,將[0,255]這一范圍縮放為[0.01,1.0],最低點選為0.01是為了避免最小值為0最終造成權(quán)重自動更新失敗。所以要將[0,255]范圍內(nèi)的數(shù)值同時除以255,得到[0,1],再乘以0.99,將范圍變到[0,0.99],最后再加上0.01,最終得到范圍是[0.01,1.0]。
Scaled_input=(numpy.asfarray(all_values[1:])/255.0*0.99)+0.01
Print(scaled_input)
對于激活函數(shù)而言,若輸出值為0或1時,會是權(quán)重達到飽和狀態(tài),使激活函數(shù)失效,因此我們將用0.01和0.99去替代0和1,這樣“5”的數(shù)組應該由原來的[0,0,0,0,0,1,0,0,0,0]顯示為[0.01,0.01,0.01,0.01,0.01,0.99,0.01,0.01,0.01,0.01]。構(gòu)建目標矩陣:
# output nodes is 10 (example)
Onodes=10
Targets=numpy.zeros(onodes)+0.01
Targets[int(all_values[0])]=0.99
3.2測試網(wǎng)絡(luò)。我們想要測試之前訓練的效果,獲取數(shù)據(jù)集:
# load the mnist test data CSV file into a list
Test_data_file=open(“mnist_dataset/mnist_test_10.csv”,r)
Test_data_list=test_data_file.readlines()
Test_data_file.close()
最后得出準確率為60%。
3.3 完整訓練集。下面我們將進行完整的訓練,用60000個訓練樣本來完成三層神經(jīng)網(wǎng)絡(luò)的訓練。
如上圖所示,我們可以觀察到準確率高達了94.73%,由此我們可以認為其準確率已經(jīng)是非常高的了!
4 模型改進
4.1 調(diào)整學習率。我們想提高準確率,首先想到的是調(diào)整學習率。我們先將學習率翻倍成0.6,但得到的結(jié)果不盡人意,最終準確率只有90.47%。于是我們決定降低學習率,將其值設(shè)為0.1,通過計算得到準確率為95.23%。再一次降低學習率至0.01,發(fā)現(xiàn)準確率下降至92.41%。因此,我們推測學習率對準確率的影響是一條變化的曲線,是存在峰值的。因此,繪制了學習率與準確率的圖像:
根據(jù)上圖發(fā)現(xiàn),學習率大概在0.2的時候,其準確率最高。
4.2 改變隱藏層節(jié)點數(shù)量。我們還可以通過改變隱藏層節(jié)點的數(shù)目來改變整個神經(jīng)網(wǎng)絡(luò)的形狀,從而也達到提高準確率的目的。
之前上文中我們所運用到的隱藏層的節(jié)點全部為100個,接下來就要減少、以及增加節(jié)點,來觀察準確率的變化。
經(jīng)過計算統(tǒng)計,若隱藏節(jié)點的個數(shù)為5個時,準確率大約為70%,而增加到200個節(jié)點時,準確率增加到97.62%.繪制圖像如下:
觀察上圖可以看出,隱藏節(jié)點大約在200個時,便可使準確率達到最高。
5 結(jié)論
訓練神經(jīng)網(wǎng)絡(luò)進行手寫識別,通過進行調(diào)整學習率和隱藏層節(jié)點個數(shù)可以大幅度提升識別的準確率。通過三層神經(jīng)網(wǎng)絡(luò)與數(shù)據(jù)集不斷計算,使神經(jīng)網(wǎng)絡(luò)具有學習功能。使用不同的激活函數(shù)也會有不同的效果。