整體思路:模型搭建--訓(xùn)練--測(cè)試--優(yōu)化
搭建基本模型階段:
step1:引入要用的包
step2:定義神經(jīng)網(wǎng)絡(luò)
step3:定義正向傳播訓(xùn)練過(guò)程
step4:定義反向傳播過(guò)程--更新權(quán)重
step5:查詢網(wǎng)絡(luò)--輸入數(shù)據(jù)端壳、返回輸出
step6:設(shè)定各層數(shù)量和參數(shù)
模型訓(xùn)練階段
模型測(cè)試階段
模型準(zhǔn)度計(jì)算以及后續(xù)優(yōu)化
一星著、搭建基本模型階段:
step1 導(dǎo)入后面需要用到的包:
為了方便,numpy簡(jiǎn)記為np,scipy.special簡(jiǎn)記為ss
numpy包的各種用法:https://blog.csdn.net/cxmscb/article/details/54583415 (非常詳細(xì))
scipy包的知識(shí):http://www.reibang.com/p/6c742912047f
tqdm:Tqdm 是 Python 進(jìn)度條庫(kù)闯参,可以在 Python 長(zhǎng)循環(huán)中添加一個(gè)進(jìn)度提示信息用法
step2:定義神經(jīng)網(wǎng)絡(luò)
解釋:
涉及到屬性的調(diào)用,詳細(xì)知識(shí)點(diǎn)請(qǐng)移步:http://www.reibang.com/writer#/notebooks/4844988/notes/58754235
inputNodes為輸入層牲芋,hiddenNodes為隱層剑梳,outputNodes為輸出層,learingRate為學(xué)習(xí)率
w_ih為輸入層與隱層之間的權(quán)重谣蠢; w_ho為隱層到輸出層的權(quán)重
正態(tài)分布的隨機(jī)數(shù)產(chǎn)生
numpy.random.normal(loc=0.0,scale=1.0, size=None)
loc:float 此概率分布的均值(對(duì)應(yīng)著整個(gè)分布的中心centre)
scale:float? 此概率分布的標(biāo)準(zhǔn)差(對(duì)應(yīng)于分布的寬度粟耻,scale越大越矮胖,scale越小眉踱,越瘦高)
size:int or tuple of ints? ? 輸出的shape挤忙,默認(rèn)為None,只輸出一個(gè)值
pow() 方法返回 xy(x的y次方) 的值谈喳;
lambda表達(dá)式册烈,通常是在需要一個(gè)函數(shù),但是又不想費(fèi)神去命名一個(gè)函數(shù)的場(chǎng)合下使用婿禽,也就是指匿名函數(shù)赏僧。
expit函數(shù)大猛,也稱為logistic sigmoid函數(shù),定義為expit(x)= 1 /(1 + exp(-x))淀零。 它是logit函數(shù)的反函數(shù)挽绩。
step3:定義正向傳播訓(xùn)練過(guò)程
解釋:
inputs=np.array(inputlist,ndmin=2).T 初始輸入值為輸入列的二維矩陣數(shù)據(jù)。.T就是轉(zhuǎn)置驾中,簡(jiǎn)單來(lái)說(shuō)將x和y值交換唉堪。后面targets同理。
hiddenInput=np.dot(self.w_ih,inputs) 隱藏層輸入值為權(quán)重和初始輸入值的矩陣積
numpy.dot用法詳見(jiàn):https://www.cnblogs.com/luhuan/p/7925790.html
self.activate 為激活函數(shù)方法的調(diào)用 肩民,每次輸出時(shí)唠亚,符合閾值條件的將觸發(fā)激活函數(shù)。
step4:定義反向傳播過(guò)程--更新權(quán)重
step5:查詢網(wǎng)絡(luò)--輸入數(shù)據(jù)持痰、返回輸出
這里就是實(shí)際輸入數(shù)據(jù)了灶搜,然后根據(jù)數(shù)據(jù)得到模型預(yù)測(cè)出來(lái)的值。
step6:設(shè)定各層數(shù)量和參數(shù)
神經(jīng)網(wǎng)絡(luò)由輸入層共啃、隱層占调、輸出層、學(xué)習(xí)率四個(gè)參數(shù)構(gòu)成
inputNodes: 輸入層的數(shù)量移剪,取決于輸入圖片(訓(xùn)練和識(shí)別)的像素究珊,像素點(diǎn)的數(shù)量等于輸入層的數(shù)量
hiddenNodes: 隱藏層的數(shù)量,一般比輸入層少纵苛,但具體不確定剿涮,可根據(jù)準(zhǔn)確率進(jìn)行調(diào)整
outputNodes: 輸出層的數(shù)量,等于需要分類的數(shù)量攻人。
學(xué)習(xí)率越大取试,每次學(xué)習(xí)變化越大,改變的越多怀吻,但接近準(zhǔn)確點(diǎn)時(shí)無(wú)法準(zhǔn)確到達(dá)
學(xué)習(xí)率越小瞬浓,每次學(xué)習(xí)更改的參數(shù)值就越小,只有大量的數(shù)據(jù)才能習(xí)得準(zhǔn)確值
需要注意的是:在89個(gè)訓(xùn)練集和11個(gè)測(cè)試集下蓬坡,inputNodes=307200才能跑猿棉。后續(xù)加大訓(xùn)練集和測(cè)試集,分別達(dá)到6萬(wàn)和2萬(wàn)的時(shí)候屑咳,inputNodes=784.
二萨赁、模型訓(xùn)練階段
多次利用相同的數(shù)據(jù)訓(xùn)練:tqdm.tqdm一共5個(gè),每次更新1個(gè)兆龙,一共更新5次
tqbar:遍歷循環(huán)每個(gè)圖片的數(shù)據(jù)矩陣杖爽,一共100個(gè),每次更新1個(gè),一共更新100次
圖像處理為什么轉(zhuǎn)換為double類型慰安?詳見(jiàn):https://blog.csdn.net/mine_land/article/details/79947734
numpy.asfarrary用法詳見(jiàn):https://docs.scipy.org/doc/numpy/reference/generated/numpy.asfarray.html
numpy.zeros(outputNodes)返回一個(gè)給定形狀和類型的用0填充的數(shù)組腋寨;詳見(jiàn):https://blog.csdn.net/qq_26948675/article/details/54318917
輸入數(shù)據(jù)x設(shè)置為0-1,最正確的目標(biāo)值y整數(shù)形式設(shè)置為0.99
三泻帮、模型測(cè)試階段
測(cè)試圖片用逗號(hào)分隔精置,輸出的的識(shí)別答案就是Y值计寇,即[0]的索引值锣杂。將測(cè)試輸入轉(zhuǎn)換為double的形式。將測(cè)試集數(shù)據(jù)輸入查詢網(wǎng)絡(luò)中得到replyOutput.
numpy.argmax輸出的是矩陣的最大值的索引值番宁。如果預(yù)測(cè)值正確元莫,則輸出1,如果預(yù)測(cè)值不正確蝶押,則輸出0.
四踱蠢、優(yōu)化階段:
首先測(cè)試準(zhǔn)確度:
在以上的參數(shù)下,我們只能得到0.45的準(zhǔn)確率棋电,準(zhǔn)確率如此之低茎截,我們需要進(jìn)行優(yōu)化。
我的優(yōu)化方方案如下
主要是調(diào)整:訓(xùn)練次數(shù)赶盔、隱層數(shù)量企锌、測(cè)試集和訓(xùn)練集的數(shù)量、學(xué)習(xí)率
調(diào)試方法1 在其他條件不變的前提下于未,調(diào)整迭代次數(shù)和隱層數(shù)量
調(diào)試方法2 在其他條件不變的前提下撕攒,調(diào)整學(xué)習(xí)率和隱層數(shù)量
調(diào)試方法3 根據(jù)前面得到的最優(yōu)組合進(jìn)一步研究
調(diào)試方法4 將訓(xùn)練集和測(cè)試集擴(kuò)大
調(diào)試方法1? 在其他條件不變的前提下,調(diào)整迭代次數(shù)和隱層數(shù)量
測(cè)試集為11烘浦,訓(xùn)練集為89抖坪,學(xué)習(xí)率為0.1
通過(guò)上圖我們可以得到結(jié)論:在訓(xùn)練集和測(cè)試集較小的時(shí)候,搭配0.1的學(xué)習(xí)率闷叉,我們無(wú)論如何改變隱層數(shù)量和迭代數(shù)擦俐,都無(wú)法提升準(zhǔn)確率。
有空白的原因:已經(jīng)測(cè)了19次了握侧,準(zhǔn)確率仍然無(wú)法上升蚯瞧,提示著我們需要轉(zhuǎn)換思路。
那么接下來(lái)提升準(zhǔn)確率就將往:擴(kuò)大訓(xùn)練集藕咏、測(cè)試集的數(shù)量或者改變學(xué)習(xí)率 這兩個(gè)方面探索状知。
接下來(lái)我們先嘗試改變學(xué)習(xí)率。
調(diào)試方法2 在其他條件不變的前提下孽查,調(diào)整學(xué)習(xí)率和隱層數(shù)量
測(cè)試集為11饥悴,訓(xùn)練集為89,迭代次數(shù)為5
通過(guò)上圖我們發(fā)現(xiàn),在學(xué)習(xí)率為0.005的條件下西设,平均準(zhǔn)度在所測(cè)范圍內(nèi)達(dá)到了最高瓣铣。同時(shí)在0.001的學(xué)習(xí)率下,產(chǎn)生了目前最高的準(zhǔn)確度0.82贷揽。并且這兩者的平均準(zhǔn)度也達(dá)到了0.6以上棠笑,已經(jīng)較調(diào)試方法1的準(zhǔn)確率有了0.2以上的增幅了。
綜上禽绪,我們得到了兩個(gè)比較合適的學(xué)習(xí)率:0.005和0.001蓖救。
同時(shí),我們可以推測(cè):在上述條件下印屁,當(dāng)層數(shù)達(dá)到150以上循捺,準(zhǔn)確度會(huì)有比較不錯(cuò)的表現(xiàn)
調(diào)試方法3 根據(jù)前面得到的最優(yōu)組合進(jìn)一步研究
我們選取隱層層數(shù)在200和300并且在0.001學(xué)習(xí)率的條件下,研究迭代數(shù)對(duì)于目前最優(yōu)的參數(shù)組合影響大不大雄人。(訓(xùn)練集為89从橘,測(cè)試集為11)
同時(shí)我們?cè)倩仡櫼幌抡{(diào)試方法1的結(jié)果:
從這兩個(gè)表格,我們可以得出結(jié)論:學(xué)習(xí)率在0.001和0.1時(shí)础钠,和訓(xùn)練集為89恰力、測(cè)試集為11時(shí),改變迭代次數(shù)對(duì)于準(zhǔn)確率的影響不大旗吁。
我們可以推測(cè):在測(cè)試集和訓(xùn)練集的數(shù)量較少的情況下踩萎,迭代數(shù)的增加對(duì)于準(zhǔn)確度的提升幫助不大。
至此阵漏,學(xué)習(xí)率的影響驻民、迭代數(shù)的影響、隱層層數(shù)的影響我們都已經(jīng)討論過(guò)了履怯。那么接下來(lái)我們的方向是:改變訓(xùn)練集和測(cè)試集的數(shù)量大小回还。
調(diào)試方法4 將訓(xùn)練集和測(cè)試集擴(kuò)大
前面的調(diào)試方法留給我們的疑問(wèn):
①當(dāng)擴(kuò)大了訓(xùn)練集和測(cè)試集后,迭代數(shù)的改變對(duì)于準(zhǔn)確度的影響大不大叹洲?
②當(dāng)擴(kuò)大了訓(xùn)練集集和測(cè)試集后柠硕,學(xué)習(xí)率的改變和隱層數(shù)量的改變的影響又是如何?
在這里首先感謝劉繼端同學(xué)提供的2萬(wàn)測(cè)試集和6萬(wàn)訓(xùn)練集运提。
疑問(wèn)1解答:
在擴(kuò)大后的訓(xùn)練集和測(cè)試集下蝗柔,迭代次數(shù)的變化對(duì)于準(zhǔn)確度的變化影響在0.1之內(nèi)。這對(duì)于找到0.99的準(zhǔn)確度還是挺有幫助的民泵,但對(duì)于0.9以下的準(zhǔn)確率提升作用不大癣丧。
疑問(wèn)2解答:
根據(jù)上表,我們可以看出在其他條件不變的情況下栈妆,隱層數(shù)量越多胁编,準(zhǔn)確度越高厢钧。同時(shí),在充分大的訓(xùn)練集和測(cè)試集的前提下下嬉橙,學(xué)習(xí)率越高(但不宜過(guò)高)早直,準(zhǔn)確度越高。
因此市框,在擴(kuò)大了訓(xùn)練集和測(cè)試集之后霞扬,模型的準(zhǔn)確度有了質(zhì)的飛躍。另外枫振,準(zhǔn)確度在隱層數(shù)量300-400之間喻圃,學(xué)習(xí)率為0.05-0.1之間準(zhǔn)確度會(huì)有比較不錯(cuò)的表現(xiàn)。
五蒋得、調(diào)試結(jié)果
通過(guò)多次測(cè)試级及,我們發(fā)現(xiàn)訓(xùn)練次數(shù)、隱層數(shù)量额衙、測(cè)試集和訓(xùn)練集的數(shù)量、學(xué)習(xí)率這四個(gè)是影響準(zhǔn)確率的主要因素怕吴。其中訓(xùn)練次數(shù)的影響力對(duì)比其他三個(gè)因素較小窍侧。訓(xùn)練集和測(cè)試集的數(shù)量影響最大。
總的來(lái)說(shuō):
①我們發(fā)現(xiàn)隱層的增加確實(shí)能增加準(zhǔn)確率转绷。但這需要合適的訓(xùn)練次數(shù)配合和學(xué)習(xí)率的配合伟件。并不是隱層越多、學(xué)習(xí)率越大议经、訓(xùn)練次數(shù)越多就能增加準(zhǔn)確率斧账。
②充分大的訓(xùn)練集和測(cè)試集對(duì)于準(zhǔn)確度的提升至關(guān)重要。
最終煞肾,基于以上調(diào)試方法咧织,我調(diào)試的的最佳參數(shù)為:
最優(yōu)準(zhǔn)確率為:
盡力了還是沒(méi)能調(diào)試到0.99.
代碼地址:https://gitee.com/kristina666/test.git