DISE · 單系統分類器
討論記錄 · DISCUSSION LOG

小資料,大模型 Small Data, Big Model — What Actually Works 偏斜的資料集 → 誠實的評估 → 真正的槓桿是「視野」,不是「深度」

資料sys1 甲狀腺超音波 · 23 位病人 · 病人分組 5-fold · AUC
01/07
目次

目次

00為何不直接修 DISE:先修小元件03
01我們有一個小而偏斜的資料集06
02主要模型:我們實際使用的 CNN09
03我們如何應對:病人 5-fold · AUC10
04測試、結果與結論15
02/07
SECTION 00 · 為何不直接修 (1/3)

類比:地基還裂著,別急著修屋頂

屋頂 GAN 影像轉換 2F 跨掃描儀 domain adaptation 1F 單一系統 pos / neg 分類 地基 資料 · ROI 擷取 上層完全依賴下層
03/07
SECTION 00 · 為何不直接修 (2/3)

DISE 的每個元件,其實都是 CNN

元件任務資訊方向主要層
SharedEncoder影像 → 特徵 + 類別圖壓縮ResNet-18(Conv2d + BatchNorm)
PrivateEncoder影像 → 8 個「風格」數字壓縮Conv2d ×6
PrivateDecoder編碼 → 重繪成影像還原ConvTranspose2d ×3
Discriminator ×2影像 → 真 / 假壓縮Conv2d ×5
DomainClassifier ×2類別圖 → 來源 / 目標壓縮Conv2d ×5
03/07
SECTION 00 · 為何不直接修 (3/3)

整體路線圖:一次只修一層

1
重打地基:資料與 ROI 擷取
ROI 要怎麼切?感受野該多大、為什麼?切成 stride-1 patches 有幫助嗎?
✓ 已完成
2
只做 system 1 的 pos / neg
用最簡單的模型跑通整條訓練與測試流程,確認 pipeline 本身沒有問題
✓ 已完成
3
替換 DISE 的資料前處理與主幹網路
把 ①② 的結論搬進 DISE,並用病人 5-fold + AUC 重做一次測試
進行中
4
再處理跨掃描儀 domain adaptation
sys1 → sys2;單一系統站得住,才有資格談跨系統
待辦
5
最後才做跨域 patch 生成(GAN)
若前面每一層都成立,再談影像轉換;不成立就不必做
待辦
03/07
SECTION 01 · 小而偏斜 (1/3)

資料到底有多小

DISE 原論文
24,966
張 GTA5 影像(來源域)
+ 2,975
張 Cityscapes(目標域)
每張逐像素標註 → 約 200 萬個標籤(19 類)
我們(sys1)
23
位病人(10 正 / 13 負)
~380
顆 ROI
每顆只有 1 個標籤(pos / neg)
04/07
SECTION 01 · 小而偏斜 (2/3)

偏斜 ① 類別不平衡是「假象」

ROI 層級 正 27% 負 73% (2.6 : 1) 病人層級 正 10 人 負 13 人 (近乎平衡)
04/07
SECTION 01 · 小而偏斜 (3/3)

偏斜 ② 亮度混淆與病人重疊

亮度混淆(最危險)

sys1 中,光看「病灶周圍的背景亮度」就能完美分開正負(AUC 1.000;正 55.7 vs 負 80.3)。 正常組織不該因良惡性而系統性變亮 → 這是影像整體亮度/機器增益的差異,不是生理訊號。

病人跨系統重疊

sys1 與 sys2 有 18 / 23 位病人是同一批人(換機器掃描)。sys3 的 6 人也全在 sys1 內。 → 所謂「跨域」其實是同一批病人的不同機器,不是新病人

04/07
SECTION 02 · 主要模型

主要模型:23,650 個參數的 SmallCNN

