CNN入門實戰:我如何把準確率從86% 提高到99%(上)

CNN入門實戰:我如何把準確率從86% 提高到99%(上)

來自專欄卷積神經網路(CNN)入門講解70 人贊了文章

首發於專欄:

卷積神經網路(CNN)入門講解?

zhuanlan.zhihu.com圖標

個人公眾號:follow_bobo

---------------------分割線--------------------------------------

哈哈哈,想不到我也能寫如此標題黨的文章

這個逼裝的我

竟然有種坑蒙拐騙的感覺

讓我想起來以前看到的《震驚,我是怎麼用10塊錢賺到1000萬的!》

哈哈哈

麻煩大家點個贊,就是那種,假裝我寫得很好的那種樣子

---------------------分割線--------------------------------------

今天我給大家講一個實例,也就是實際工程中,我是如何一步一步分析數據,從而使我的輸出結果能夠順利滿足客戶要求

首先我們要明白一點,這是工程項目,不是科研項目

AI的科研項目更多關注於局部問題,也是在一個點上進行突破,來證明自己演算法的先進性

但是AI工程項目是,只要能落地,管他什麼單槍棍棒,義大利炮都給我上

我們來看看下一幅圖,很好的闡釋了DL 演算法和工業應用的區別

也就是說我們平時所常用的,或者研究的CNN模型(也就是上面的trainer),只是整個工程Pipeline 的一部分,要想項目落地,其實需要一個非常複雜的流程,遠比上圖介紹的複雜

那麼今天,我就來介紹一個簡單的工程項目

重點不討論技術細節,重點在於是如何對數據進行分析處理

數據就別問我要了,是不可能給的

-----------------------------------分割線------------------------------------------------

Step 1 : 展示數據

我要介紹的是一個AI醫療的項目,所用的數據是超聲波心電圖(Echocardiogram)

目的是給超聲波心電圖做分類,以達到幫助醫生快速選擇要檢測的心電圖類別

超聲波心電圖(圖片來源於網路)

我想小夥伴們應該和我一樣,當我看到這個圖像數據是完全懵逼了

因為我的訓練和測試數據完全就像上圖所示,對於一個非醫學專業來說,沒法對圖片進行理解

但這影響一個AI工程師進行訓練和測試模型嗎,哈哈,不影響的

反正Deep Learning 模型都是end to end, 我理解不來,模型能理解就行

畢竟誰還不會跑個模型,調個參?


我先來簡單分析一下目前的數據情況:

  1. 目標類別一共20類,每類數量400-50不等
  2. 數據形式比較統一(都是超聲波圖和多普勒圖),背景比較單一(都是黑色),圖片質量參差不齊,很多情況下圖片包含大量雜訊

以上就是我看到數據的第一印象,但是這不影響我拿過來就是一頓train

我沒有對現有數據進行任何調整的情況下,考慮到數據量少,於是我使用VGG19-pretrain模型,只fine-tune 最後VGG19一層,最後分類準確率為86%

剛開始,我看到這個結果是比較滿意的

因為在沒有對數據進行任何處理的情況下,分類準確率為86%,至少證明一點,這個項目是可行的,是有希望把它做好

在此之前,大家對數據都不了解,誰也無法保證這個項目能不能成功


Step 2 : 選擇更好的Deep Learning模型

上面提到過,我使用的DL 模型是 VGG19,目的是為了證明項目的可行性,相當於建立一個Baseline

隨後,我保持其他條件不變,遍歷目前所有主流CNN模型,下面提供了代碼

蔣竺波:CNN入門講解:從0建立CNN訓練模型,微調目前所有主流deep learning 網路(代碼)(05/06/2018 更新)?

zhuanlan.zhihu.com圖標

遍歷完事後,最後結果是Densenet201表現最好,達到了90%,其次是Dense169,dpn92, 都89%

你們看,一天的功夫,僅僅遍歷一遍主流模型,我們已經達到了90%的分類準確

簡直可喜可賀,可口可樂

但是還是離我們的目標差了十萬八千里

因為這是醫療用途,醫療必須謹慎謹慎再謹慎

因此,我們一個落地的基本目標是

在保證速度的情況下,分類準確率至少在98%以上

這是一個看似簡單,但是極其複雜的問題,因為越往上走,提升準確率越難


Step 3 :調參,修改模型

說是調參,實際上就是在進行一個大量的嘗試的過程:

修改優化器的種類

修改學習率(learning rate)

冰凍(Freeze)某些層,不讓它更新參數

使不一樣的網路層有不一樣學習率

修改pooling層

修改Batch Normalization 層

修改全連接層

改變輸入數據的格式和大小

修改Loss function

。。。。。。。。

。。。。。。。。

因為沒有對數據進行深度研究過,只能拿別的調參方法用來這個數據集上瞎試咯

效果嘛,其實也就是好一丟丟,運氣好的話,能有91%的分類準確率

你可能會問我,為什麼一直在模型上下功夫

因為這個醫療數據,我每次看都頭大,不想研究它

為了能在每周彙報上有進展,我都會先在模型上解決一部分問題


Step 4 : 回到數據

通過我們和醫生的詳細討論之後,我們發現,首先醫生做分類,是通過一個整體部分來檢查的:

我們把上圖從原圖中切出來,相當於去掉了一點雜訊背景

這個數據圖像其實由兩部分組成:上面超聲波圖像,下面多普勒圖像

超聲波

多普勒

假設超聲波label為A,多普勒label為B, 最後醫生最終的label 就是A+B

但是醫生更看重B的分類結果

並且 A 和 B是 有一定聯繫的

大概知道了數據的含義後,這樣我們就可以針對性的做一個模型

接下來,我們先將A , B單獨摳出來

其實這一步非常麻煩,因為數據質量樣式參差不齊,很多情況下摳出來的效果如下:

失敗的摳圖1

失敗的摳圖2

ok, 假設我們已經把A,B都完整摳出來了,你們想想應該怎麼做

那邊玩手機的同學,麻煩把手機關了

其實模型也很簡單

把這個問題做成一個多輸入多輸出問題就好

這個時候,我們對A的分類器的Loss 設置了一權值為0.8的係數

我們希望B作為主輸出,A作為副輸出

想了解更多的同學,可以移步:

https://keras.io/getting-started/functional-api-guide/?

keras.io

你們猜猜,這個簡單的網路

把我最後的分類準確率提高到了多少?

下期見

拜了個拜


推薦閱讀:

Tensorflow實戰google深度學習框架代碼學習八(模型的保存和使用)
【技術必備】解讀 2016 年十大機器學習演算法及其應用
開始你人生第一個機器學習項目時,避開這些坑。
人工智慧時代到來,並將會改變我們的生活,你準備好了嗎?
「講座」圖靈獎得主Leslie Valiant報告

TAG:卷積神經網路CNN | 機器學習 | 深度學習DeepLearning |