上一篇《產(chǎn)品經(jīng)理也能動(dòng)手實(shí)踐的AI(一)- FastAI介紹》噪伊,介紹了為什么選擇FastAI,為什么適合產(chǎn)品經(jīng)理氮唯,為什么值得學(xué)習(xí)這項(xiàng)技能鉴吹。而寫這篇文章的目標(biāo)是,看完了之后可以更好的看懂教程中的內(nèi)容惩琉。
概覽
直接上例子豆励,核心代碼一共3行:
data = ImageDataBunch.from_name_re(path_img, fnames, pat, ds_tfms=get_transforms(),size=224)
learn = cnn_learner(data, models.resnet34, metrics=error_rate)
learn.fit_one_cycle(4)
識(shí)別準(zhǔn)確率是94.3%,在2012年瞒渠,寵物識(shí)別的準(zhǔn)確率才59%
核心步驟
創(chuàng)建圖像數(shù)據(jù) databunch?object
創(chuàng)建學(xué)習(xí)對(duì)象 learn object
開始訓(xùn)練 fit one cycle
調(diào)試
保存之前的模型
數(shù)據(jù)糾錯(cuò)
找到學(xué)習(xí)率
重新訓(xùn)練
前3個(gè)就是訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)必要的代碼良蒸,而之后的那些都是從各個(gè)角度去發(fā)現(xiàn)問題,然后提高準(zhǔn)確率伍玖。
這里還有幾個(gè)重要概念:
遷移學(xué)習(xí) transfer learning:類似于大師已經(jīng)提供了一套學(xué)習(xí)方法诚啃,我們?cè)谶@基礎(chǔ)上訓(xùn)練自己的學(xué)習(xí)方法;
錯(cuò)誤率 error rate:就是驗(yàn)證組數(shù)據(jù)私沮,預(yù)測(cè)錯(cuò)誤的百分比始赎;
損失 loss:我形象的稱為打臉指數(shù)和橙,就是越自信,但是卻預(yù)測(cè)錯(cuò)誤造垛,那loss就高
驗(yàn)證組 validation set:數(shù)據(jù)一般分為訓(xùn)練組和驗(yàn)證組魔招,驗(yàn)證組就是用來驗(yàn)證訓(xùn)練好的模型的準(zhǔn)確度五辽,驗(yàn)證組的數(shù)據(jù)是AI沒有見過的數(shù)據(jù)办斑;
過度擬合 overfit:有點(diǎn)類似于牛肉吃多了,吃什么都覺得像牛肉味……我舉不出更好的例子了杆逗,有想法記得給我留言挣柬;
學(xué)習(xí)率 learning rate:就類似于1個(gè)字1個(gè)字讀→一個(gè)個(gè)詞讀→一句句話讀,1個(gè)個(gè)字讀就屬于小的學(xué)習(xí)率睛挚,比較容易發(fā)現(xiàn)更細(xì)節(jié)的特征點(diǎn)邪蛔,而大的學(xué)習(xí)率會(huì)發(fā)現(xiàn)更宏觀的特征點(diǎn);
詳細(xì)講解
這節(jié)課的重點(diǎn)是跑通一個(gè)模型扎狱,并且調(diào)試到比較好的效果侧到,最終將準(zhǔn)確率提高到了95.8%。
Jeremy專門做了很多函數(shù)委乌,可以一鍵導(dǎo)入數(shù)據(jù),而不是在第一節(jié)課就制造N多阻礙荣回,所以只要在Jupyter notebook里一步步運(yùn)行就一定可以跑通遭贸,但是每一步或者每一個(gè)參數(shù)代表什么,是需要在實(shí)踐的過程中搞清楚的心软,前3個(gè)核心步驟基本看教程都很容易搞懂壕吹,不懂的查找文檔也很好理解。
這里重點(diǎn)說下調(diào)試部分删铃,首先需要保存一下現(xiàn)有訓(xùn)練的結(jié)果:
learn.save('stage-1')
然后可以通過2種方式去調(diào)節(jié)模型耳贬,一是創(chuàng)建 解釋器interpretation,找到異常圖片猎唁,然后刪掉它(下節(jié)課才講如何刪)咒劲;二是找到合適的 學(xué)習(xí)率learning rate進(jìn)行 微調(diào)fine-tuning。
先看解釋器,提到了2個(gè)函數(shù):plot_top_loss 和 most_confused腐魂,第一個(gè)是把錯(cuò)的最離譜的圖片都打出來帐偎,第二個(gè)是把猜錯(cuò)次數(shù)最多的類別給打出來。這樣就非常容易發(fā)現(xiàn)問題蛔屹,比如把出錯(cuò)次數(shù)最多的打出來之后削樊,發(fā)現(xiàn)這2種狗確實(shí)很接近,人的話也不是特別容易區(qū)分兔毒,這就可能需要單獨(dú)的大量的圖片訓(xùn)練漫贞。
然后是fine-tuning,這里是重點(diǎn)S迅脐!多強(qiáng)調(diào)一下,要想微調(diào)擂红,就要搞清楚圖像識(shí)別的原理仪际,或者叫CNN(convolutional neural network)卷積神經(jīng)網(wǎng)絡(luò)的原理,作者拿出了Clarify的CEO發(fā)表的一片通過視覺化理解卷積網(wǎng)絡(luò)的論文昵骤,詳細(xì)介紹了其中的原理树碱。
首先第一層的訓(xùn)練,屬于學(xué)習(xí)率特別低的訓(xùn)練变秦,機(jī)器找到了邊緣的規(guī)律成榜,發(fā)現(xiàn)這幾種顏色的漸變是特別常見的。
然后第二層蹦玫,基于第一層找到的邊緣赎婚,發(fā)現(xiàn)這些邊緣的連接,比如直角或者一個(gè)弧形是比較有共性的東西樱溉。
然后第三層挣输,基于第二層發(fā)現(xiàn)的線條,發(fā)現(xiàn)了各種形狀福贞。
然后第四層第五層撩嚼,感覺已經(jīng)可以識(shí)別特定的形狀和特定的物體了,隨著層級(jí)的提高挖帘,能識(shí)別的共性圖像的復(fù)雜性也在提高完丽,是因?yàn)閷W(xué)習(xí)率的提高,機(jī)器會(huì)選擇性的忽略細(xì)節(jié)拇舀,反而更多的關(guān)注宏觀的相似逻族。
第一次訓(xùn)練用的架構(gòu)叫做ResNet34,是一個(gè)基于上百萬(wàn)張圖片訓(xùn)練了34層之后得到的一個(gè)通用的圖片識(shí)別模型骄崩。之前的訓(xùn)練就是在這個(gè)模型之后增加個(gè)4個(gè)層聘鳞,訓(xùn)練之后的結(jié)果就已經(jīng)非常不錯(cuò)了薄辅,如果想變得更好,就只能將之前的模型解凍unfreeze搁痛,然后連貫起來重新訓(xùn)練长搀,并通過
learn.lr_find()
learn.recorder.plot()
找到loss和lr的關(guān)系
這張圖可以看到當(dāng)learning rate超過 10-4之后,loss明顯升高鸡典,就說明之前默認(rèn)的0.003的lr偏高了源请,所以調(diào)整lr
learn.fit_one_cycle(2, max_lr=slice(1e-6,1e-4))
至于為什么調(diào)到這個(gè)區(qū)間,之后的課程會(huì)將彻况,而現(xiàn)在就是一個(gè)可以充分實(shí)踐的機(jī)會(huì)谁尸。
最后得出的準(zhǔn)確率94.7%,比之前的94.3%只高了一點(diǎn)點(diǎn)纽甘,而95.8%的準(zhǔn)確率是通過ResNet50來實(shí)現(xiàn)的良蛮,因?yàn)檫@個(gè)pre-train的模型跑了50層,識(shí)別率更高悍赢,但非常占用計(jì)算機(jī)性能决瞳。
好了,草草的把介紹寫完了左权,很多東西沒法一篇文章寫完皮胡,一方面得自己多動(dòng)手嘗試去感受,另一方面確實(shí)有些概念得逐漸理解赏迟,希望這篇文章讓你對(duì)FastAI運(yùn)作的模式有了一個(gè)清晰的認(rèn)識(shí)屡贺。