輸入:ROI + 周圍,縮放到 32×32···3232一個 epoch = 訓練折的 ~306 個 ROI一個 batch = 256下一批 ≈ 50( 256 , 1 , 32 , 32 )NCHW→ 一個 epoch 只有 2 次梯度更新convolution 3×316 filters16 張特徵圖,大小不變···1616 channels一個 batch = 25632( 256 , 16 , 32 , 32 )NCHWbatch norm + ReLU+ max pooling 2×解析度減半···1616 channels一個 batch = 25616( 256 , 16 , 16 , 16 )NCHWconvolution 3×3 32 filters+ BN + ReLU + max poolingBlock 2···3232 channels一個 batch = 2568( 256 , 32 , 8 , 8 )NCHWconvolution 3×3 64 filters+ BN + ReLU + max poolingBlock 3···6464 channels一個 batch = 2564( 256 , 64 , 4 , 4 )NCHWAdaptiveAvgPool2d(1)每個 channel 取一個平均Head:batch 還在 → (256, 64) 是一個矩陣Flatten64256( 256 , 64 )NDDropout(0.4)64256( 256 , 64 )NDLinear(64, 2)= 一層 MLP64z₀z₁negpos22256( 256 , 2 )ND沒有 activation ── 輸出是 raw logitsW:2×64 = 128 個權重 + b:2 個偏差 = 130 個參數batch 裡的 256 列,各自套用同一個 W·x + b
← 左右捲動:滑鼠滾輪、或直接拖曳 →
05/07
SECTION 03 · 如何應對 (1/5)

應對 ① 刻意用「更小」的模型

