據(jù)增強與混淆矩陣:圖像分類模型訓(xùn)練與評估實戰(zhàn))
最近在系統(tǒng)地重刷一門非常經(jīng)典的機器學(xué)習(xí)公開課正好整理到“數(shù)據(jù)增強”和“混淆矩陣”這兩個部分。說實話這兩個內(nèi)容在課程里往往都被一兩句話帶過實戰(zhàn)中卻幾乎是每個圖像任務(wù)都繞不開的硬骨頭。數(shù)據(jù)增強解決“數(shù)據(jù)不夠、模型學(xué)不進去”的問題混淆矩陣解決“模型有沒有真的學(xué)會”的問題——一個管訓(xùn)練一個管評估兩者看似獨立放在一起用才最有意思。這篇文章我打算按自己的學(xué)習(xí)路徑來寫先講清楚數(shù)據(jù)增強到底在做什么、常用方法怎么選、如何用常見框架實現(xiàn)一套完整流水線再轉(zhuǎn)到混淆矩陣的概念推導(dǎo)、多分類展開和可視化實操最后用一個小實驗把兩者串起來看看增強手段到底怎么影響評估指標。適合正在學(xué)機器學(xué)習(xí)、做圖像分類或者準備項目答辯的讀者至少能幫你少踩幾個我踩過的坑。1. 先聊清楚數(shù)據(jù)增強到底在解決什么問題1.1 小樣本與過擬合的惡性循環(huán)我第一次跑圖像分類任務(wù)的時候手里只有幾千張圖模型還偏深。訓(xùn)練集準確率很快就飆到99%以上驗證集卻一直卡在85%上下波動——這就是最典型的過擬合。模型不是在學(xué)“貓和狗的區(qū)別”而是在背訓(xùn)練集里每張圖的噪聲和背景。為什么會產(chǎn)生這種情況神經(jīng)網(wǎng)絡(luò)的參數(shù)量非常龐大尤其卷積網(wǎng)絡(luò)動輒幾百萬參數(shù)而幾千張圖片提供的有效約束遠遠不夠。模型可以找到無數(shù)種方式在訓(xùn)練集上“死記硬背”其中大多數(shù)方式對未見過的數(shù)據(jù)毫無泛化能力。這時候最直接的思路是增加訓(xùn)練數(shù)據(jù)但現(xiàn)實中標注成本很高尤其醫(yī)學(xué)影像、工業(yè)缺陷檢測這類領(lǐng)域湊數(shù)據(jù)不是靠爬蟲就能解決的。數(shù)據(jù)增強就是在這種困境下被大量采用的手段。它的核心在于在不改變樣本語義的前提下對原始圖像做一系列“無害變換”讓模型看到同一個樣本的更多形態(tài)。貓水平翻轉(zhuǎn)之后還是貓亮度調(diào)暗一點也還是貓。模型從“記住一張圖”變成“理解一類模式”泛化能力自然更強。1.2 數(shù)據(jù)增強的本質(zhì)在保持語義不變的前提下擴展樣本分布打個比方一個人認貓只看過貓正面端坐的照片那他在現(xiàn)實中見到背對著他的貓可能就認不出來了。但如果他從小見過貓的各個角度、各種光線、各種姿勢那“貓”這個概念在他腦子里就是一個豐富立體的分布而不是一張圖像。數(shù)據(jù)增強做的就是這件事——把訓(xùn)練集從一本“靜態(tài)相冊”變成一段“動態(tài)視頻”。水平翻轉(zhuǎn)、隨機裁剪、色彩抖動、添加噪聲本質(zhì)上都是在原始樣本周圍進行合理插值擴大模型對輸入分布的感受范圍。關(guān)鍵約束是“語義不變”你不能把一個6旋轉(zhuǎn)成9不能把一張人臉圖片旋轉(zhuǎn)180度后還指望模型學(xué)到正確的面部特征也不能把“停車標志”的顏色隨意篡改。增強過度等于給數(shù)據(jù)加了錯誤標簽反而會把模型帶偏。1.3 什么時候不能用數(shù)據(jù)增強關(guān)鍵禁忌很多教程只講“增強很好”但很少講“增強不能亂用”。以下是我實際踩過坑的幾類場景第一方向敏感任務(wù)。文字識別、車牌識別、交通標志識別這類方向性很強的任務(wù)不適合大角度旋轉(zhuǎn)。一張“STOP”標志旋轉(zhuǎn)180度語義直接變成了另一回事。水平翻轉(zhuǎn)對數(shù)字6和9、字母b和d同樣會造成標簽混淆。第二尺度敏感任務(wù)。醫(yī)學(xué)圖像中病灶大小往往和病理等級直接相關(guān)無節(jié)制縮放會破壞這種尺度信息。工業(yè)質(zhì)檢里一個劃痕被隨機裁剪放大后可能看起來像另一個缺陷類別。第三驗證集和測試集不能做相同的增強。很多人圖省事把數(shù)據(jù)增強流水線整套套在驗證集上。這會導(dǎo)致驗證集和訓(xùn)練集的分布被人為拉近評估結(jié)果虛高部署后真實性能反而掉下去。正確的做法是訓(xùn)練集做增強驗證集和測試集只做縮放、歸一化這類確定性預(yù)處理。注意數(shù)據(jù)增強是訓(xùn)練策略不是數(shù)據(jù)預(yù)處理策略。可以把它理解為給模型“加難度”的輔助輪真正的路況評估還是要在原圖分布上進行。2. 常用數(shù)據(jù)增強方法盤點與效果解讀2.1 幾何變換翻轉(zhuǎn)、旋轉(zhuǎn)、縮放、裁剪幾何變換是效果最直觀的一類增強。水平翻轉(zhuǎn)幾乎是圖像分類任務(wù)的標配實現(xiàn)簡單、風險低尤其對自然場景圖片幾乎總是安全的。隨機裁剪則有兩種用法一種是裁剪到固定大小并縮放相當于讓模型看到物體的局部特征另一種是按一定比例裁剪后再resize到原始尺寸相當于同時做了輕微縮放。旋轉(zhuǎn)通常在±10度到±30度之間選擇角度太大會讓物體邊緣大量出畫等于變相裁剪掉關(guān)鍵信息??s放的范圍一般在0.8到1.2之間配合隨機裁剪使用。平移則可以通過填充常數(shù)或反射填充來實現(xiàn)注意填充值最好和數(shù)據(jù)集均值一致否則圖上會出現(xiàn)明顯的邊框痕跡。這些幾何變換本質(zhì)上是讓模型對“位置、姿態(tài)、尺度”不敏感。如果你在卷積網(wǎng)絡(luò)里已經(jīng)用了較好的全局池化和多尺度訓(xùn)練這些增強的作用會被進一步放大。2.2 顏色與紋理擾動亮度、對比度、飽和度、噪聲顏色類增強的作用容易被低估。同一類物體在不同光照條件下拍攝顏色分布差異可以非常大。讓模型在訓(xùn)練時看到多種亮度、對比度、色相和飽和度會讓它在白天、夜晚、陰天場景下都保持穩(wěn)定。具體參數(shù)上亮度調(diào)整范圍一般在±0.2左右乘性因子0.8~1.2對比度和飽和度類似。色相偏移要特別小心它會把顏色的類別信息改變——比如紅色和橙色在某些任務(wù)中本身就是區(qū)分類別的關(guān)鍵線索。通常色相偏移不超過±0.1。高斯噪聲也是一種有效的增強它讓模型忽略傳感器噪聲和高頻紋理細節(jié)從而更關(guān)注物體的結(jié)構(gòu)特征。加噪聲的幅度不宜過大否則圖像變得模糊正常內(nèi)容反而被淹沒。我一般傾向于把噪聲作為最后手段當幾何和顏色增強都不見效時再考慮。2.3 更聰明的組合式增強Mixup、Cutout、AutoAugment除了單張圖像的變換還有一些更高級的增強策略。Mixup的思路很巧妙把兩張訓(xùn)練圖按比例線性疊加同時把標簽也按同樣的比例混合。比如一張貓和一張狗各取0.7和0.3的權(quán)重合成新圖標簽就是0.7的貓和0.3的狗。這相當于在樣本之間制造連續(xù)的過渡樣本迫使模型學(xué)會“平滑”的決策邊界而不是在邊界處過擬合。這個方法可以顯著減少訓(xùn)練中的震蕩但也會增加收斂時間。Cutout隨機擦除是另一種思路在圖像中隨機選一個矩形區(qū)域把里面的像素置為零或隨機噪聲。模型被迫學(xué)會利用物體的局部特征而不是依賴某個“關(guān)鍵部位”。對遮擋場景很有效比如行人被汽車擋住一半的情況。AutoAugment這類自動搜索方法則是把增強策略的選擇本身交給算法。它在子策略空間里搜索哪種變換組合、參數(shù)范圍對當前數(shù)據(jù)集最有效。思想很好搜索成本也高不是所有項目都有必要上。如果只是做一個小分類任務(wù)手動選3到4種增強就夠用了。2.4 增強策略選擇參考表不同任務(wù)適合的增強手段差異很大我把自己常用的一些判斷列成表格供參考任務(wù)類型推薦的增強手段謹慎使用或避免的增強自然圖像分類水平翻轉(zhuǎn)、隨機裁剪、輕度旋轉(zhuǎn)、顏色抖動大角度旋轉(zhuǎn)、色相大幅偏移細粒度識別隨機裁剪、縮放、Cutout過度顏色擾動、水平翻轉(zhuǎn)某些紋理不對稱醫(yī)學(xué)影像輕度平移、縮放、仿射變換、對比度調(diào)整水平翻轉(zhuǎn)視部位而定、大范圍擦除文字/OCR輕微透視變換、對比度調(diào)整、模糊旋轉(zhuǎn)接近90度、水平翻轉(zhuǎn)工業(yè)缺陷檢測旋轉(zhuǎn)90度步進、翻轉(zhuǎn)、顏色擾動過度模糊、隨機擦除面積過大表格里的內(nèi)容不是絕對標準但可以作為起步配置。核心判斷依據(jù)只有一條增強之后人還能不能一眼認出這是什么如果連人都認不出模型大概率也學(xué)不到什么正面的東西。3. 用框架實現(xiàn)標準增強流水線實操3.1 環(huán)境準備與數(shù)據(jù)準備我用的是深度學(xué)習(xí)中比較常見的PyTorch生態(tài)配合 torchvision 提供的 transforms 模塊可以非常方便地把多種增強組合成一條流水線。先導(dǎo)入基礎(chǔ)庫import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset from torchvision import datasets, transforms from PIL import Image數(shù)據(jù)準備階段以簡單的圖像二分類為例目錄結(jié)構(gòu)可以這樣組織data/ ├── train/ │ ├── class_a/ │ ├── class_b/ └── val/ ├── class_a/ └── class_b/使用datasets.ImageFolder可以直接按目錄結(jié)構(gòu)讀取數(shù)據(jù)不需要手寫 Dataset。對于不熟悉這個接口的讀者它本質(zhì)上就是在做兩件事遍歷文件夾把每個子目錄名映射成整數(shù)標簽。3.2 訓(xùn)練集增強與驗證集預(yù)處理的正確寫法這里需要非常明確地分成兩套變換流程一個用于訓(xùn)練集一個用于驗證集。train_transform transforms.Compose([ transforms.RandomResizedCrop(size224, scale(0.8, 1.0)), transforms.RandomHorizontalFlip(p0.5), transforms.RandomRotation(degrees15), transforms.ColorJitter(brightness0.2, contrast0.2, saturation0.2, hue0.05), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) val_transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])訓(xùn)練集流水線里RandomResizedCrop會在隨機位置裁剪一塊區(qū)域再縮放到224x224同時實現(xiàn)了裁剪和縮放兩種增強RandomHorizontalFlip以50%概率翻轉(zhuǎn)RandomRotation在±15度內(nèi)旋轉(zhuǎn)ColorJitter調(diào)整顏色屬性。驗證集流水線則只做確定性操作先Resize到256再CenterCrop取中間224x224區(qū)域——這樣做是為了讓評估結(jié)果穩(wěn)定可復(fù)現(xiàn)不會因為隨機增強導(dǎo)致每次驗證結(jié)果波動。需要特別留意的是ToTensor和Normalize的順序ToTensor會把PIL圖像轉(zhuǎn)換為張量并把像素值從0~255縮放到0~1Normalize再按通道均值和標準差做標準化。這里使用的三個均值0.485、0.456、0.406和標準差0.229、0.224、0.225是經(jīng)典模型在ImageNet上統(tǒng)計出來的值對大多數(shù)自然圖像任務(wù)都是通用且合理的。如果數(shù)據(jù)分布非常特殊可以自己統(tǒng)計均值標準差替代。訓(xùn)練循環(huán)里每次迭代都會重新執(zhí)行隨機變換也就是說每一個epoch里模型看到的訓(xùn)練樣本都是不完全一樣的這就讓模型每一步都面臨輕微不同的輸入分布提高泛化能力。3.3 實際運行與結(jié)果對比增強前后訓(xùn)練曲線差異我自己跑過一個對比實驗用的是同一個數(shù)據(jù)集、同一個模型結(jié)構(gòu)只改變是否啟用數(shù)據(jù)增強。結(jié)果非常有代表性不啟用增強時訓(xùn)練準確率在第12個epoch就超過了98%驗證準確率卻停在83%左右隨后訓(xùn)練準確率繼續(xù)上升驗證準確率反而小幅下降過擬合的曲線形態(tài)非常清晰。啟用增強后訓(xùn)練準確率上升速度變慢大約到第25個epoch才接近94%但驗證準確率反而穩(wěn)步爬到了89%以上。雖然訓(xùn)練準確率低于不增強的路但訓(xùn)練和驗證之間的差距小了很多這說明模型的泛化能力確實更強。這個現(xiàn)象背后有個容易誤解的點很多人看到訓(xùn)練準確率下降會慌以為增強把模型“帶弱了”。其實訓(xùn)練準確率微降恰恰說明增強在發(fā)揮作用——模型不再背誦訓(xùn)練集而是學(xué)習(xí)更泛化的特征。判斷增強是否有效不能只看訓(xùn)練集要用“訓(xùn)練集和驗證集的差距”來衡量。差距越小模型越穩(wěn)健。4. 混淆矩陣機器學(xué)習(xí)最容易忽略的評估工具4.1 二分類混淆矩陣的四個格子里到底放的什么準確率是絕大多數(shù)人習(xí)慣看的第一個指標但它會騙人。用一個醫(yī)療篩查的例子假設(shè)疾病陽性率只有5%一個模型把所有樣本都預(yù)測為陰性準確率是95%看起來非常漂亮但這個模型一個病人都沒找出來。這時候混淆矩陣就能看清真相。二分類混淆矩陣是一個2x2的表格行通常代表真實類別列代表預(yù)測類別。四個格子分別是TPTrue Positive真實為正預(yù)測也為正真陽性FNFalse Negative真實為正預(yù)測為負假陰性FPFalse Positive真實為負預(yù)測為正假陽性TNTrue Negative真實為負預(yù)測也為負真陰性這里的命名看似繞其實只要抓住一個規(guī)則第一個詞表示“預(yù)測對不對”第二個詞表示“預(yù)測成了什么”。True/False描述預(yù)測與真實是否一致Positive/Negative描述預(yù)測結(jié)果。TP就是預(yù)測對了且預(yù)測結(jié)果為正FN是預(yù)測錯了且預(yù)測結(jié)果為負。實際項目中我見過很多初學(xué)者混淆TP和FN的含義導(dǎo)致手算指標完全錯誤。建議拿起筆隨便編一組樣本把每個樣本按真實標簽和預(yù)測結(jié)果填入四個格子反復(fù)寫兩遍比背十遍定義都有效。4.2 從混淆矩陣到核心評估指標混淆矩陣最大的價值在于它可以把一堆指標講清楚。假設(shè)我們有一個二分類任務(wù)的混淆矩陣預(yù)測為正預(yù)測為負真實為正TPFN真實為負FPTN從這四個數(shù)出發(fā)可以計算以下指標準確率Accuracy等于所有預(yù)測正確的樣本占總樣本的比例(TPTN) / (TPTNFPFN)。在不平衡數(shù)據(jù)集上這個值會偏向多數(shù)類。精確率Precision等于預(yù)測為正的樣本中真實為正的比例TP / (TPFP)。它回答的問題是“模型說是正例有多可信”。召回率Recall等于真實為正的樣本中被成功找出來的比例TP / (TPFN)。它回答的問題是“所有正例里模型找回了多少”。F1分數(shù)是精確率和召回率的調(diào)和平均2 × Precision × Recall / (Precision Recall)。它同時兼顧兩者適合作為單一評價指標。特異度Specificity等于真實為負的樣本中被正確判為負的比例TN / (TNFP)。在某些場景下如垃圾郵件過濾、安全風控這個指標和召回率一樣重要。這幾個指標不是孤立的。精確率和召回率存在天然的此消彼長關(guān)系當你把判定閾值調(diào)低模型更容易預(yù)測為正召回率上升的同時精確率通常下降。F1分數(shù)就是把這種關(guān)系壓縮成一個數(shù)值方便比較。4.3 多分類問題里混淆矩陣的展開方式多分類的混淆矩陣從2x2擴展成KxKK是類別數(shù)。比如10分類就是10x10行代表真實類別列代表預(yù)測類別。對角線上的值就是每個類別預(yù)測正確的數(shù)量非對角線的值則展示了“哪兩類之間最容易被混淆”。從多分類矩陣可以計算每類的精確率和召回率但需要定義什么叫“正例”。通常的做法是計算第i類的指標時把第i類當作正例其他所有類別都當作負例。這樣每個類別都能得到一組Precision和Recall。匯總所有類別的指標有兩種方式。宏平均Macro先算出每個類別的Precision、Recall和F1再對所有類別取算術(shù)平均。它平等對待每個類別適合類別不均衡且每個類別都很重要的場景。微平均Micro則是把所有類別的TP、FP、FN合并起來統(tǒng)一計算最后得到的結(jié)果更偏向樣本量大的類別。注意微平均和按整體計算的準確率在數(shù)值上是等價的。選擇哪種平均方式取決于項目目標。如果業(yè)務(wù)上要求“每個類都要差不多好用”選宏平均如果追求“整體效果最優(yōu)、大類不能出錯”選微平均。5. 綜合案例圖像分類實驗中數(shù)據(jù)增強對混淆矩陣指標的影響5.1 實驗設(shè)計為了說清楚這兩個話題怎么配合使用我設(shè)計了一個簡單的小實驗。用一個小規(guī)模的花卉數(shù)據(jù)集共5個類別每類300張圖。用同一個輕量卷積網(wǎng)絡(luò)分別訓(xùn)練兩次一次完全不使用增強一次使用第3節(jié)中的增強流水線。訓(xùn)練完成后在驗證集上分別繪制混淆矩陣并對比宏平均F1、精確率、召回率這些指標。實驗代碼的關(guān)鍵部分大致如下def evaluate(model, dataloader, device): model.eval() all_preds [] all_labels [] with torch.no_grad(): for inputs, labels in dataloader: inputs, labels inputs.to(device), labels.to(device) outputs model(inputs) _, preds torch.max(outputs, 1) all_preds.extend(preds.cpu().numpy()) all_labels.extend(labels.cpu().numpy()) return all_labels, all_preds拿到預(yù)測結(jié)果和真實標簽后用 sklearn 計算混淆矩陣和各項指標無法更簡單from sklearn.metrics import confusion_matrix, precision_recall_fscore_support, classification_report cm confusion_matrix(all_labels, all_preds) report precision_recall_fscore_support(all_labels, all_preds, averagemacro)5.2 實驗結(jié)果解讀指標變化與分類錯誤模式兩組實驗跑完之后區(qū)別非常明顯。不看混淆矩陣的話兩組實驗的整體準確率差距可能只有3到4個百分點看數(shù)字會覺得“增強也就那樣”。但看混淆矩陣會發(fā)現(xiàn)完全不同的故事不使用增強的模型有大量樣本被錯誤歸類到“外觀最相似”的那一類混淆集中分布在幾個固定的格子使用增強的模型錯誤分布更分散而且對角線的值普遍更高。這說明什么數(shù)據(jù)增強雖然沒有讓整體準確率突飛猛進但它讓模型對“容易混淆的類別邊界”理解得更扎實。比如兩個花瓣顏色相近的類別不增強時模型總把他們搞混增強后顏色變化讓模型開始關(guān)注形狀和紋理特征混淆程度明顯下降。如果只看宏平均F1增強模型的優(yōu)勢會更突出。因為宏平均對每個類別一視同仁少數(shù)類的提升不會被多數(shù)類掩蓋。5.3 為什么有時增強后準確率沒變但F1提升了這是一個非常有意思的現(xiàn)象。我拿這個實驗的中間結(jié)果展示過某次訓(xùn)練后增強模型的整體準確率只比無增強模型高了1%但宏平均F1提升了6%。原因在于準確率本身受多數(shù)類主導(dǎo)如果數(shù)據(jù)里有一些類別樣本量明顯偏大多數(shù)類的提升會被少數(shù)類的下降抵消整體準確率看不出什么變化。而宏平均F1會把每個類別單獨看少數(shù)類如果從“完全被忽略”變成“能認出大部分”這個提升就非常顯著。所以如果你的項目品類很多、樣本不均衡強烈建議不要只白準率。把混淆矩陣畫出來配合宏平均指標一起看才能真正定位模型的薄弱類別。反過來如果混淆矩陣里某個類別的召回率特別低首先懷疑的是數(shù)據(jù)量不足而不是模型結(jié)構(gòu)問題這時候優(yōu)先補充該類別的數(shù)據(jù)或者增加針對性的增強策略而不是盲目加深網(wǎng)絡(luò)。6. 實操避坑指南與個人經(jīng)驗6.1 實戰(zhàn)中反復(fù)踩過的5個坑第一個坑是增強過度導(dǎo)致標簽崩壞。我剛開始做旋轉(zhuǎn)增強時設(shè)了±45度人眼看圖都費勁結(jié)果訓(xùn)練loss居高不下驗證曲線像過山車一樣抖動。后來把旋轉(zhuǎn)角度降到±15度問題立刻緩解。增強強度不是越大越好它有一個隱性上限過了這個上限模型學(xué)到的特征就開始失真。第二個坑是忘記對驗證集做同樣的Normalize。訓(xùn)練集做了標準化驗證集如果忘了做輸入分布直接不匹配模型的表現(xiàn)會斷崖式下降。這不是模型的問題是數(shù)據(jù)預(yù)處理流程不統(tǒng)一的問題。凡是訓(xùn)練流程里用了Normalize驗證和測試階段必須用完全相同的Normalize參數(shù)。第三個坑是在驗證集上用了隨機增強。有一次為了“增加驗證集多樣性”我在驗證集上加了RandomHorizontalFlip結(jié)果指標忽高忽低無法復(fù)現(xiàn)。驗證集的作用是穩(wěn)定反映模型狀態(tài)不能有隨機性。如果需要測試時增強Test-Time Augmentation那也應(yīng)該專門跑多次取平均而不是把隨機增強混進常規(guī)驗證流程。第四個坑是混淆矩陣用數(shù)值顯示而非比例顯示。當各類別樣本數(shù)量差異大時矩陣里的大數(shù)字全部集中在樣本多的類別上一眼看去全是亮的根本看不出類別間的錯誤比例。正確做法是使用歸一化的混淆矩陣把每一行的值除以該行真實樣本總數(shù)這樣每個格子的值表示“該類別的樣本有多大比例被預(yù)測成了目標類別”行和為1才方便比較。第五個坑是只看混淆矩陣本身不看錯誤樣本的內(nèi)容。矩陣只是一個統(tǒng)計濃縮真正的錯誤原因往往需要回到具體圖像上才能定位。矩陣上某兩類混淆嚴重要把這些錯誤樣本逐個看一遍是標注問題是遮擋角度特殊還是兩類本來就長得像這一步雖然耗時但往往能發(fā)現(xiàn)數(shù)據(jù)集本身的bug。6.2 項目復(fù)盤經(jīng)驗分享我之前參與過一個模擬項目做的是工業(yè)零件表面的瑕疵分類。數(shù)據(jù)集特別不平衡正常樣本占90%瑕疵樣本總共只有10%還分成了劃痕、凹坑、臟污三個小類。剛開始模型在正常類上的準確率接近100%但瑕疵類基本全被漏掉混淆矩陣一眼看過去除了第一行其他地方幾乎是空的。后來做了三件事第一給三類瑕疵單獨做針對性的增強——劃痕類用旋轉(zhuǎn)和亮度擾動凹坑類用縮放和位置偏移臟污類用對比度和顏色擾動第二調(diào)整訓(xùn)練時的類別權(quán)重讓少數(shù)類在loss中的貢獻更大第三用歸一化混淆矩陣做每周復(fù)盤每類瑕疵的漏檢率、誤檢率都列成表持續(xù)跟蹤。三輪迭代之后瑕疵類別的宏平均召回率從30%左右提升到了80%以上。這段經(jīng)歷給我的最大啟發(fā)是數(shù)據(jù)增強不是套模板而是要根據(jù)錯誤模式做定制?;煜仃嚽∏∈前l(fā)現(xiàn)錯誤模式的最佳工具。兩個知識點在項目里是互相協(xié)作的先用混淆矩陣找出“哪類弱”再針對這些類別設(shè)計增強策略。6.3 經(jīng)驗速查表以下是我在實際項目中沉淀下來的速查表平時做分類任務(wù)基本都會參照它情況推薦做法訓(xùn)練集樣本很少優(yōu)先使用幾何增強顏色增強必要時上Mixup類別分布不均衡使用歸一化混淆矩陣查看各類別召回率針對性補充數(shù)據(jù)或增強驗證集指標波動大檢查驗證集是否混入了隨機增強訓(xùn)練集準確率高但驗證集低過擬合增加增強強度或引入Dropout混淆矩陣中某兩類頻繁互混檢查標注質(zhì)量收集更多兩類邊界樣本減少會導(dǎo)致語義混淆的增強業(yè)務(wù)更關(guān)注少數(shù)類表現(xiàn)使用宏平均F1作為主要評估指標這個表格不是標準答案但它覆蓋了我在實際項目里修復(fù)過的大部分問題。每個條目的背后基本都有一次真實的踩坑過程。關(guān)于數(shù)據(jù)增強和混淆矩陣我個人最大的體會是它們都不是“高級技巧”而是基本功。數(shù)據(jù)增強考驗的是對任務(wù)語義的理解能力混淆矩陣考驗的是對模型行為的洞察力。把這兩樣基本功打扎實比盲目堆模型結(jié)構(gòu)、追求SOTA指標要重要得多。希望這篇整理也對你有用。