跳到主要內容

發表文章

目前顯示的是 11月, 2024的文章

CV Day 8 評估與診斷:top-k、混淆矩陣、信心校準

 CV Day 8 評估與診斷:top-k、混淆矩陣、信心校準 執行需求:CPU 可跑 。本篇所有範例都在一般筆電的 CPU 上跑得動;包含一個小型 CNN 在 CIFAR-10 子集上的訓練(約 3 分鐘)與完整的 top-k、混淆矩陣、信心校準分析。GPU 會跑得更快,但不是必須。 引言 昨天的內容中,我們把四個訓練技巧一次疊上去,讓模型在同一個資料集上多拿 0.5–1.5 個百分點的 top-1。但訓練結束並不表示工作完成:模型到底學到了什麼?它在哪些類別上特別容易出錯?它給出的信心分數到底可不可信?這些問題需要一套完整的「評估與診斷」方法才能回答。評估不是把測試集丟進模型、印一個正確率就算交差,而是要從多個面向拆解模型的行為,找出下一步該改進的方向。 這一篇要帶你認識影像分類任務的三個核心評估工具: top-k 正確率 看模型在前 k 個預測中是否包含正確答案; 混淆矩陣 把錯誤集中在哪幾對類別之間視覺化; 信心校準 (calibration)則檢查模型給出的機率是否真的反映「預測為對的機率」。我們會用一個在 CIFAR-10 子集上訓練的小型 CNN 走完整流程,並把所有指標畫成圖表與表格,方便你在自己的任務上重現同樣的分析。讀完這篇,你會了解三個指標的數學定義、PyTorch 與 scikit-learn 的對應 API,以及當指標不理想時該從哪個方向改善。 top-k 正確率 top-k 正確率回答一個簡單問題:「模型的預測機率前 k 名中,有沒有包含正確答案?」對 k=1 來說就是我們熟悉的正確率(top-1);對 k=5 來說,只要正確答案出現在預測前五名就算對,這在 ImageNet 這種 1000 類任務上特別常用,因為類別之間本來就有視覺相似性(例如「哈士奇」與「阿拉斯加雪橇犬」),top-1 反而會低估模型的實力。 PyTorch 計算 top-k 不需要額外安裝套件,用 logits.topk(k, dim=1) 一次取得前 k 名的索引,再用 pred.eq(labels.view(-1, 1)).any(dim=1) 比對即可。這個寫法的關鍵在「廣播比對」:把標籤形狀從 (B,) 擴展成 (B, 1) ,再與 (B, k) 的預測做元素相等比較,最後沿著 k 軸取 any,就能一次得到每個樣本是...

CV Day 7 訓練技巧:餘弦排程、標籤平滑、EMA、混合精度

