產品經理也能動手實踐的AI(二)- 做個識別寵物的AI

上一篇 ,介紹了為什麼選擇FastAI,為什麼適合產品經理,為什麼值得學習這項技能。而寫這篇文章的目標是,看完了之後可以更好的看懂教程中的內容。

概覽

直接上例子,核心代碼一共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)
產品經理也能動手實踐的AI(二)- 做個識別寵物的AI

識別準確率是94.3%,在2012年,寵物識別的準確率才59%

核心步驟

  1. 創建圖像數據 databunch object
  2. 創建學習對象 learn object
  3. 開始訓練 fit one cycle
  4. 調試
  5. 保存之前的模型
  6. 數據糾錯
  7. 找到學習率
  8. 重新訓練

前3個就是訓練一個神經網絡必要的代碼,而之後的那些都是從各個角度去發現問題,然後提高準確率。

這裡還有幾個重要概念:

  1. 遷移學習 transfer learning:類似於大師已經提供了一套學習方法,我們在這基礎上訓練自己的學習方法;
  2. 錯誤率 error rate:就是驗證組數據,預測錯誤的百分比;
  3. 損失 loss:我形象的稱為打臉指數,就是越自信,但是卻預測錯誤,那loss就高
  4. 驗證組 validation set:數據一般分為訓練組和驗證組,驗證組就是用來驗證訓練好的模型的準確度,驗證組的數據是AI沒有見過的數據;
  5. 過度擬合 overfit:有點類似於牛肉吃多了,吃什麼都覺得像牛肉味……我舉不出更好的例子了,有想法記得給我留言;
  6. 學習率 learning rate:就類似於1個字1個字讀→一個個詞讀→一句句話讀,1個個字讀就屬於小的學習率,比較容易發現更細節的特徵點,而大的學習率會發現更宏觀的特徵點;

詳細講解

這節課的重點是跑通一個模型,並且調試到比較好的效果,最終將準確率提高到了95.8%。

Jeremy專門做了很多函數,可以一鍵導入數據,而不是在第一節課就製造N多阻礙,所以只要在Jupyter notebook裡一步步運行就一定可以跑通,但是每一步或者每一個參數代表什麼,是需要在實踐的過程中搞清楚的,前3個核心步驟基本看教程都很容易搞懂,不懂的查找文檔也很好理解。

這裡重點說下調試部分,首先需要保存一下現有訓練的結果:

learn.save('stage-1')

然後可以通過2種方式去調節模型,一是創建 解釋器interpretation,找到異常圖片,然後刪掉它(下節課才講如何刪);二是找到合適的 學習率learning rate進行 微調fine-tuning。

先看解釋器,提到了2個函數:plot_top_loss 和 most_confused,第一個是把錯的最離譜的圖片都打出來,第二個是把猜錯次數最多的類別給打出來。這樣就非常容易發現問題,比如把出錯次數最多的打出來之後,發現這2種狗確實很接近,人的話也不是特別容易區分,這就可能需要單獨的大量的圖片訓練。

然後是fine-tuning,這裡是重點!!多強調一下,要想微調,就要搞清楚圖像識別的原理,或者叫CNN(convolutional neural network)卷積神經網絡的原理,作者拿出了Clarify的CEO發表的一片通過視覺化理解卷積網絡的論文,詳細介紹了其中的原理。

產品經理也能動手實踐的AI(二)- 做個識別寵物的AI

首先第一層的訓練,屬於學習率特別低的訓練,機器找到了邊緣的規律,發現這幾種顏色的漸變是特別常見的。

產品經理也能動手實踐的AI(二)- 做個識別寵物的AI

然後第二層,基於第一層找到的邊緣,發現這些邊緣的連接,比如直角或者一個弧形是比較有共性的東西。

產品經理也能動手實踐的AI(二)- 做個識別寵物的AI

然後第三層,基於第二層發現的線條,發現了各種形狀。

產品經理也能動手實踐的AI(二)- 做個識別寵物的AI

然後第四層第五層,感覺已經可以識別特定的形狀和特定的物體了,隨著層級的提高,能識別的共性圖像的複雜性也在提高,是因為學習率的提高,機器會選擇性的忽略細節,反而更多的關注宏觀的相似。

第一次訓練用的架構叫做ResNet34,是一個基於上百萬張圖片訓練了34層之後得到的一個通用的圖片識別模型。之前的訓練就是在這個模型之後增加個4個層,訓練之後的結果就已經非常不錯了,如果想變得更好,就只能將之前的模型解凍unfreeze,然後連貫起來重新訓練,並通過

learn.lr_find()learn.recorder.plot()

找到loss和lr的關係

產品經理也能動手實踐的AI(二)- 做個識別寵物的AI

這張圖可以看到當learning rate超過 10-4之後,loss明顯升高,就說明之前默認的0.003的lr偏高了,所以調整lr

learn.fit_one_cycle(2, max_lr=slice(1e-6,1e-4))

至於為什麼調到這個區間,之後的課程會將,而現在就是一個可以充分實踐的機會。

最後得出的準確率94.7%,比之前的94.3%只高了一點點,而95.8%的準確率是通過ResNet50來實現的,因為這個pre-train的模型跑了50層,識別率更高,但非常佔用計算機性能。

好了,草草的把介紹寫完了,很多東西沒法一篇文章寫完,一方面得自己多動手嘗試去感受,另一方面確實有些概念得逐漸理解,希望這篇文章讓你對FastAI運作的模式有了一個清晰的認識。


分享到:


相關文章: