###### tags: `講座` # CNN 影像辨識工作坊 - 用 CNN 辨識是否是白內障患者的眼睛 - 實作使用 **keras** ## 人工智慧、機器學習、深度學習 - 電腦模擬人類思考 - 機器學習 - 對收集到的資料進行分析 - 輸入一張圖,提取其中的**特徵** - 經過 classifer(分類器) - 建出 model - 做預測 - 中間隱藏層超多 - 可以做非線性規劃 - 深度學習 - 對收集到的資料進行分析 - 只需把照片放入,輸入後,他會自己去學那些**特徵** - 不用特徵提取 - CNN 屬於神度學習的一種 > DEEP lEARNING 不需要特徵提取, machine learning 要 ## 卷積神經網路 CNN - 卷積層(Convolution) - 池化層(pooling) - 扁平層(flatten) - 全連結層(Fully connection) ### 卷積層 - 圖像透過卷積核會形成一個特徵圖 - 圖像 ⊕ 捲積核 = 捲積後特徵圖 - 捲積核: 為一 n*n 矩陣 (n為奇數) - n 愈小,提出的特徵愈細緻 - n 愈大,特徵圖像可能會太粗糙 - ==激活函數== - 特徵通常會是線性,但圖像出來的特徵不太是線性 - 所以用激活讓集中(?) - 方法: - sigmoid: 將數值全部轉換成 0 - 1 之間設一個罰值(通常是0.5),將特徵分為 2 類 - reLU: 把小於 0 的都變 0,大於 0 的維持原本的 - CNN 將特徵提取的部分包在卷積層 - ![](https://i.imgur.com/9VLJFmf.png) ### 池化層 - 降維 - 4x4 -> 2x2 - 降低特徵圖片尺寸 -> 數值變少 -> 運算速度變快 - 將較重要的特徵做提取 - ![](https://i.imgur.com/yDGetiD.png) ### 扁平層 - 將二維矩陣拉成一維矩陣,才可以丟入全連接層 - ![](https://i.imgur.com/rY2L0MK.png) ### 全連結層 - 又稱密集層 - 包含 **輸入層、隱藏層、輸出層** - 輸入層的輸出值 = 隱藏層的輸入值 - 做權重、bias 的學習 - 優化器 - `adam` - 損失函數:算預測值、真實值之間差多少,差距愈小愈好 - 衡量尺度 - ![](https://i.imgur.com/ZC1zynX.png) :::info #### CNN 的層數設計 - (卷積+池化) * N 層 - N 可以自由設定,通常介於 1~4 - 不斷縮小尺寸得到想要的部分 - 扁平層 * 1 層 - 全連接層 * 1層 - 但裡面還有許多小層 ::: :::warning 需要一直嘗試哪個參數組合最好 ::: ## 評估 model 表現 - 混淆矩陣 - TP、TN越大越好 ; FP、FN越小越好 - ![](https://i.imgur.com/lwKxAsz.png =60%x) - ![](https://i.imgur.com/nhQq6Zg.png =60%x) - 指標 - ![](https://i.imgur.com/Y2samjs.png =60%x) rmse mae ## Demo - 下載程式碼 & 資料集:https://drive.google.com/drive/folders/1qXF5FCyiqVVZM3DEr4TcEIJGmIZzEN56 - 安裝虛擬環境 ```shell= pip install pipenv pipenv shell ``` - 安裝 package ```shell= pip install tensorflow pip install matplotlib pip install h5py pip install SciPy ``` - 訓練模型 ```shell= py trainmodel.py ``` - 預測結果 ```shell= py predictmodel.py ``` :::info - 將 `dataset資料夾` 移動到 `mainCode資料夾` 之下 - 注意程式指定的檔案路徑和真正圖片相同 - `py trainmodel.py`資料夾路徑有誤 - 要測試 `predictmodel.py` 時,手動更改圖片路徑及名稱 :::