:PyTorch實(shí)現(xiàn))
簡介一套基于深度學(xué)習(xí)的阿茲海默癥早期診斷輔助系統(tǒng)源碼及配套文檔屬于Python畢業(yè)設(shè)計(jì)項(xiàng)目面向計(jì)算機(jī)、人工智能、自動(dòng)化等專業(yè)學(xué)生、老師及從業(yè)者尤其適合作為課程設(shè)計(jì)、大作業(yè)或畢設(shè)參考。系統(tǒng)以深度學(xué)習(xí)模型為核心覆蓋數(shù)據(jù)預(yù)處理、模型構(gòu)建、訓(xùn)練評估與輔助診斷界面等環(huán)節(jié)代碼經(jīng)調(diào)試可運(yùn)行便于二次開發(fā)與功能擴(kuò)展。資源包約14.13MB共2000個(gè)文件其中以680個(gè)Python腳本、218個(gè)JavaScript文件、92個(gè)C/C頭文件、62個(gè)CSS樣式表、40個(gè)HTML頁面為主體并含22個(gè)TXT說明與11個(gè)Markdown文檔整體涵蓋算法實(shí)現(xiàn)、前端交互、界面樣式與項(xiàng)目文檔結(jié)構(gòu)清晰便于按需查閱。目前已有80人學(xué)習(xí)下載適合想快速上手深度學(xué)習(xí)醫(yī)療項(xiàng)目的入門者基礎(chǔ)較好的讀者可在此基礎(chǔ)上調(diào)整模型結(jié)構(gòu)、優(yōu)化診斷邏輯或擴(kuò)展數(shù)據(jù)集實(shí)現(xiàn)個(gè)性化功能。1. 阿茲海默癥早期診斷輔助系統(tǒng)一份能直接跑的 Python 畢設(shè)源碼放射科醫(yī)生在閱片燈前對比一組腦部 MRI 的時(shí)候最頭疼的不是明顯萎縮的中晚期病灶而是輕度認(rèn)知障礙和正常老化之間那點(diǎn)細(xì)微差別——海馬體縮小了幾個(gè)像素、皮層厚度薄了不到一毫米肉眼往往判斷不準(zhǔn)。深度學(xué)習(xí)這幾年在醫(yī)學(xué)影像分類上的表現(xiàn)恰恰補(bǔ)上了這個(gè)短板它能從大量標(biāo)注樣本里自己學(xué)出「什么樣的腦結(jié)構(gòu)更像早期阿茲海默癥」的視覺模式。這套基于深度學(xué)習(xí)的阿茲海默癥早期診斷輔助系統(tǒng)就是一份面向畢業(yè)設(shè)計(jì)的 Python 完整源碼加文檔說明把數(shù)據(jù)預(yù)處理、CNN 模型訓(xùn)練、評估可視化和 GUI 診斷界面整條鏈路都串好了。適合兩類人拿它做本科或碩士畢設(shè)的學(xué)生以及想入門醫(yī)學(xué)影像 AI、手里缺一套可復(fù)現(xiàn)工程骨架的開發(fā)者。2. CNN 架構(gòu)與數(shù)據(jù)預(yù)處理先想清楚選型再動(dòng)手寫代碼2.1 為什么用 CNN 而不是手工特征局部感受野對應(yīng)腦區(qū)萎縮早期 AD 診斷的傳統(tǒng)做法是先提取手工特征比如用 HOG 描述局部梯度、用 GLCM 計(jì)算紋理統(tǒng)計(jì)量再丟給 SVM 或隨機(jī)森林分類。這套思路不是不能跑但有兩個(gè)硬傷特征設(shè)計(jì)極度依賴專家經(jīng)驗(yàn)海馬體萎縮和皮層變薄在不同切片上的表現(xiàn)差異很大一套固定算子很難覆蓋全特征維度一高小樣本下特別容易過擬合。CNN 的思路完全反過來——卷積核就是一組可學(xué)習(xí)的局部特征提取器淺層學(xué)邊緣紋理、深層學(xué)「這片區(qū)域像不像萎縮組織」的高層語義整個(gè)過程端到端不需要人工設(shè)計(jì)特征。對二維腦部 MRI 切片來說局部感受野天然匹配「局部腦區(qū)出現(xiàn)異常信號」這個(gè)診斷邏輯池化層又給了平移不變性所以深度學(xué)習(xí)算法里 CNN 是這類切片分類任務(wù)的首選而不是拿 Transformer 硬上——畢設(shè)數(shù)據(jù)量通常只有幾千張圖Transformer 喂不飽。2.2 網(wǎng)絡(luò)骨架選型ResNet-18 遷移學(xué)習(xí)是畢設(shè)最穩(wěn)的起點(diǎn)網(wǎng)絡(luò)骨架的選擇直接決定訓(xùn)練能不能收斂。我見過不少畢設(shè)一上來就上 ResNet-50 甚至 EfficientNet-B4結(jié)果在小數(shù)據(jù)集上訓(xùn)練 loss 死活降不下去這就是選型失誤。數(shù)據(jù)量只有幾百到幾千張時(shí)ResNet-50 參數(shù)太多極容易過擬合ResNet-18 層數(shù)淺、參數(shù)量小配合 ImageNet 預(yù)訓(xùn)練權(quán)重是最穩(wěn)的起點(diǎn)。import torch import torch.nn as nn import torchvision.models as models def build_model(num_classes2, pretrainedTrue): model models.resnet18(pretrainedpretrained) # 原版 fc 層輸出 1000 類替換成二分類輸出 model.fc nn.Linear(in_features512, out_featuresnum_classes) return model model build_model(num_classes2, pretrainedTrue)替換輸出層時(shí)注意ResNet-18 最后一個(gè)卷積塊輸出的特征圖是 512 通道全局平均池化后得到 512 維向量所以 fc 層的 in_features 必須寫 512。pretrainedTrue 會(huì)加載在 ImageNet 上預(yù)訓(xùn)練好的主干權(quán)重這些權(quán)重學(xué)到的低級視覺特征邊緣、紋理、形狀對醫(yī)學(xué)圖像同樣有效能明顯加速收斂。如果你手里的 MRI 是灰度單通道圖喂給模型前記得復(fù)制成三通道否則輸入維度對不上。2.3 數(shù)據(jù)預(yù)處理三件套切片抽取、灰度歸一化與數(shù)據(jù)增強(qiáng)原始腦部 MRI 是 NIfTI 格式的三維體數(shù)據(jù)不能直接塞進(jìn)二維 CNN。常見做法是沿軸向抽取若干張二維切片取中間層最穩(wěn)因?yàn)楹qR體在中間層面的結(jié)構(gòu)最清晰。灰度歸一化這里有個(gè)坑MRI 不是 CT沒有統(tǒng)一的 HU 值窗口直接用 Min-Max 歸一化容易被少數(shù)離群體素帶偏我一般用百分位截?cái)?。import nibabel as nib import numpy as np def load_mri_slice(nifti_path, slice_idx60): 讀取 NIfTI 體數(shù)據(jù)并抽取一張軸向切片 img nib.load(nifti_path) data img.get_fdata() # 常見排列: (depth, height, width) slice_2d data[slice_idx, :, :] # 1%~99% 百分位截?cái)嘁种齐x群體素 p_low, p_high np.percentile(slice_2d, (1, 99)) slice_2d np.clip((slice_2d - p_low) / (p_high - p_low 1e-6), 0, 1) return slice_2d參數(shù)說明slice_idx 取 60 是假設(shè)體數(shù)據(jù)深度在 120 層左右取正中間一層病灶信息最完整percentile 的 1 和 99 是經(jīng)驗(yàn)值過大截?cái)嗵?、過小損失對比度。數(shù)據(jù)增強(qiáng)方面RandomHorizontalFlip、RandomRotation(10) 和 RandomAffine 我都建議開著——水平翻轉(zhuǎn)對腦部 MRI 是安全的左右腦萎縮模式在統(tǒng)計(jì)上基本對稱很多方法學(xué)論文也這么用但如果你心里沒底就只開旋轉(zhuǎn)和仿射寧缺毋濫。3. 把訓(xùn)練跑起來數(shù)據(jù)集組織、訓(xùn)練腳本與超參數(shù)調(diào)優(yōu)3.1 數(shù)據(jù)集目錄結(jié)構(gòu)ImageFolder 的約定你最好遵守PyTorch 里加載圖像分類數(shù)據(jù)最省事的方案是torchvision.datasets.ImageFolder它強(qiáng)制要求目錄按「類別名作為子文件夾名」來組織。很多新手把圖片全扔在一個(gè)文件夾里再自己寫 CSV 映射標(biāo)簽繞了一大圈還容易在 train/val/test 劃分時(shí)出bug。直接用約定俗成的結(jié)構(gòu)少寫一百行代碼。data/ ├── train/ │ ├── NORMAL/ # 正常老化樣本 │ └── AD/ # 阿茲海默癥樣本 ├── val/ │ ├── NORMAL/ │ └── AD/ └── test/ ├── NORMAL/ └── AD/劃分比例我一般按 7:1.5:1.5 或者 8:1:1 走關(guān)鍵是劃分前先固定隨機(jī)種子否則每次跑出來的實(shí)驗(yàn)結(jié)論都不一樣。代碼里用random.seed(42)和torch.manual_seed(42)鎖住劃分腳本也單獨(dú)存一份方便復(fù)現(xiàn)。from torchvision import datasets, transforms transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) train_set datasets.ImageFolder(data/train, transformtransform) train_loader torch.utils.data.DataLoader( train_set, batch_size32, shuffleTrue, num_workers4)Normalize 這里用的是 ImageNet 的統(tǒng)計(jì)量因?yàn)槟P椭鞲墒?ImageNet 預(yù)訓(xùn)練的輸入分布保持一致對遷移效果最有利。num_workers 在 Windows 上建議設(shè)成 0否則多進(jìn)程加載容易報(bào)錯(cuò)這是 PyTorch 在 Windows 下的老毛病。3.2 訓(xùn)練主循環(huán)損失函數(shù)、優(yōu)化器與學(xué)習(xí)率調(diào)度二分類任務(wù)有兩個(gè)選擇nn.CrossEntropyLoss或nn.BCEWithLogitsLoss。我選 CrossEntropyLoss理由很直接它自帶 Softmax輸出維度是 2后續(xù)評估直接argmax(dim1)拿類別BCE 輸出維度是 1換到四分類時(shí)還得改網(wǎng)絡(luò)結(jié)構(gòu)。優(yōu)化器用 Adam比 SGD 好調(diào)參畢設(shè)場景下足夠。import torch import torch.nn as nn def train_one_epoch(model, loader, optimizer, criterion, device): 跑一個(gè) epoch 并返回平均 loss 與準(zhǔn)確率 model.train() total_loss, correct, total 0.0, 0, 0 for images, labels in loader: images, labels images.to(device), labels.to(device) optimizer.zero_grad() logits model(images) # shape: [B, num_classes] loss criterion(logits, labels) loss.backward() optimizer.step() total_loss loss.item() * images.size(0) correct (logits.argmax(dim1) labels).sum().item() total images.size(0) return total_loss / total, correct / totallogits.argmax(dim1)取概率最大的類別索引作為預(yù)測結(jié)果loss.item() * images.size(0)是按樣本數(shù)加權(quán)累加這樣最后除以 total 得到的是整個(gè) epoch 的平均 loss而不是每個(gè) batch loss 的簡單平均——后者在小 batch 下會(huì)被噪聲掩蓋。加一個(gè) CosineAnnealingLR 學(xué)習(xí)率調(diào)度在 30 個(gè) epoch 內(nèi)把學(xué)習(xí)率從初始值余弦退火到接近 0收斂更穩(wěn)。超參數(shù)推薦值說明epoch30~50小數(shù)據(jù)集 30 足夠加早停防過擬合batch_size16 或 32顯存不夠先降 batch不要降輸入分辨率初始學(xué)習(xí)率1e-3Adam 的默認(rèn)值偏激進(jìn)1e-3 起步安全weight_decay1e-4緩解過擬合常規(guī)設(shè)置調(diào)度器CosineAnnealingLRT_max 設(shè)成總 epoch 數(shù)3.3 參數(shù)調(diào)優(yōu)的血淚經(jīng)驗(yàn)學(xué)習(xí)率與 batch size 必須配套調(diào)參這塊我踩過的坑比寫過的 bug 還多最典型的就是學(xué)習(xí)率和 batch size 不配套。batch size 一大梯度估計(jì)更準(zhǔn)學(xué)習(xí)率可以適當(dāng)調(diào)高batch size 只有 8 的時(shí)候還拿 1e-3 起步loss 經(jīng)常在前幾個(gè) epoch 直接震蕩到 NaN。我現(xiàn)在的習(xí)慣是batch size 16 起步就用 1e-4 學(xué)習(xí)率32 就用 1e-3然后觀察前三個(gè) epoch 的 loss 曲線如果 loss 在 0.7~0.75 附近橫盤不動(dòng)說明學(xué)習(xí)率太低或者主干被凍住了調(diào)高一檔再試。另外遷移學(xué)習(xí)有個(gè)常見誤用直接凍結(jié)整個(gè)主干只訓(xùn)練 fc 層在小數(shù)據(jù)集上效果尚可但當(dāng)你手里的樣本量超過一兩千張時(shí)解凍 layer4 的全部參數(shù)微調(diào)測試集準(zhǔn)確率通常能再漲兩三個(gè)點(diǎn)。4. 訓(xùn)練時(shí)的踩坑排查五類常見問題的現(xiàn)象、原因與解決4.1 三維體數(shù)據(jù)直接進(jìn)網(wǎng)絡(luò)幾輪就把內(nèi)存撐爆現(xiàn)象torch.cuda.OutOfMemoryError或者 CPU 模式下內(nèi)存占用直接吃掉十幾個(gè) GB訓(xùn)練卡死不動(dòng)。原因慣性思維把 NIfTI 三維數(shù)據(jù)當(dāng)成一個(gè)整體喂給了 CNN但 3D 卷積輸入動(dòng)輒[B, 1, 128, 128, 128]中間特征圖的顯存占用是二維的數(shù)倍畢設(shè)級別的單卡根本扛不住。解決切成二維切片訓(xùn)練每例只取中間 3~5 張切片參與訓(xùn)練和驗(yàn)證如果切片數(shù)量還不夠用 Dataset 的__getitem__即時(shí)讀取文件而不是在初始化時(shí)把所有數(shù)據(jù)一次性 load 進(jìn)內(nèi)存。4.2 二分類 loss 卡在 0.69 死活不降現(xiàn)象訓(xùn)練了好幾個(gè) epochloss 穩(wěn)定在 0.69 附近準(zhǔn)確率在 50% 上下浮動(dòng)。原因二分類的隨機(jī)猜測熵正好是ln(2) ≈ 0.693loss 停在這個(gè)值說明模型什么都沒學(xué)到。常見原因有三個(gè)——學(xué)習(xí)率太低導(dǎo)致參數(shù)幾乎不更新優(yōu)化器在更新而 loss 反傳路徑斷了比如某個(gè)張量被detach()標(biāo)簽順序?qū)懛戳四P蛯W(xué)到的是反的映射。解決先用一個(gè) batch 做 overfit 測試把train_one_epoch跑一步看 loss 能不能降到 0.1 以下能降說明代碼沒毛病去調(diào)學(xué)習(xí)率和解凍層不能降就是標(biāo)簽或數(shù)據(jù)管道的 bug逐段打印 logits 的幅度檢查。4.3 驗(yàn)證集準(zhǔn)確率很高測試集一塌糊涂現(xiàn)象val 集準(zhǔn)確率 90% 以上換到?jīng)]見過的測試集直接掉到 70% 甚至更低。原因數(shù)據(jù)泄露最常見的是歸一化統(tǒng)計(jì)量在劃分前算了全體數(shù)據(jù)也就是Normalize的 mean/std 用了 trainvaltest 全量統(tǒng)計(jì)還有一種隱蔽情況是增強(qiáng)操作在劃分前做完了模型在訓(xùn)練期已經(jīng)見過 val 圖像的變換版本。解決嚴(yán)格先劃分 train/val/test再在 train 集上擬合歸一化參數(shù)和增強(qiáng)流程val 和 test 只做和訓(xùn)練集一致的歸一化不做隨機(jī)增強(qiáng)。固定隨機(jī)種子是這里的最低要求。4.4 加載預(yù)訓(xùn)練權(quán)重報(bào) KeyError 或 size mismatch現(xiàn)象torch.load之后加載 state_dict報(bào)size mismatch for fc.weight或者一堆Missing key(s)。原因模型換了分類頭之后fc.weight的形狀從[1000, 512]變成了[2, 512]直接load_state_dict必然報(bào)錯(cuò)。Missing key則一般是網(wǎng)絡(luò)結(jié)構(gòu)定義和預(yù)訓(xùn)練權(quán)重來源不一致比如用了resnet18但權(quán)重是從resnet34轉(zhuǎn)換來的。解決加載時(shí)用strictFalse只恢復(fù)主干參數(shù)fc 層的權(quán)重保持隨機(jī)初始化這是遷移學(xué)習(xí)的標(biāo)準(zhǔn)姿勢。state_dict torch.load(resnet18.pth) model.load_state_dict(state_dict, strictFalse) # fc 層 KEY 不匹配會(huì)跳過4.5 類別不平衡模型學(xué)成「無腦預(yù)測多數(shù)類」現(xiàn)象訓(xùn)練集里 NORMAL 有 1800 張AD 只有 200 張訓(xùn)練完測試準(zhǔn)確率 88%看上去不錯(cuò)看混淆矩陣才發(fā)現(xiàn) AD 的檢出率接近 0。原因CrossEntropyLoss 默認(rèn)把每個(gè)樣本平等對待多數(shù)類的梯度完全主導(dǎo)了訓(xùn)練。解決給 loss 加類別權(quán)重權(quán)重和樣本數(shù)成反比或者用WeightedRandomSampler重采樣讓每個(gè) batch 里兩類比例接近均衡。評估時(shí)務(wù)必同時(shí)看兩個(gè)類別的 recall而不是只看總準(zhǔn)確率。5. 評估與可視化混淆矩陣、ROC 曲線與 Grad-CAM 可解釋性5.1 醫(yī)學(xué)診斷場景別只看準(zhǔn)確率準(zhǔn)確率這個(gè)指標(biāo)在類別不平衡的醫(yī)學(xué)數(shù)據(jù)上非常容易騙人。早期 AD 診斷漏掉一個(gè)陽性病例的代價(jià)遠(yuǎn)大于把正常人誤判成患者所以敏感度recall才是這個(gè)場景的核心指標(biāo)。一份合格的評估報(bào)告至少要包含準(zhǔn)確率、敏感度、特異度和 F1混淆矩陣是必須有的。指標(biāo)公式醫(yī)學(xué)診斷里的含義Accuracy(TPTN)/(PN)整體判對比例樣本不平衡時(shí)會(huì)虛高Sensitivity/RecallTP/(TPFN)患者被正確檢出的比例漏診率1-SensitivitySpecificityTN/(TNFP)正常人被正確排除的比例誤診率1-SpecificityF1-score2PR/(PR)精確率與敏感度的調(diào)和平均from sklearn.metrics import classification_report, confusion_matrix y_true, y_pred [], [] model.eval() with torch.no_grad(): for images, labels in test_loader: logits model(images.to(device)) y_true labels.tolist() y_pred logits.argmax(dim1).cpu().tolist() print(classification_report(y_true, y_pred, target_names[NORMAL, AD])) print(confusion_matrix(y_true, y_pred))把classification_report輸出里的 AD 行 recall 單獨(dú)圈出來這個(gè)是答辯時(shí)導(dǎo)師最可能追問的數(shù)字。5.2 畫 ROC 曲線算 AUC區(qū)分度的硬指標(biāo)準(zhǔn)確率可以靠調(diào)閾值改變ROC 曲線和 AUC 則衡量模型在所有閾值下的區(qū)分能力不受類別不平衡影響。測試時(shí)拿 Softmax 輸出里 AD 類別的概率作為打分再用 sklearn 的roc_curve出圖。from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt y_score [] with torch.no_grad(): for images, labels in test_loader: prob torch.softmax(model(images.to(device)), dim1) y_score prob[:, 1].cpu().tolist() # AD 類別概率 fpr, tpr, _ roc_curve(y_true, y_score) auc_val auc(fpr, tpr) plt.figure(figsize(6, 6)) plt.plot(fpr, tpr, labelfAUC {auc_val:.3f}) plt.plot([0, 1], [0, 1], linestyle--, colorgray) plt.xlabel(False Positive Rate) plt.ylabel(True Positive Rate) plt.legend() plt.savefig(roc_curve.png, dpi150)AUC 大于 0.9 才算有實(shí)際診斷價(jià)值0.8~0.9 屬于中等偏上。我沒見過誰拿 AUC 低于 0.8 的模型去做畢設(shè)答辯還能不被問住的。5.3 Grad-CAM 熱力圖讓模型「說」出它看的是哪塊腦區(qū)導(dǎo)師最常問的一個(gè)問題是憑什么相信 CNN 的結(jié)論。Grad-CAM 能直接把模型決策依據(jù)可視化成一幅疊加在 MRI 切片上的熱力圖紅色區(qū)域就是模型認(rèn)為最像 AD 萎縮特征的區(qū)域。實(shí)現(xiàn)思路不復(fù)雜對最后一層卷積輸出的特征圖按梯度加權(quán)求和得到一個(gè)和特征圖同尺寸的權(quán)重圖再放大到輸入尺寸疊加顯示。def grad_cam(model, tensor, target_layer): 計(jì)算 Grad-CAM 熱力圖target_layer 傳 model.layer4[-1] features, grads None, None def forward_hook(module, input, output): nonlocal features features output def backward_hook(module, grad_input, grad_output): nonlocal grads grads grad_output[0] h1 target_layer.register_forward_hook(forward_hook) h2 target_layer.register_full_backward_hook(backward_hook) output model(tensor) score output[0, 1] # AD 類別的得分 model.zero_grad() score.backward() h1.remove() h2.remove() weights grads.mean(dim(2, 3), keepdimTrue) cam torch.relu((weights * features).sum(dim1)) cam cam.squeeze().cpu().numpy() return cam注意register_full_backward_hook是 PyTorch 1.8 之后的推薦寫法舊版本用register_backward_hook有時(shí)拿不到梯度。熱力圖疊加到原圖上的操作留給小工具包torchcam或者手工plt.imshow疊加。如果你的模型用的是 ResNet-18target_layer傳model.layer4[-1]就行。把幾張陽性樣本的熱力圖整理成一頁放進(jìn)畢設(shè)論文的實(shí)驗(yàn)分析章節(jié)整篇文檔的說服力會(huì)上一個(gè)檔次。6. 把二分類改成四分類從 Normal/AD 擴(kuò)展到 MCI 分級現(xiàn)實(shí)里臨床診斷不只要區(qū)分「正?!购汀赴⑵澓DY」更關(guān)鍵的是把輕度認(rèn)知障礙MCI從兩者里單獨(dú)拎出來——這才是「早期診斷」四個(gè)字的核心價(jià)值。把這份資源里的二分類模型改成四分類只需要?jiǎng)尤?。第一處是?shù)據(jù)目錄在data/train、val、test下各加兩個(gè)文件夾常見分法是NORMAL、VERY_MILD、MILD、MODERATE對應(yīng) OASIS 數(shù)據(jù)集的四級標(biāo)注。第二處是模型輸出維度build_model(num_classes2)改成num_classes4fc 層輸出從 2 變成 4。第三處是評估代碼classification_report的target_names同步換成四個(gè)類別。損失函數(shù)不用改CrossEntropyLoss 天然支持多分類梯度反傳也不用動(dòng)。關(guān)鍵驗(yàn)證點(diǎn)是混淆矩陣的對角線——四分類場景下最容易翻車的是相鄰類別互相混比如 VERY_MILD 和 NORMAL 分不開這屬于正?,F(xiàn)象畢竟兩者影像差異本來就小但如果 MILD 和 MODERATE 也大面積混在一起就要回頭檢查切片抽取的位置是不是太靠上偏離海馬體了。改完先拿一個(gè) subclass比如只保留 NORMAL 和 VERY_MILD 做一個(gè)輕量二分類驗(yàn)證代碼能跑通再全量訓(xùn)練。評估指標(biāo)從二分類的敏感度/特異度換成 macro F1避免少數(shù)類被多數(shù)類淹沒。我自己第一次做多分類擴(kuò)展時(shí)一上來就全量訓(xùn)練跑了 20 個(gè) epoch 才發(fā)現(xiàn) val 里漏加了兩個(gè)類別的文件夾整個(gè)實(shí)驗(yàn)白燒了兩小時(shí)。從那以后我每次拿到新數(shù)據(jù)集都強(qiáng)制先打印類別分布和每個(gè)類抽樣一張圖看一眼再動(dòng)模型結(jié)構(gòu)。這套資源和文檔里把目錄組織、訓(xùn)練命令和評估腳本都寫清楚了你照著走一遍再改多分類會(huì)少踩我當(dāng)年踩過的大部分坑。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取