ResNet-18(DISE 主幹)
11,689,512
參數
我們的 SmallCNN
23,650
參數(小約 500×
06/07
SECTION 03 · 如何應對 (2/5)

應對 ② 把測試整個重做:依「病人」切 5-fold

Fold 1
測 5 人
Fold 2
測 5 人
Fold 3
測 5 人
Fold 4
測 4 人
Fold 5
測 4 人
06/07
SECTION 03 · 如何應對 (3/5)

應對 ③ 用 AUC,不用 accuracy 正常

為何不用 accuracy:73% 的 ROI 是負 → 全部猜「負」就有 73% 準確率,卻毫無用處。

有重疊 → 拖動門檻,紅點沿曲線跑。面積 = AUC ≈ 0.78
分數軸 ← 判為負 判為正 → 0 1 完美 = 1.00 0 1 1 假陽性率 FPR 真陽性率 TPR AUC 隨機猜 = 0.50
寬鬆 嚴格
06/07
SECTION 03 · 如何應對 (4/5)

好的例子 完全分開

所有都低於所有 → 曲線經過左上角。AUC = 1.00
分數軸 ← 判為負 判為正 → 0 1 完美 = 1.00 0 1 1 假陽性率 FPR 真陽性率 TPR AUC 隨機猜 = 0.50
寬鬆 嚴格
06/07
SECTION 03 · 如何應對 (5/5)

差的例子 幾乎沒有訊號

正負交錯 → 曲線貼著對角線。AUC ≈ 0.44(低於 0.5 = 方向反了)
分數軸 ← 判為負 判為正 → 0 1 完美 = 1.00 0 1 1 假陽性率 FPR 真陽性率 TPR AUC 隨機猜 = 0.50
寬鬆 嚴格
06/07
SECTION 04 · 測試與結果 (1/7)

切成 patch 有幫助嗎? 沒有

模型 + 輸入(皆只有病灶內部訓練樣本
每 ROI 取 60 張
TRAINVAL 樣本差距
ResNet-18 + 20×20 patch22,9200.9980.6800.317
ResNet-18 + 32×32 patch22,9201.0000.6650.335
SmallCNN + 20×20 patch22,9200.9490.6160.332
SmallCNN + 32×32 patch22,9200.9990.7000.299
SmallCNN + 整顆 ROI(不切)3820.9710.6710.301
SmallCNN + stride-1 全網格(841 張 / ROI)321,2620.9990.6570.342
SmallCNN + 整顆 ROI + 周圍組織3820.9990.9100.089
07/07
SECTION 04 · 測試與結果 (2/7)

加入 ROI 周圍組織有幫助嗎? 有,這才是關鍵

同一模型,只換視野只有病灶+ 周圍組織提升
ResNet-180.6430.842+0.199
SmallCNN0.6910.910+0.219
過擬合差距(SmallCNN)0.2930.089砍掉 2/3
ROI 內部(藍)與周圍環(銅)
07/07
SECTION 04 · 測試與結果 (3/7)

用更淺的模型有幫助嗎? 有,但不多

相同流程,只換模型ResNet-18
18 層 · 11.7M
SmallCNN
4 層 · 23.6k
差異
VAL 樣本(只有病灶)0.643 ±0.0680.691 ±0.072+0.048
VAL 樣本(+周圍組織)0.842 ±0.0600.910 ±0.028+0.068
過擬合差距0.352 / 0.1570.293 / 0.089更小
跨種子穩定度±0.060±0.028更穩
07/07
SECTION 04 · 測試與結果 (4/7)

batch size 重要嗎? 不重要

batch size
5 seeds · 病人 5-fold · 40 epochs
每 fold
梯度更新
TRAINVAL 樣本VAL 病人差距
167841.000 ±0.0000.886 ±0.0310.965 ±0.0230.114
324001.000 ±0.0000.902 ±0.0270.966 ±0.0250.098
642081.000 ±0.0000.898 ±0.0690.934 ±0.0620.102
1281201.000 ±0.0000.924 ±0.0370.968 ±0.0310.076
256 ← 我們用的800.999 ±0.0010.915 ±0.0200.974 ±0.0210.084
07/07
SECTION 04 · 測試與結果 (5/7)

epoch 數重要嗎? 40 落在平台上

epoch
5 seeds · batch 256 · 無 early stopping
TRAINVAL 樣本VAL 病人差距
10.754 ±0.0410.640 ±0.1230.740 ±0.1490.113
20.877 ±0.0410.690 ±0.0770.753 ±0.0980.186
50.873 ±0.0600.674 ±0.0420.671 ±0.0730.200
100.900 ±0.0650.744 ±0.1060.795 ±0.0840.156
200.988 ±0.0110.858 ±0.0920.942 ±0.0610.130
300.998 ±0.0010.892 ±0.0300.966 ±0.0220.107
40 ← 我們用的0.999 ±0.0010.915 ±0.0210.975 ±0.0220.085
600.999 ±0.0010.879 ±0.0490.941 ±0.0570.120
801.000 ±0.0010.912 ±0.0340.976 ±0.0170.088
1201.000 ±0.0000.921 ±0.0340.987 ±0.0180.079
07/07
SECTION 04 · 測試與結果 (6/7)

輸入尺寸要多大? 更大反而更差

輸入
參數量固定 23,650
感受野
/邊長
有效感受野
組織像素
TRAINVAL 樣本差距
20²110%45.9 px1.0000.932 ±0.0270.068
24²92%38.2 px1.0000.924 ±0.0290.075
32² ← 我們用的69%35.4 px0.9990.916 ±0.0190.083
40²55%23.0 px0.9970.906 ±0.0330.092
48²46%23.6 px0.9960.896 ±0.0360.100
64²34%17.7 px0.9870.864 ±0.0660.123
感受野:後面一層的 3×3 覆蓋前面更大的區域
07/07
SECTION 04 · 測試與結果 (7/7)

結論

切成 patch無效 60× 資料量,VAL 不動、差距不動。

更淺的模型+0.06 在種子雜訊內;但差距更小、更穩定。

加入周圍組織+0.21 唯一顯著的槓桿,差距 0.30 → 0.09。

④ 我們的選擇

SmallCNN(4 層 · 23,650 參數)整顆 ROI + 14px 周圍 → 縮放 32×32

VAL 樣本 0.911 ±0.021 · 過擬合差距 0.087 · 病人層級 0.971

誠實下限:gain 不變特徵 ≈ 0.80;跨掃描儀尚未測試

07/07