CNN入門實戰:我如何把準確率從86% 提高到99%(上)
來自專欄卷積神經網路(CNN)入門講解70 人贊了文章
首發於專欄:
卷積神經網路(CNN)入門講解個人公眾號:follow_bobo
---------------------分割線--------------------------------------
哈哈哈,想不到我也能寫如此標題黨的文章
這個逼裝的我
竟然有種坑蒙拐騙的感覺
讓我想起來以前看到的《震驚,我是怎麼用10塊錢賺到1000萬的!》
哈哈哈
麻煩大家點個贊,就是那種,假裝我寫得很好的那種樣子
---------------------分割線--------------------------------------
今天我給大家講一個實例,也就是實際工程中,我是如何一步一步分析數據,從而使我的輸出結果能夠順利滿足客戶要求
首先我們要明白一點,這是工程項目,不是科研項目
AI的科研項目更多關注於局部問題,也是在一個點上進行突破,來證明自己演算法的先進性
但是AI工程項目是,只要能落地,管他什麼單槍棍棒,義大利炮都給我上
我們來看看下一幅圖,很好的闡釋了DL 演算法和工業應用的區別
也就是說我們平時所常用的,或者研究的CNN模型(也就是上面的trainer),只是整個工程Pipeline 的一部分,要想項目落地,其實需要一個非常複雜的流程,遠比上圖介紹的複雜
那麼今天,我就來介紹一個簡單的工程項目
重點不討論技術細節,重點在於是如何對數據進行分析處理的
數據就別問我要了,是不可能給的
-----------------------------------分割線------------------------------------------------
Step 1 : 展示數據
我要介紹的是一個AI醫療的項目,所用的數據是超聲波心電圖(Echocardiogram)
目的是給超聲波心電圖做分類,以達到幫助醫生快速選擇要檢測的心電圖類別
我想小夥伴們應該和我一樣,當我看到這個圖像數據是完全懵逼了
因為我的訓練和測試數據完全就像上圖所示,對於一個非醫學專業來說,沒法對圖片進行理解
但這影響一個AI工程師進行訓練和測試模型嗎,哈哈,不影響的
反正Deep Learning 模型都是end to end, 我理解不來,模型能理解就行
畢竟誰還不會跑個模型,調個參?
我先來簡單分析一下目前的數據情況:
- 目標類別一共20類,每類數量400-50不等
- 數據形式比較統一(都是超聲波圖和多普勒圖),背景比較單一(都是黑色),圖片質量參差不齊,很多情況下圖片包含大量雜訊
以上就是我看到數據的第一印象,但是這不影響我拿過來就是一頓train
我沒有對現有數據進行任何調整的情況下,考慮到數據量少,於是我使用VGG19-pretrain模型,只fine-tune 最後VGG19一層,最後分類準確率為86%
剛開始,我看到這個結果是比較滿意的
因為在沒有對數據進行任何處理的情況下,分類準確率為86%,至少證明一點,這個項目是可行的,是有希望把它做好
在此之前,大家對數據都不了解,誰也無法保證這個項目能不能成功
Step 2 : 選擇更好的Deep Learning模型
上面提到過,我使用的DL 模型是 VGG19,目的是為了證明項目的可行性,相當於建立一個Baseline
隨後,我保持其他條件不變,遍歷目前所有主流CNN模型,下面提供了代碼
蔣竺波:CNN入門講解:從0建立CNN訓練模型,微調目前所有主流deep learning 網路(代碼)(05/06/2018 更新)遍歷完事後,最後結果是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單獨摳出來
其實這一步非常麻煩,因為數據質量樣式參差不齊,很多情況下摳出來的效果如下:
ok, 假設我們已經把A,B都完整摳出來了,你們想想應該怎麼做
那邊玩手機的同學,麻煩把手機關了
其實模型也很簡單
把這個問題做成一個多輸入多輸出問題就好
這個時候,我們對A的分類器的Loss 設置了一權值為0.8的係數
我們希望B作為主輸出,A作為副輸出
想了解更多的同學,可以移步:
https://keras.io/getting-started/functional-api-guide/你們猜猜,這個簡單的網路
把我最後的分類準確率提高到了多少?
下期見
拜了個拜
推薦閱讀:
※Tensorflow實戰google深度學習框架代碼學習八(模型的保存和使用)
※【技術必備】解讀 2016 年十大機器學習演算法及其應用
※開始你人生第一個機器學習項目時,避開這些坑。
※人工智慧時代到來,並將會改變我們的生活,你準備好了嗎?
※「講座」圖靈獎得主Leslie Valiant報告
TAG:卷積神經網路CNN | 機器學習 | 深度學習DeepLearning |