CV Day 7 訓練技巧:餘弦排程、標籤平滑、EMA、混合精度 執行需求:Colab T4 可跑 。本篇在 Colab 免費 T4 上跑一次 5 epoch 的訓練,加上四個進階技巧,總時間約 25 分鐘。CPU 不建議執行本範例,會跑超過 6 小時。 引言 昨天的內容中,我們用 resnet50.a1_in1k 在 CIFAR-10 貓狗任務上跑了一次遷移學習,收斂速度與最終表現都還有提升空間。今天要解決這個問題:在同樣的骨幹與資料上,加入四個進階訓練技巧—— 餘弦學習率排程 、 標籤平滑 、 EMA 模型平均 、 混合精度 。這四個技巧彼此獨立、可以同時套用,加在一起通常能讓模型在 ImageNet 訓練上多爭取 0.5–1.5 個百分點的 top-1,同時把 GPU 訓練時間壓縮 30% 左右。 這些技巧並非新發明:餘弦排程在 2017 年的 SGDR 論文提出、標籤平滑來自 2016 年的 Inception-v2、EMA 是 1990 年代就有的模型平均、混合精度在 2018 年的 Apex 資料庫成熟。但它們是 timm 與 torchvision 預設訓練配方的基石,理解每個技巧的原理與參數選擇,能讓你在調參時不再盲目亂試。讀完這篇你會了解四個技巧的數學定義、PyTorch/timm 的對應 API,以及把四者整合在一起的標準訓練流程,並能把這些技巧拆開或重組,套到自己的影像任務上。 餘弦學習率排程 學習率排程(learning rate schedule)決定訓練過程中學習率怎麼變動。最直觀的方式是 Step Decay:每 N 個 epoch 把學習率乘以 0.1,例如 30、60、90 epoch 各降一次。這在 ResNet 時代很常見,但有兩個缺點:要事先決定 epoch 數、不容易在訓練中調整節奏。另一個常見的變體是 Exponential Decay(指數衰減):每個 step 把學習率乘以固定衰減率( lr * gamma^step ),曲線比 Step 平滑,但仍要選對 gamma 。餘弦排程則把衰減曲線交給餘弦函式本身決定,省下手動調 gamma 的麻煩。 餘弦排程(Cosine Annealing)把學習率隨時間的變化畫成餘弦曲線的一半週期: lr(t) = lr_min + 0.5 * (l...

CV Day 6 用 timm 與預訓練權重做遷移學習

CV Day 6 用 timm 與預訓練權重做遷移學習 執行需求:Colab T4 可跑 。本篇在 Colab 免費 T4 上完整跑一次遷移學習;訓練一個 epoch 的 ResNet-50 大約 8 分鐘。如果你只用 CPU,請先跳過訓練,直接觀察模型載入與評估段落。 引言 昨天的內容中,我們認識了 ResNet、EfficientNet、ConvNeXt、視覺 Transformer 四個影像分類骨幹,知道它們各自解決了什麼問題。但要在自家資料上拿到好表現,我們不太可能從頭訓練一個 86M 參數的 ViT-Base,這時候就要靠 遷移學習 :把在 ImageNet 上預訓練好的權重當起點,再用較小的標註資料微調(fine-tune),讓模型學到符合任務的特徵。實務上,超過九成的影像分類專案都是用遷移學習起步,這是深度學習工程師的標準武器。 這一篇要帶你用 timm 1.0.x 把昨天的骨幹接到新任務上。我們會準備一個二分類的影像任務(CIFAR-10 的貓與狗),從頭示範資料準備、預訓練權重載入、分類頭替換、差動學習率設定、訓練迴圈、評估與模型儲存。讀完這篇,你會了解遷移學習的標準流程,以及 timm 在每一步提供的工具與 API,並能在自己的資料集上重現整個流程。 為什麼用 timm 做遷移學習 timm 提供超過一千種模型與數千份預訓練權重,這是它跟手刻 torchvision 模型最大的差別。同一個 ResNet-50, timm 給出至少五種權重: resnet50.tv_in1k (torchvision 原始)、 resnet50.a1_in1k (timm A1 配方)、 resnet50.a1h_in1k (含額外增強)、 resnet50.rsb_a1_in1k (RSB 改良訓練)等等。挑選合適的權重,往往比換骨幹更能提升遷移學習的表現。同樣的道理也適用於 ConvNeXt-Tiny: fb_in1k 與 fb_in22k_ft_in1k 兩個版本在遷移到醫療或衛星圖時,常常會差到 3–5 個百分點。如果資料集與 ImageNet 比較接近(例如一般消費性影像),A1 配方是最常見的起點;如果資料偏自然場景或稀有物件,可以考慮 in21k 預訓練的版本。 另外 timm 把「資料預處理」也包進模型設定...

CV Day 5 現代分類架構:ResNet、EfficientNet、ConvNeXt、ViT

CV Day 5 現代分類架構:ResNet、EfficientNet、ConvNeXt、ViT 執行需求:CPU 可跑 。本篇以 timm 1.0.x 為主軸,所有範例都不需要 GPU;若你想實際比對四種架構的推論速度,把同一份程式貼到 Colab 並切到 T4 即可。 引言 昨天的內容中,我們認識了 RandAugment、MixUp、CutMix 這些資料增強手法,知道它們能在訓練時為同一張影像製造出多種變化,進一步提升模型的泛化能力。不過,光靠資料端的技巧還不夠;模型本身的歸納偏誤(inductive bias)才是決定收斂速度與最終表現的關鍵。過去十年,影像分類的骨幹經歷了三次重大轉折:殘差連接讓 CNN 變深、複合縮放讓 CNN 變聰明、Transformer 讓我們重新思考「卷積是不是必要的」。 這一篇要帶你認識 2015 年以來最具代表性的四個影像分類骨幹: ResNet 、 EfficientNet 、 ConvNeXt 與 視覺 Transformer(Vision Transformer,ViT) 。它們各自代表了一種設計哲學:捷徑連接救回了深度、複合縮放讓參數與解析度聯手放大、ConvNeXt 把 Transformer 的訓練配方搬回純 CNN、ViT 則完全拋開卷積只靠注意力。 讀完這篇你會了解:四個骨幹的核心差異與設計動機; timm 載入預訓練權重與建立任意類別數模型的 API;ViT 的 patch embedding、class token、位置編碼三個關鍵元件;以及在 CPU 上驗證模型結構與推論流程的方法。下兩篇會把這些骨幹接到遷移學習與訓練技巧上,做出可上線的影像分類器,並評估在真實資料上的表現差異。 ResNet 與殘差連接 ResNet(He 等人,2015)的核心觀念非常簡單:與其讓某一層直接學習從輸入 x 到輸出 H(x) 的對應,不如讓它學習殘差 F(x) = H(x) - x ,再透過捷徑連接(shortcut)把輸入 x 加回去,得到 H(x) = F(x) + x 。這個看似不起眼的小改動,解決了深層網路的退化問題:在傳統 CNN 裡,把網路疊到 50、100 層以上,訓練誤差反而會變高,不是過擬合,而是最佳化器找不到夠好的解。 殘差連接讓梯度可以沿著捷徑直接往回傳...

CV Day 4 資料增強進階:RandAugment、MixUp、CutMix

CV Day 4 資料增強進階:RandAugment、MixUp、CutMix 執行需求:Colab T4 可跑 。今天進入分類章節的第一道關卡:資料增強。我們會介紹三個 2024 年仍是最強的進階增強方法——RandAugment、MixUp、CutMix,並用 torchvision 與 timm 把這三招實際應用在一個 CIFAR-10 的小訓練上。今天的範例以 Colab T4 為基準,本地 GPU 也能跑;如果用 CPU,會慢到不建議嘗試完整訓練,但單張影像的視覺化與增強函式測試仍可在 CPU 上跑。 引言 資料增強(data augmentation)是電腦視覺裡「成本最低、效果最好」的一招。它的核心概念是:在不改變語意的前提下,對訓練影像做隨機變換,讓模型看到「同一類別的不同樣貌」。一個看過一萬張「稍微不同」的貓的模型,比看過一萬張一模一樣的貓的模型,泛化能力好得多。 最基礎的增強包括翻轉、裁切、縮放、色彩抖動,這些 torchvision 的 transforms 都能直接做。但當基礎增強的紅利吃完之後(通常在 ResNet + ImageNet 上能拿到 1 到 2 個百分點進步),就需要更進階的方法。2019 年以後,RandAugment、MixUp、CutMix 這三招成為 ImageNet 排行榜的標配,至今仍是 timm、torchvision 與各大開源模型倉庫預設的增強策略。這三招的共通點是:它們都把「單一乾淨影像」當作出發點,透過混合、遮擋、自動搜尋三種不同方式,強迫模型學會更強健的特徵表示。 今天我們不只解釋原理,更要在 CIFAR-10 上實際跑一輪「無增強 vs 進階增強」的對照實驗。為了讓 Colab 免費額度跑得動,我們用 ResNet18 + CIFAR-10(5 萬張訓練、1 萬張測試、10 類、32×32),訓練 5 個 epoch。你會看到 top-1 從無增強的 80% 上下,進步到進階增強的 90% 出頭——這 10 個百分點,就是 RandAugment + MixUp + CutMix 的威力。學完今天的範例,你不只會寫增強程式碼,更能理解「為什麼這些方法有效」、「什麼時候該用什麼」、「怎麼判斷增強強度是否合理」這三個實戰問題。 三種增強策略的核心原理 這三招看似都「破壞影像...