我又學會 machine learning (ML) 一項技術 – 卷積神經網路 (convolutional neural network / CNN) 深度學習 (deep learning / DL)✌️
CNN DL 是 2012 年爆紅的一項技術,適合作圖片分類。首先是 AlexNet 的 CNN 達到當時一項挑戰的最低的錯誤率,後來陸續出現許多 CNNs,差異在 DL models 的結構(主要是模型各 NN 層是如何組合、堆疊)。
我實作的是用 PyTorch 做一個簡易的 CNN – TinyVGG. 作 ML 首先要有資料,我使用的是 CIFAR-10 圖片資料集,它有 10 個圖片分類。接著就照 TinyVGG 模型的層結構去堆疊 NN 層,用到的有 Conv2d, ReLU, MaxPool2d, Flatten, Linear。Conv2d 用於提取圖片中 2 維特徵、ReLU 加入非線性特性、MaxPool2d 移除較不重要的特徵,減少計算量、Flatten 為了接下來要接線性層,將多維(不含 batch 維度)特徵轉成 1 維、Linear 作分類器 (classifier)。
圖 1 是模型訓練 200 次後,所得到 training data 的 loss 與 accuracy. accuracy 起初 16%,後來達到 84%. (因為訓練有一些花時間,所以我就沒再跑更多訓練去測模型的極限 accuracy。)

圖 2 是圖片真實類別與模型預測的 confusion matrix,對角線代表預測正確的總數,其餘為預測錯誤。其中 cat – dog 有較大的錯誤值 776,代表模型較容易將貓猜成狗,應該是它們的體型相近的關係😅

程式原始碼:
https://github.com/MrMYHuang/pytorch_dl_cnn
另外,我一開始跑 TinyVGG 的訓練並非順利,因為我沒照我看的教學使用較簡單的 FashionMNIST 資料集,而是用難度較高的 Flowers102 資料集。但 TinyVGG 的能力不足以支援 Flowers102, loss 一直降不了,讓我花了不少時間 debug。但我覺得這試錯很值得,因為我學會一些技巧,處理面對一個不易分析的 ML 模型時,要如何找到問題主因,比如換成簡易資料集後,loss 就明顯下降,就得知是 model 能力的限制。
學會了 CNN DL,再為自己的履歷添上一筆😄