基于深度學習的胸部 X 光圖像肺炎分類系統(六)

目錄

結果指標解讀

一、為什么選擇這些指標?

二、各指標的定義和解讀

1. 準確率(Accuracy)

2. 損失(Loss)

3. 精確率(Precision)

4. 召回率(Recall)

三、這些指標說明什么?

四、如果要進一步優化模型,可以關注:

分類任務中指標的分工合作

1. 先理解一個關鍵:為什么不能只用一個指標?

2. 每個指標的 “不可替代性”

(1)準確率(Accuracy):看整體 “蒙對” 的概率

(2)損失(Loss):看模型 “心里有數沒數”

(3)精確率(Precision):看 “說有就真有” 的概率

(4)召回率(Recall):看 “有病就不會漏” 的概率

3. 總結:4 個指標的 “分工合作”

ROC 曲線與模型性能分析

一、核心概念

二、圖中元素解讀

三、這張圖說明什么?

四、和之前指標的關系

標準化混淆矩陣解析

一、核心概念

二、圖中元素解讀

三、具體數值解讀

四、這張圖說明什么?

五、和之前指標的關系

F1-score 模型綜合分

通過控制臺信息了解肺炎診斷模型評估

一、數據準備階段

二、模型構建階段

三、訓練過程

四、測試結果

五、總結


結果指標解讀

《模型訓練指標解析:肺炎診斷》

好的!這四個指標(準確率、損失、精確率、召回率)是評估模型性能的關鍵指標,我來為你逐一解釋它們的定義、用途和解讀方法。

一、為什么選擇這些指標?

這些指標是機器學習中最常用的評估標準,特別是在醫療診斷等場景中:

  1. 準確率(Accuracy:最直觀的指標,反映模型整體的判斷能力
  2. 損失(Loss:反映模型預測值與真實值的差距,指導訓練過程
  3. 精確率(Precision:關注 "預測為正的樣本中真正正確的比例",適合關注 "不誤診" 的場景
  4. 召回率(Recall:關注 "實際為正的樣本中被正確識別的比例",適合關注 "不漏診" 的場景

在肺炎診斷中,我們既需要 "不誤診"(精確率),也需要 "不漏診"(召回率),所以這四個指標能全面評估模型性能。

二、各指標的定義和解讀

1. 準確率(Accuracy)

定義:模型正確預測的樣本數占總樣本數的比例

公式:

解讀

  1. 左上子圖中,藍色線(訓練準確率)最終穩定在 0.9 以上,說明模型在訓練集上判斷正確的比例超過 90%
  2. 橙色線(驗證準確率)也接近 0.9,說明模型在新數據上的泛化能力不錯
  3. 兩條線的差距不大,說明模型沒有明顯過擬合
2. 損失(Loss)

定義:模型預測值與真實值之間的誤差,值越小說明預測越準確

(具體計算方式取決于損失函數,如交叉熵損失)

大白話解釋

想象你是老師,讓學生做 10 道數學題。

  1. 學生第一次做,錯了 7 道題 → 損失很大(7/10)
  2. 學生復習后再做,只錯了 2 道 → 損失變小(2/10)
  3. 學生第三次做,全對 → 損失為 0

例子

假設模型預測 "張三有 80% 概率得肺炎",但實際張三沒得肺炎:

  1. 預測值(80%)和真實值(0%)之間的差距就是損失
  2. 如果用均方誤差計算:(0.8-0)2 = 0.64 → 損失為 0.64
  3. 如果用交叉熵損失計算:-ln (0.2) ≈ 1.61 → 損失更大(因為模型錯得很離譜)

解讀

  1. 右上子圖中,藍色線(訓練損失)持續下降并趨于平穩,說明模型在訓練集上的預測誤差在減小
  2. 橙色線(驗證損失)雖然波動較大,但整體也呈下降趨勢,說明模型在驗證集上的誤差也在降低
  3. 訓練損失和驗證損失最終都維持在較低水平,說明模型收斂良好
3. 精確率(Precision)

定義:預測為肺炎的樣本中,真正是肺炎的比例

公式:

解讀

  1. 左下子圖中,兩條線都接近 1.0,說明模型預測為肺炎的樣本中,大部分確實是肺炎
  2. 這對醫療診斷很重要:如果模型說 "是肺炎",那么有很高的概率是正確的(減少不必要的治療)
4. 召回率(Recall)

定義:實際是肺炎的樣本中,被模型正確識別的比例

公式:

解讀

  1. 右下子圖中,兩條線也接近 0.8-0.9,說明模型能識別出大部分的肺炎病例
  2. 這在醫療診斷中至關重要:盡量減少 "漏診"(把肺炎當成正常)的情況
  3. 雖然存在波動,但最終穩定在較高水平,說明模型對肺炎的識別能力不錯

三、這些指標說明什么?

  1. 模型整體表現良好:四個指標都達到了較高水平,說明模型既沒有 "漏診" 太多肺炎,也沒有 "誤診" 太多正常樣本
  2. 泛化能力尚可:訓練集和驗證集的指標差距不大,說明模型沒有過度 "死記硬背" 訓練數據
  3. 仍有優化空間:驗證集的指標波動較大,可能說明模型對某些樣本的識別能力不穩定,或者訓練過程中存在噪聲

四、如果要進一步優化模型,可以關注:

  1. 驗證集指標的波動原因(是否有某些樣本特別難識別?)
  2. 精確率和召回率的權衡(是否需要犧牲一點精確率來提高召回率?)
  3. 損失函數的選擇是否合適(是否需要調整損失函數來更關注某些樣本?)

分類任務中指標的分工合作

選擇這 4 個指標(準確率、損失、精確率、召回率),核心原因是它們能從不同維度互補,全面反映模型的真實性能,尤其是在分類任務(比如之前提到的肺炎診斷)中,單一指標往往會 “騙人”,而這四個指標組合能避免這種情況。

1. 先理解一個關鍵:為什么不能只用一個指標?

舉個極端例子:

假設醫院里 100 個病人中只有 1 個是肺炎患者,99 個是健康人。

如果模型偷懶,不管啥情況都預測 “健康”,那么:

  1. 正確率(準確率)能達到 99%(因為 99 個健康人都對了),但這模型毫無意義 —— 它漏診了唯一的病人。

這說明:單一指標(比如只看準確率)會掩蓋模型的關鍵問題。而這 4 個指標的組合,就是為了從不同角度 “拷問” 模型,讓它的真實能力無所遁形。

2. 每個指標的 “不可替代性”

(1)準確率(Accuracy):看整體 “蒙對” 的概率
  1. 作用:快速判斷模型的 “整體靠譜度”。比如準確率 90%,說明 100 個預測里平均 90 個是對的。
  2. 為什么必須有:它是最直觀的 “入門指標”,能讓你第一時間知道模型大概在什么水平(比如準確率 30% 就是瞎猜,90% 可能還不錯)。
  3. 局限:當數據中 “正反樣本比例懸殊”(比如上面 1 個病人 99 個健康人)時,準確率會失真,所以需要其他指標補充。
(2)損失(Loss):看模型 “心里有數沒數”
  1. 作用:比準確率更細膩地反映 “預測和真實的差距”。比如同樣是 “預測錯誤”,模型猜 “90% 概率患病” 但實際健康,比猜 “51% 概率患病” 的錯誤更嚴重(損失更大)。
  2. 為什么必須有
    1. 訓練時靠它 “導航”:損失下降,說明模型在進步;損失不變,說明模型 “學不進去了”。
    2. 反映模型的 “自信度”:比如兩個模型準確率都是 80%,但一個損失小(錯誤時也猜得接近真實),另一個損失大(錯誤時完全瞎猜),顯然前者更可靠。
(3)精確率(Precision):看 “說有就真有” 的概率
  1. 作用:模型說 “是肺炎” 時,到底有多大概率真的是肺炎?(比如精確率 95%,意味著 100 個被預測為肺炎的人里,95 個真患病)。
  2. 為什么必須有:避免 “誤診”。比如在醫療中,如果精確率低,會把大量健康人當成病人,導致過度治療(浪費資源 + 病人焦慮)。
(4)召回率(Recall):看 “有病就不會漏” 的概率
  1. 作用:所有真正的肺炎患者中,模型能抓出多少?(比如召回率 90%,意味著 100 個真病人里,90 個能被正確識別)。
  2. 為什么必須有:避免 “漏診”。在醫療中,漏診比誤診更危險 —— 如果召回率低,會有很多病人被當成健康人,耽誤治療。

3. 總結:4 個指標的 “分工合作”

  1. 準確率:給模型打個 “總體分”,看大概靠不靠譜;
  2. 損失:看模型 “學習過程” 和 “預測細膩度”,指導訓練;
  3. 精確率:盯著 “別冤枉好人”(少誤診);
  4. 召回率:盯著 “別放過壞人”(少漏診)。

這四個指標一起,既能反映模型的整體表現,又能暴露它在關鍵場景(比如醫療中的誤診 / 漏診)中的短板,所以成為分類任務中最經典的評估組合。

ROC 曲線與模型性能分析

這張圖是ROC 曲線(受試者工作特征曲線),是評估二分類模型性能的重要工具。我來用大白話給你解釋:

一、核心概念

  1. 橫軸(False Positive Rate, FPR

實際為負樣本(比如 "健康人")中,被模型錯誤預測為正樣本(比如 "肺炎患者")的比例。

公式:

FPR = \frac{\text{被誤診的健康人數}}{\text{總健康人數}}

(FPR 越低,說明模型越不容易 "冤枉好人")

  1. 縱軸(True Positive Rate, TPR

實際為正樣本(比如 "肺炎患者")中,被模型正確識別的比例(也就是 "召回率")。

公式:

TPR = \frac{\text{被正確識別的肺炎患者數}}{\text{總肺炎患者數}}

(TPR 越高,說明模型越不容易 "漏掉病人")

二、圖中元素解讀

  1. 橙色曲線(ROC 曲線)

模型在不同 "判斷閾值" 下的 FPR 和 TPR 組合。

    1. 曲線越 "靠近左上角",說明模型在相同 FPR 下能達到更高的 TPR(更優秀)
    2. 圖中曲線快速上升并接近頂部,說明模型性能很好
  1. 藍色虛線(對角線)

代表 "隨機猜測" 的模型(比如拋硬幣)。

    1. 如果 ROC 曲線在虛線下方,說明模型比隨機猜測還差
    2. 圖中曲線明顯在虛線上方,說明模型遠優于隨機猜測
  1. AUC(曲線下面積)

圖中顯示 AUC=0.9157,代表 ROC 曲線下的面積。

    1. AUC 越接近 1,模型性能越好
    2. 0.9157 是非常優秀的結果,說明模型有很強的區分能力

三、這張圖說明什么?

  1. 模型區分能力強

AUC=0.9157 > 0.9,說明模型能很好地區分 "肺炎患者" 和 "健康人"

  1. 漏診率低

曲線快速上升到接近 1.0,說明在 FPR 較低的情況下(比如 <0.2),TPR 已經很高(>0.8),即模型能識別出大部分肺炎患者,漏診率低

  1. 誤診率可控

當 TPR 達到 0.9 時,FPR 仍低于 0.1,說明模型在識別出 90% 肺炎患者的同時,只誤診了不到 10% 的健康人

四、和之前指標的關系

  1. 與召回率(Recall)的關系

TPR 就是召回率,所以 ROC 曲線的縱軸直接反映了模型的召回能力

  1. 與精確率(Precision)的關系

雖然 ROC 曲線不直接顯示精確率,但 AUC 高通常意味著模型在各種閾值下都能保持較好的精確率和召回率平衡

  1. 與準確率(Accuracy)的關系

AUC 和準確率都是模型性能的綜合指標,但 AUC 更關注模型的 "區分能力",而準確率更關注 "整體正確率"

這張 ROC 曲線和 AUC 值表明:

  1. 模型具有很強的區分肺炎患者和健康人的能力
  2. 模型在控制誤診率的同時,能有效降低漏診率
  3. 整體性能達到優秀水平(AUC>0.9)

如果要進一步優化,可以關注:

  1. 是否需要在 "減少漏診" 和 "減少誤診" 之間做權衡
  2. 不同閾值下的精確率表現

標準化混淆矩陣解析

這張圖是標準化混淆矩陣(Normalized Confusion Matrix,是評估分類模型性能的核心工具。我來用大白話給你解釋:

一、核心概念

混淆矩陣是用來展示模型預測結果與真實標簽之間對應關系的表格,包含四個關鍵部分:

  1. 真正例(True Positive, TP:實際是肺炎,模型也預測為肺炎
  2. 假正例(False Positive, FP:實際是正常,模型錯誤預測為肺炎
  3. 真負例(True Negative, TN:實際是正常,模型也預測為正常
  4. 假負例(False Negative, FN:實際是肺炎,模型錯誤預測為正常

二、圖中元素解讀

  1. 行(真實標簽)
    1. NORMAL:實際是正常的樣本
    2. PNEUMONIA:實際是肺炎的樣本
  2. 列(預測標簽)
    1. NORMAL:模型預測為正常的樣本
    2. PNEUMONIA:模型預測為肺炎的樣本
  3. 顏色深淺
    1. 深藍色:數值接近 1(預測準確)
    2. 淺藍色:數值接近 0(預測錯誤)
    3. 顏色條顯示數值與顏色的對應關系
  4. 數值含義
    1. 每個格子顯示兩個數值:標準化比例(如 0.88)和原始數量(如 207)
    2. 標準化比例 = 該格子數量 / 對應行的總樣本數

三、具體數值解讀

  1. 真實為 NORMAL 的樣本(第一行)
    1. 預測為 NORMAL:0.88(207 個)→ 模型正確識別了 88% 的正常樣本
    2. 預測為 PNEUMONIA:0.12(27 個)→ 模型將 12% 的正常樣本錯誤預測為肺炎
  2. 真實為 PNEUMONIA 的樣本(第二行)
    1. 預測為 NORMAL:0.21(80 個)→ 模型將 21% 的肺炎樣本錯誤預測為正常
    2. 預測為 PNEUMONIA:0.79(310 個)→ 模型正確識別了 79% 的肺炎樣本

四、這張圖說明什么?

  1. 正常樣本識別能力強
    1. 0.88 的準確率說明模型在識別正常樣本方面表現不錯
    2. 只有 12% 的正常樣本被誤診為肺炎
  2. 肺炎樣本識別能力尚可但有提升空間
    1. 79% 的肺炎樣本被正確識別,說明模型對肺炎有一定識別能力
    2. 但仍有 21% 的肺炎樣本被漏診(預測為正常)
  3. 整體表現
    1. 模型在正常樣本上的表現優于肺炎樣本
    2. 漏診率(21%)高于誤診率(12%)

五、和之前指標的關系

  1. 與準確率(Accuracy)的關系
    1. 準確率 = (TP+TN)/(TP+TN+FP+FN) = (310+207)/(310+207+27+80) ≈ 0.84
    2. 與之前看到的準確率指標(約 0.8-0.9)一致
  2. 與精確率(Precision)的關系
    1. 精確率(肺炎)= TP/(TP+FP) = 310/(310+27) ≈ 0.92
    2. 說明模型預測為肺炎的樣本中,92% 確實是肺炎
  3. 與召回率(Recall)的關系
    1. 召回率(肺炎)= TP/(TP+FN) = 310/(310+80) ≈ 0.79
    2. 與混淆矩陣中第二行的 0.79 直接對應

這張混淆矩陣表明:

  1. 模型對正常樣本的識別準確率較高(88%)
  2. 對肺炎樣本的識別準確率尚可(79%),但漏診率偏高(21%)
  3. 誤診率相對較低(12%)

如果要進一步優化,可以關注:

  1. 如何減少肺炎樣本的漏診率(假負例)
  2. 是否需要在誤診率和漏診率之間做權衡
  3. 結合臨床需求調整模型決策閾值
D:\ProgramData\anaconda3\envs\tf_env\python.exe D:\workspace_py\deeplean\medical_image_classification_fixed2.py 
Found 4448 images belonging to 2 classes.
Found 784 images belonging to 2 classes.
Found 624 images belonging to 2 classes.
原始樣本分布: 正常=1147, 肺炎=3301
過采樣后分布: 正常=3301, 肺炎=3301
類別權重: 正常=1.94, 肺炎=0.67
使用本地權重文件: models/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5
2025-07-25 14:47:12.955043: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: SSE SSE2 SSE3 SSE4.1 SSE4.2 AVX AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
Model: "sequential"
_________________________________________________________________Layer (type)                Output Shape              Param #   
=================================================================resnet50 (Functional)       (None, 7, 7, 2048)        23587712  global_average_pooling2d (  (None, 2048)              0         GlobalAveragePooling2D)                                         dense (Dense)               (None, 512)               1049088   batch_normalization (Batch  (None, 512)               2048      Normalization)                                                  dropout (Dropout)           (None, 512)               0         dense_1 (Dense)             (None, 256)               131328    batch_normalization_1 (Bat  (None, 256)               1024      chNormalization)                                                dropout_1 (Dropout)         (None, 256)               0         dense_2 (Dense)             (None, 1)                 257       =================================================================
Total params: 24771457 (94.50 MB)
Trainable params: 1182209 (4.51 MB)
Non-trainable params: 23589248 (89.99 MB)
_________________________________________________________________
Epoch 1/50
207/207 [==============================] - ETA: 0s - loss: 0.6233 - accuracy: 0.7675 - precision: 0.8022 - recall: 0.7101 - auc: 0.8398
Epoch 1: val_auc improved from -inf to 0.87968, saving model to best_pneumonia_model.h5
207/207 [==============================] - 245s 1s/step - loss: 0.6233 - accuracy: 0.7675 - precision: 0.8022 - recall: 0.7101 - auc: 0.8398 - val_loss: 1.3033 - val_accuracy: 0.2577 - val_precision: 0.0000e+00 - val_recall: 0.0000e+00 - val_auc: 0.8797 - lr: 1.0000e-04
Epoch 2/50
207/207 [==============================] - ETA: 0s - loss: 0.4313 - accuracy: 0.8261 - precision: 0.8971 - recall: 0.7367 - auc: 0.9035
Epoch 2: val_auc improved from 0.87968 to 0.92927, saving model to best_pneumonia_model.h5
207/207 [==============================] - 257s 1s/step - loss: 0.4313 - accuracy: 0.8261 - precision: 0.8971 - recall: 0.7367 - auc: 0.9035 - val_loss: 0.7843 - val_accuracy: 0.5115 - val_precision: 1.0000 - val_recall: 0.3419 - val_auc: 0.9293 - lr: 1.0000e-04
Epoch 3/50
207/207 [==============================] - ETA: 0s - loss: 0.3833 - accuracy: 0.8446 - precision: 0.9240 - recall: 0.7510 - auc: 0.9174
Epoch 3: val_auc did not improve from 0.92927
207/207 [==============================] - 242s 1s/step - loss: 0.3833 - accuracy: 0.8446 - precision: 0.9240 - recall: 0.7510 - auc: 0.9174 - val_loss: 0.8157 - val_accuracy: 0.7602 - val_precision: 0.7585 - val_recall: 0.9931 - val_auc: 0.8778 - lr: 1.0000e-04
Epoch 4/50
207/207 [==============================] - ETA: 0s - loss: 0.3648 - accuracy: 0.8505 - precision: 0.9356 - recall: 0.7528 - auc: 0.9254
Epoch 4: val_auc improved from 0.92927 to 0.94531, saving model to best_pneumonia_model.h5
207/207 [==============================] - 242s 1s/step - loss: 0.3648 - accuracy: 0.8505 - precision: 0.9356 - recall: 0.7528 - auc: 0.9254 - val_loss: 0.6605 - val_accuracy: 0.7551 - val_precision: 0.9949 - val_recall: 0.6735 - val_auc: 0.9453 - lr: 1.0000e-04
Epoch 5/50
207/207 [==============================] - ETA: 0s - loss: 0.3387 - accuracy: 0.8608 - precision: 0.9444 - recall: 0.7667 - auc: 0.9325
Epoch 5: val_auc did not improve from 0.94531
207/207 [==============================] - 239s 1s/step - loss: 0.3387 - accuracy: 0.8608 - precision: 0.9444 - recall: 0.7667 - auc: 0.9325 - val_loss: 1.4892 - val_accuracy: 0.7474 - val_precision: 0.7462 - val_recall: 1.0000 - val_auc: 0.7024 - lr: 1.0000e-04
Epoch 6/50
207/207 [==============================] - ETA: 0s - loss: 0.3275 - accuracy: 0.8634 - precision: 0.9457 - recall: 0.7710 - auc: 0.9403
Epoch 6: val_auc did not improve from 0.94531
207/207 [==============================] - 240s 1s/step - loss: 0.3275 - accuracy: 0.8634 - precision: 0.9457 - recall: 0.7710 - auc: 0.9403 - val_loss: 8.2440 - val_accuracy: 0.2577 - val_precision: 0.0000e+00 - val_recall: 0.0000e+00 - val_auc: 0.5095 - lr: 1.0000e-04
Epoch 7/50
207/207 [==============================] - ETA: 0s - loss: 0.3184 - accuracy: 0.8696 - precision: 0.9529 - recall: 0.7776 - auc: 0.9406
Epoch 7: val_auc improved from 0.94531 to 0.94572, saving model to best_pneumonia_model.h5
207/207 [==============================] - 240s 1s/step - loss: 0.3184 - accuracy: 0.8696 - precision: 0.9529 - recall: 0.7776 - auc: 0.9406 - val_loss: 0.3840 - val_accuracy: 0.8686 - val_precision: 0.9761 - val_recall: 0.8436 - val_auc: 0.9457 - lr: 1.0000e-04
Epoch 8/50
207/207 [==============================] - ETA: 0s - loss: 0.3061 - accuracy: 0.8706 - precision: 0.9497 - recall: 0.7828 - auc: 0.9458
Epoch 8: val_auc did not improve from 0.94572
207/207 [==============================] - 238s 1s/step - loss: 0.3061 - accuracy: 0.8706 - precision: 0.9497 - recall: 0.7828 - auc: 0.9458 - val_loss: 0.3327 - val_accuracy: 0.8712 - val_precision: 0.9212 - val_recall: 0.9038 - val_auc: 0.9368 - lr: 1.0000e-04
Epoch 9/50
207/207 [==============================] - ETA: 0s - loss: 0.2896 - accuracy: 0.8793 - precision: 0.9586 - recall: 0.7928 - auc: 0.9498
Epoch 9: val_auc did not improve from 0.94572
207/207 [==============================] - 236s 1s/step - loss: 0.2896 - accuracy: 0.8793 - precision: 0.9586 - recall: 0.7928 - auc: 0.9498 - val_loss: 0.8718 - val_accuracy: 0.7742 - val_precision: 0.7682 - val_recall: 0.9966 - val_auc: 0.8534 - lr: 1.0000e-04
Epoch 10/50
207/207 [==============================] - ETA: 0s - loss: 0.3042 - accuracy: 0.8755 - precision: 0.9480 - recall: 0.7946 - auc: 0.9467
Epoch 10: val_auc did not improve from 0.94572
207/207 [==============================] - 237s 1s/step - loss: 0.3042 - accuracy: 0.8755 - precision: 0.9480 - recall: 0.7946 - auc: 0.9467 - val_loss: 0.5748 - val_accuracy: 0.7921 - val_precision: 0.7827 - val_recall: 0.9966 - val_auc: 0.9386 - lr: 1.0000e-04
Epoch 11/50
207/207 [==============================] - ETA: 0s - loss: 0.2909 - accuracy: 0.8778 - precision: 0.9554 - recall: 0.7925 - auc: 0.9501
Epoch 11: val_auc improved from 0.94572 to 0.95169, saving model to best_pneumonia_model.h5
207/207 [==============================] - 237s 1s/step - loss: 0.2909 - accuracy: 0.8778 - precision: 0.9554 - recall: 0.7925 - auc: 0.9501 - val_loss: 0.3041 - val_accuracy: 0.8673 - val_precision: 0.8688 - val_recall: 0.9674 - val_auc: 0.9517 - lr: 1.0000e-04
Epoch 12/50
207/207 [==============================] - ETA: 0s - loss: 0.2779 - accuracy: 0.8841 - precision: 0.9628 - recall: 0.7992 - auc: 0.9537
Epoch 12: val_auc did not improve from 0.95169
207/207 [==============================] - 236s 1s/step - loss: 0.2779 - accuracy: 0.8841 - precision: 0.9628 - recall: 0.7992 - auc: 0.9537 - val_loss: 0.4429 - val_accuracy: 0.8304 - val_precision: 0.8249 - val_recall: 0.9794 - val_auc: 0.9420 - lr: 1.0000e-04
Epoch 13/50
207/207 [==============================] - ETA: 0s - loss: 0.2761 - accuracy: 0.8849 - precision: 0.9602 - recall: 0.8031 - auc: 0.9530
Epoch 13: val_auc did not improve from 0.95169
207/207 [==============================] - 236s 1s/step - loss: 0.2761 - accuracy: 0.8849 - precision: 0.9602 - recall: 0.8031 - auc: 0.9530 - val_loss: 1.1105 - val_accuracy: 0.7615 - val_precision: 0.7568 - val_recall: 1.0000 - val_auc: 0.8080 - lr: 1.0000e-04
Epoch 14/50
207/207 [==============================] - ETA: 0s - loss: 0.2710 - accuracy: 0.8885 - precision: 0.9612 - recall: 0.8098 - auc: 0.9555
Epoch 14: ReduceLROnPlateau reducing learning rate to 1.9999999494757503e-05.Epoch 14: val_auc did not improve from 0.95169
207/207 [==============================] - 236s 1s/step - loss: 0.2710 - accuracy: 0.8885 - precision: 0.9612 - recall: 0.8098 - auc: 0.9555 - val_loss: 2.9286 - val_accuracy: 0.3240 - val_precision: 0.9815 - val_recall: 0.0911 - val_auc: 0.8606 - lr: 1.0000e-04
Epoch 15/50
207/207 [==============================] - ETA: 0s - loss: 0.2634 - accuracy: 0.8894 - precision: 0.9636 - recall: 0.8095 - auc: 0.9567
Epoch 15: val_auc improved from 0.95169 to 0.95699, saving model to best_pneumonia_model.h5
207/207 [==============================] - 237s 1s/step - loss: 0.2634 - accuracy: 0.8894 - precision: 0.9636 - recall: 0.8095 - auc: 0.9567 - val_loss: 0.6077 - val_accuracy: 0.8048 - val_precision: 0.9977 - val_recall: 0.7388 - val_auc: 0.9570 - lr: 2.0000e-05
Epoch 16/50
207/207 [==============================] - ETA: 0s - loss: 0.2576 - accuracy: 0.8909 - precision: 0.9654 - recall: 0.8110 - auc: 0.9600
Epoch 16: val_auc did not improve from 0.95699
207/207 [==============================] - 236s 1s/step - loss: 0.2576 - accuracy: 0.8909 - precision: 0.9654 - recall: 0.8110 - auc: 0.9600 - val_loss: 0.2776 - val_accuracy: 0.8724 - val_precision: 0.9635 - val_recall: 0.8608 - val_auc: 0.9566 - lr: 2.0000e-05
Epoch 17/50
207/207 [==============================] - ETA: 0s - loss: 0.2553 - accuracy: 0.8944 - precision: 0.9604 - recall: 0.8228 - auc: 0.9601
Epoch 17: val_auc did not improve from 0.95699
207/207 [==============================] - 238s 1s/step - loss: 0.2553 - accuracy: 0.8944 - precision: 0.9604 - recall: 0.8228 - auc: 0.9601 - val_loss: 1.2915 - val_accuracy: 0.6186 - val_precision: 1.0000 - val_recall: 0.4863 - val_auc: 0.9440 - lr: 2.0000e-05
Epoch 18/50
207/207 [==============================] - ETA: 0s - loss: 0.2505 - accuracy: 0.8919 - precision: 0.9635 - recall: 0.8146 - auc: 0.9608
Epoch 18: val_auc did not improve from 0.95699
207/207 [==============================] - 236s 1s/step - loss: 0.2505 - accuracy: 0.8919 - precision: 0.9635 - recall: 0.8146 - auc: 0.9608 - val_loss: 0.5704 - val_accuracy: 0.8099 - val_precision: 0.9909 - val_recall: 0.7509 - val_auc: 0.9460 - lr: 2.0000e-05
Epoch 19/50
207/207 [==============================] - ETA: 0s - loss: 0.2557 - accuracy: 0.8920 - precision: 0.9615 - recall: 0.8167 - auc: 0.9593
Epoch 19: ReduceLROnPlateau reducing learning rate to 3.999999898951501e-06.Epoch 19: val_auc did not improve from 0.95699
207/207 [==============================] - 236s 1s/step - loss: 0.2557 - accuracy: 0.8920 - precision: 0.9615 - recall: 0.8167 - auc: 0.9593 - val_loss: 0.3977 - val_accuracy: 0.8597 - val_precision: 0.9917 - val_recall: 0.8179 - val_auc: 0.9558 - lr: 2.0000e-05
Epoch 20/50
207/207 [==============================] - ETA: 0s - loss: 0.2383 - accuracy: 0.8944 - precision: 0.9735 - recall: 0.8110 - auc: 0.9643
Epoch 20: val_auc improved from 0.95699 to 0.96287, saving model to best_pneumonia_model.h5
207/207 [==============================] - 236s 1s/step - loss: 0.2383 - accuracy: 0.8944 - precision: 0.9735 - recall: 0.8110 - auc: 0.9643 - val_loss: 0.3187 - val_accuracy: 0.8801 - val_precision: 0.9861 - val_recall: 0.8505 - val_auc: 0.9629 - lr: 4.0000e-06
Epoch 21/50
207/207 [==============================] - ETA: 0s - loss: 0.2539 - accuracy: 0.8894 - precision: 0.9642 - recall: 0.8088 - auc: 0.9606
Epoch 21: val_auc did not improve from 0.96287
207/207 [==============================] - 236s 1s/step - loss: 0.2539 - accuracy: 0.8894 - precision: 0.9642 - recall: 0.8088 - auc: 0.9606 - val_loss: 0.5630 - val_accuracy: 0.8074 - val_precision: 0.9954 - val_recall: 0.7440 - val_auc: 0.9522 - lr: 4.0000e-06
Epoch 22/50
207/207 [==============================] - ETA: 0s - loss: 0.2480 - accuracy: 0.8994 - precision: 0.9667 - recall: 0.8273 - auc: 0.9616
Epoch 22: ReduceLROnPlateau reducing learning rate to 7.999999979801942e-07.Epoch 22: val_auc did not improve from 0.96287
207/207 [==============================] - 236s 1s/step - loss: 0.2480 - accuracy: 0.8994 - precision: 0.9667 - recall: 0.8273 - auc: 0.9616 - val_loss: 0.5155 - val_accuracy: 0.8112 - val_precision: 0.9910 - val_recall: 0.7526 - val_auc: 0.9588 - lr: 4.0000e-06
Epoch 23/50
207/207 [==============================] - ETA: 0s - loss: 0.2474 - accuracy: 0.8909 - precision: 0.9647 - recall: 0.8116 - auc: 0.9634
Epoch 23: val_auc improved from 0.96287 to 0.96317, saving model to best_pneumonia_model.h5
207/207 [==============================] - 238s 1s/step - loss: 0.2474 - accuracy: 0.8909 - precision: 0.9647 - recall: 0.8116 - auc: 0.9634 - val_loss: 0.4768 - val_accuracy: 0.8253 - val_precision: 0.9912 - val_recall: 0.7715 - val_auc: 0.9632 - lr: 8.0000e-07
Epoch 24/50
207/207 [==============================] - ETA: 0s - loss: 0.2496 - accuracy: 0.8981 - precision: 0.9686 - recall: 0.8228 - auc: 0.9612
Epoch 24: val_auc improved from 0.96317 to 0.96399, saving model to best_pneumonia_model.h5
207/207 [==============================] - 236s 1s/step - loss: 0.2496 - accuracy: 0.8981 - precision: 0.9686 - recall: 0.8228 - auc: 0.9612 - val_loss: 0.4538 - val_accuracy: 0.8278 - val_precision: 0.9956 - val_recall: 0.7715 - val_auc: 0.9640 - lr: 8.0000e-07
Epoch 25/50
207/207 [==============================] - ETA: 0s - loss: 0.2504 - accuracy: 0.8935 - precision: 0.9613 - recall: 0.8201 - auc: 0.9618
Epoch 25: ReduceLROnPlateau reducing learning rate to 1.600000018697756e-07.Epoch 25: val_auc did not improve from 0.96399
207/207 [==============================] - 237s 1s/step - loss: 0.2504 - accuracy: 0.8935 - precision: 0.9613 - recall: 0.8201 - auc: 0.9618 - val_loss: 0.4323 - val_accuracy: 0.8431 - val_precision: 0.9978 - val_recall: 0.7904 - val_auc: 0.9596 - lr: 8.0000e-07
Epoch 26/50
207/207 [==============================] - ETA: 0s - loss: 0.2448 - accuracy: 0.8981 - precision: 0.9723 - recall: 0.8194 - auc: 0.9617
Epoch 26: val_auc did not improve from 0.96399
207/207 [==============================] - 236s 1s/step - loss: 0.2448 - accuracy: 0.8981 - precision: 0.9723 - recall: 0.8194 - auc: 0.9617 - val_loss: 0.4714 - val_accuracy: 0.8189 - val_precision: 0.9933 - val_recall: 0.7612 - val_auc: 0.9618 - lr: 1.6000e-07
Epoch 27/50
207/207 [==============================] - ETA: 0s - loss: 0.2514 - accuracy: 0.8940 - precision: 0.9653 - recall: 0.8173 - auc: 0.9611
Epoch 27: val_auc improved from 0.96399 to 0.96583, saving model to best_pneumonia_model.h5
207/207 [==============================] - 236s 1s/step - loss: 0.2514 - accuracy: 0.8940 - precision: 0.9653 - recall: 0.8173 - auc: 0.9611 - val_loss: 0.4280 - val_accuracy: 0.8342 - val_precision: 0.9956 - val_recall: 0.7801 - val_auc: 0.9658 - lr: 1.6000e-07
Epoch 28/50
207/207 [==============================] - ETA: 0s - loss: 0.2496 - accuracy: 0.8926 - precision: 0.9662 - recall: 0.8137 - auc: 0.9627
Epoch 28: ReduceLROnPlateau reducing learning rate to 1e-07.Epoch 28: val_auc did not improve from 0.96583
207/207 [==============================] - 235s 1s/step - loss: 0.2496 - accuracy: 0.8926 - precision: 0.9662 - recall: 0.8137 - auc: 0.9627 - val_loss: 0.4548 - val_accuracy: 0.8355 - val_precision: 0.9871 - val_recall: 0.7887 - val_auc: 0.9576 - lr: 1.6000e-07
Epoch 29/50
207/207 [==============================] - ETA: 0s - loss: 0.2448 - accuracy: 0.8973 - precision: 0.9682 - recall: 0.8216 - auc: 0.9635
Epoch 29: val_auc did not improve from 0.96583
207/207 [==============================] - 236s 1s/step - loss: 0.2448 - accuracy: 0.8973 - precision: 0.9682 - recall: 0.8216 - auc: 0.9635 - val_loss: 0.4514 - val_accuracy: 0.8469 - val_precision: 0.9957 - val_recall: 0.7973 - val_auc: 0.9533 - lr: 1.0000e-07
Epoch 30/50
207/207 [==============================] - ETA: 0s - loss: 0.2409 - accuracy: 0.8981 - precision: 0.9720 - recall: 0.8198 - auc: 0.9636
Epoch 30: val_auc did not improve from 0.96583
207/207 [==============================] - 236s 1s/step - loss: 0.2409 - accuracy: 0.8981 - precision: 0.9720 - recall: 0.8198 - auc: 0.9636 - val_loss: 0.4526 - val_accuracy: 0.8253 - val_precision: 0.9912 - val_recall: 0.7715 - val_auc: 0.9612 - lr: 1.0000e-07
Epoch 31/50
207/207 [==============================] - ETA: 0s - loss: 0.2476 - accuracy: 0.8979 - precision: 0.9656 - recall: 0.8252 - auc: 0.9615
Epoch 31: val_auc did not improve from 0.96583
207/207 [==============================] - 236s 1s/step - loss: 0.2476 - accuracy: 0.8979 - precision: 0.9656 - recall: 0.8252 - auc: 0.9615 - val_loss: 0.4479 - val_accuracy: 0.8367 - val_precision: 0.9956 - val_recall: 0.7835 - val_auc: 0.9585 - lr: 1.0000e-07
Epoch 32/50
207/207 [==============================] - ETA: 0s - loss: 0.2393 - accuracy: 0.8978 - precision: 0.9686 - recall: 0.8222 - auc: 0.9645
Epoch 32: val_auc did not improve from 0.96583
207/207 [==============================] - 236s 1s/step - loss: 0.2393 - accuracy: 0.8978 - precision: 0.9686 - recall: 0.8222 - auc: 0.9645 - val_loss: 0.4738 - val_accuracy: 0.8316 - val_precision: 0.9934 - val_recall: 0.7784 - val_auc: 0.9583 - lr: 1.0000e-07
Epoch 33/50
207/207 [==============================] - ETA: 0s - loss: 0.2492 - accuracy: 0.8950 - precision: 0.9654 - recall: 0.8194 - auc: 0.9614
Epoch 33: val_auc did not improve from 0.96583
207/207 [==============================] - 236s 1s/step - loss: 0.2492 - accuracy: 0.8950 - precision: 0.9654 - recall: 0.8194 - auc: 0.9614 - val_loss: 0.4522 - val_accuracy: 0.8431 - val_precision: 0.9978 - val_recall: 0.7904 - val_auc: 0.9589 - lr: 1.0000e-07
Epoch 34/50
207/207 [==============================] - ETA: 0s - loss: 0.2429 - accuracy: 0.9018 - precision: 0.9709 - recall: 0.8285 - auc: 0.9618  
Epoch 34: val_auc did not improve from 0.96583
207/207 [==============================] - 239s 1s/step - loss: 0.2429 - accuracy: 0.9018 - precision: 0.9709 - recall: 0.8285 - auc: 0.9618 - val_loss: 0.4706 - val_accuracy: 0.8418 - val_precision: 0.9914 - val_recall: 0.7938 - val_auc: 0.9541 - lr: 1.0000e-07
Epoch 35/50
207/207 [==============================] - ETA: 0s - loss: 0.2455 - accuracy: 0.8979 - precision: 0.9650 - recall: 0.8258 - auc: 0.9627
Epoch 35: val_auc improved from 0.96583 to 0.97260, saving model to best_pneumonia_model.h5
207/207 [==============================] - 237s 1s/step - loss: 0.2455 - accuracy: 0.8979 - precision: 0.9650 - recall: 0.8258 - auc: 0.9627 - val_loss: 0.4193 - val_accuracy: 0.8291 - val_precision: 0.9956 - val_recall: 0.7732 - val_auc: 0.9726 - lr: 1.0000e-07
Epoch 36/50
207/207 [==============================] - ETA: 0s - loss: 0.2442 - accuracy: 0.8919 - precision: 0.9661 - recall: 0.8122 - auc: 0.9631
Epoch 36: val_auc did not improve from 0.97260
207/207 [==============================] - 234s 1s/step - loss: 0.2442 - accuracy: 0.8919 - precision: 0.9661 - recall: 0.8122 - auc: 0.9631 - val_loss: 0.4375 - val_accuracy: 0.8329 - val_precision: 1.0000 - val_recall: 0.7749 - val_auc: 0.9634 - lr: 1.0000e-07
Epoch 37/50
207/207 [==============================] - ETA: 0s - loss: 0.2447 - accuracy: 0.8987 - precision: 0.9680 - recall: 0.8246 - auc: 0.9628
Epoch 37: val_auc did not improve from 0.97260
207/207 [==============================] - 235s 1s/step - loss: 0.2447 - accuracy: 0.8987 - precision: 0.9680 - recall: 0.8246 - auc: 0.9628 - val_loss: 0.4201 - val_accuracy: 0.8380 - val_precision: 0.9956 - val_recall: 0.7852 - val_auc: 0.9673 - lr: 1.0000e-07
Epoch 38/50
207/207 [==============================] - ETA: 0s - loss: 0.2460 - accuracy: 0.8955 - precision: 0.9671 - recall: 0.8188 - auc: 0.9621
Epoch 38: val_auc did not improve from 0.97260
207/207 [==============================] - 236s 1s/step - loss: 0.2460 - accuracy: 0.8955 - precision: 0.9671 - recall: 0.8188 - auc: 0.9621 - val_loss: 0.4425 - val_accuracy: 0.8418 - val_precision: 0.9978 - val_recall: 0.7887 - val_auc: 0.9652 - lr: 1.0000e-07
Epoch 39/50
207/207 [==============================] - ETA: 0s - loss: 0.2503 - accuracy: 0.8932 - precision: 0.9632 - recall: 0.8176 - auc: 0.9622
Epoch 39: val_auc did not improve from 0.97260
207/207 [==============================] - 234s 1s/step - loss: 0.2503 - accuracy: 0.8932 - precision: 0.9632 - recall: 0.8176 - auc: 0.9622 - val_loss: 0.4590 - val_accuracy: 0.8253 - val_precision: 0.9847 - val_recall: 0.7766 - val_auc: 0.9571 - lr: 1.0000e-07
Epoch 40/50
207/207 [==============================] - ETA: 0s - loss: 0.2499 - accuracy: 0.8949 - precision: 0.9660 - recall: 0.8185 - auc: 0.9611
Epoch 40: val_auc did not improve from 0.97260
207/207 [==============================] - 235s 1s/step - loss: 0.2499 - accuracy: 0.8949 - precision: 0.9660 - recall: 0.8185 - auc: 0.9611 - val_loss: 0.4443 - val_accuracy: 0.8316 - val_precision: 0.9978 - val_recall: 0.7749 - val_auc: 0.9639 - lr: 1.0000e-07
Epoch 41/50
207/207 [==============================] - ETA: 0s - loss: 0.2489 - accuracy: 0.8952 - precision: 0.9654 - recall: 0.8198 - auc: 0.9612
Epoch 41: val_auc did not improve from 0.97260
207/207 [==============================] - 240s 1s/step - loss: 0.2489 - accuracy: 0.8952 - precision: 0.9654 - recall: 0.8198 - auc: 0.9612 - val_loss: 0.4213 - val_accuracy: 0.8418 - val_precision: 0.9978 - val_recall: 0.7887 - val_auc: 0.9677 - lr: 1.0000e-07
Epoch 42/50
207/207 [==============================] - ETA: 0s - loss: 0.2420 - accuracy: 0.8993 - precision: 0.9694 - recall: 0.8246 - auc: 0.9637
Epoch 42: val_auc did not improve from 0.97260
207/207 [==============================] - 234s 1s/step - loss: 0.2420 - accuracy: 0.8993 - precision: 0.9694 - recall: 0.8246 - auc: 0.9637 - val_loss: 0.4687 - val_accuracy: 0.8304 - val_precision: 0.9870 - val_recall: 0.7818 - val_auc: 0.9554 - lr: 1.0000e-07
Epoch 43/50
207/207 [==============================] - ETA: 0s - loss: 0.2483 - accuracy: 0.8941 - precision: 0.9653 - recall: 0.8176 - auc: 0.9614Restoring model weights from the end of the best epoch: 35.Epoch 43: val_auc did not improve from 0.97260
207/207 [==============================] - 234s 1s/step - loss: 0.2483 - accuracy: 0.8941 - precision: 0.9653 - recall: 0.8176 - auc: 0.9614 - val_loss: 0.4686 - val_accuracy: 0.8355 - val_precision: 0.9935 - val_recall: 0.7835 - val_auc: 0.9582 - lr: 1.0000e-07
Epoch 43: early stopping
20/20 [==============================] - 20s 998ms/step - loss: 0.4608 - accuracy: 0.8285 - precision: 0.9199 - recall: 0.7949 - auc: 0.9151測試集評估結果:
準確率: 0.8285
精確率: 0.9199
召回率: 0.7949
AUC: 0.9151F1-score: 0.8528
AUC-ROC: 0.9157分類報告:precision    recall  f1-score   supportNORMAL       0.72      0.88      0.79       234PNEUMONIA       0.92      0.79      0.85       390accuracy                           0.83       624macro avg       0.82      0.84      0.82       624
weighted avg       0.85      0.83      0.83       624混淆矩陣:
[[207  27][ 80 310]]Process finished with exit code 0

F1-score 模型綜合分

F1-score 簡單說就是模型抓對的” 和 “沒漏的” 之間的平衡分

打個比方:假設你要做一個模型,用來識別 “垃圾郵件”。

  1. 假設實際有 100 封郵件,其中 20 封是垃圾郵件,80 封是正常郵件。
  2. 模型識別出 15 封垃圾郵件,但其中有 5 封其實是正常郵件(錯判),同時還有 10 封真正的垃圾郵件沒識別出來(漏判)。

這時候:

  1. “抓對的”(精準率):模型說的 “垃圾郵件” 里,真正是垃圾的有 10 封(15-5),所以精準率是 10/15≈67%。
  2. “沒漏的”(召回率):所有真正的垃圾郵件里,模型抓到了 10 封,所以召回率是 10/20=50%。

F1-score 就是把這兩個數 “中和” 一下,算出來一個綜合分(公式是:2× 精準率 × 召回率 ÷(精準率 + 召回率)),這里就是 2×67%×50%÷(67%+50%)≈57%。

它的作用是:當數據不平衡時(比如垃圾郵件只占 20%),光看 “準確率”(比如模型把所有郵件都判為正常,準確率也有 80%,但毫無意義)會騙人,而 F1-score 能更真實反映模型的好壞 —— 既不能亂判(精準率低),也不能漏判(召回率低),得分越高說明平衡得越好。

通過控制臺信息了解肺炎診斷模型評估

一、數據準備階段

Found 4448 images belonging to 2 classes.

Found 784 images belonging to 2 classes.

Found 624 images belonging to 2 classes.

  1. 說明:程序找到了 4448 張訓練圖片、784 張驗證圖片和 624 張測試圖片,分為 "正常" 和 "肺炎" 兩類

原始樣本分布: 正常=1147, 肺炎=3301

過采樣后分布: 正常=3301, 肺炎=3301

  1. 說明:原始數據中肺炎樣本比正常樣本多很多(3301 vs 1147)
  2. 解決方法:用 "過采樣" 技術生成更多正常樣本,使兩類樣本數量相等(3301 vs 3301)

類別權重: 正常=1.94, 肺炎=0.67

  1. 說明:給樣本數量少的 "正常" 類分配更高權重(1.94),讓模型更重視它
  2. 作用:解決樣本不平衡問題,避免模型只學肺炎樣本

二、模型構建階段

Model: "sequential"

_________________________________________________________________

?Layer (type)??????????????? Output Shape????????????? Param #??

=================================================================

?resnet50 (Functional)?????? (None, 7, 7, 2048)??????? 23587712?

?global_average_pooling2d (? (None, 2048)????????????? 0????????

?GlobalAveragePooling2D)????????????????????????????????????????

?dense (Dense)?????????????? (None, 512)?????????????? 1049088??

?batch_normalization (Batch? (None, 512)?????????????? 2048?????

?Normalization)?????????????????????????????????????????????????

?dropout (Dropout)?????????? (None, 512)?????????????? 0????????

?dense_1 (Dense)???????????? (None, 256)?????????????? 131328???

?batch_normalization_1 (Bat? (None, 256)?????????????? 1024?????

?chNormalization)???????????????????????????????????????????????

?dropout_1 (Dropout)???????? (None, 256)?????????????? 0????????

?dense_2 (Dense)???????????? (None, 1)???????????????? 257??????

=================================================================

Total params: 24771457 (94.50 MB)

Trainable params: 1182209 (4.51 MB)

Non-trainable params: 23589248 (89.99 MB)

  1. 說明:這是一個基于 ResNet50 的模型,包含多個層:
    1. ResNet50:預訓練的圖像特征提取網絡
    2. 全局平均池化:將特征圖轉為向量
    3. 全連接層 + 批歸一化 + dropout:處理特征
    4. 最后一層輸出:預測是否為肺炎(0 或 1)
  2. 參數:總共有約 2400 萬參數,其中 118 萬可訓練

三、訓練過程

Epoch 1/50

207/207 [==============================] - ETA: 0s - loss: 0.6233 - accuracy: 0.7675 - precision: 0.8022 - recall: 0.7101 - auc: 0.8398

Epoch 1: val_auc improved from -inf to 0.87968, saving model to best_pneumonia_model.h5

207/207 [==============================] - 245s 1s/step - loss: 0.6233 - accuracy: 0.7675 - precision: 0.8022 - recall: 0.7101 - auc: 0.8398 - val_loss: 1.3033 - val_accuracy: 0.2577 - val_precision: 0.0000e+00 - val_recall: 0.0000e+00 - val_auc: 0.8797 - lr: 1.0000e-04

  1. 說明:開始第 1 輪訓練(共 50 輪)
  2. 訓練結果:
    1. 訓練集:損失 0.62,準確率 76.75%,精確率 80.22%,召回率 701%
    2. 驗證集:損失 1.30,準確率 25.77%(這一輪驗證結果很差)
  3. 特殊事件:驗證集的 AUC 指標從無窮大提升到 0.8797,所以保存當前模型

Epoch 14: ReduceLROnPlateau reducing learning rate to 1.9999999494757503e-05.

  1. 說明:第 14 輪時,驗證集性能沒有提升,學習率從 0.0001 降到 0.00002
  2. 作用:防止模型 "學不進去",幫助找到更好的參數

Epoch 35: val_auc improved from 0.96583 to 0.97260, saving model to best_pneumonia_model.h5

  1. 說明:第 35 輪時,驗證集的 AUC 指標從 0.9658 提升到 0.9726,保存模型

Epoch 43: early stopping

  1. 說明:第 43 輪時,驗證集性能連續多輪沒有提升,訓練提前停止
  2. 作用:防止模型 "過擬合"(只記住訓練數據,不會舉一反三)

四、測試結果

20/20 [==============================] - 20s 998ms/step - loss: 0.4608 - accuracy: 0.8285 - precision: 0.9199 - recall: 0.7949 - auc: 0.9151

  1. 說明:在 624 張測試圖片上的最終結果
  2. 關鍵指標:
    1. 準確率:82.85%(約 83% 的圖片分類正確)
    2. 精確率:91.99%(模型說 "是肺炎" 的樣本中,92% 確實是肺炎)
    3. 召回率:79.49%(所有肺炎樣本中,79% 被正確識別)
    4. AUC:0.9151(ROC 曲線下面積,0.9 以上說明模型性能優秀)

F1-score: 0.8528

  1. 說明:精確率和召回率的綜合指標,0.85 表示模型在 "不錯判" 和 "不漏判" 之間平衡得很好

分類報告:

????????????? precision??? recall? f1-score?? support

????? NORMAL?????? 0.72????? 0.88????? 0.79?????? 234

?? PNEUMONIA?????? 0.92????? 0.79????? 0.85?????? 390

??? accuracy?????????????????????????? 0.83?????? 624

?? macro avg?????? 0.82????? 0.84????? 0.82?????? 624

weighted avg?????? 0.85????? 0.83????? 0.83?????? 624

  1. 說明:詳細的分類結果
    1. 正常樣本:精確率 72%,召回率 88%(模型對正常樣本的識別更 "保守")
    2. 肺炎樣本:精確率 92%,召回率 79%(模型對肺炎樣本的識別更 "積極")

混淆矩陣:

[[207? 27]

?[ 80 310]]

  1. 說明:模型預測結果的詳細分布
    1. 第一行(實際正常):207 個正確識別,27 個被誤診為肺炎
    2. 第二行(實際肺炎):80 個被漏診為正常,310 個正確識別

五、總結

  1. 模型性能
    1. 整體準確率 83%,AUC>0.9,說明模型性能優秀
    2. 對肺炎樣本的精確率 92%(很少誤診),但召回率 79%(漏診率 21%)
    3. 對正常樣本的召回率 88%(很少漏診),但精確率 72%(誤診率 28%)
  2. 改進空間
    1. 可以嘗試降低肺炎樣本的漏診率(比如調整決策閾值)
    2. 可以嘗試提高正常樣本的精確率(減少誤診)
    3. 可以考慮使用更復雜的模型或數據增強技術
  3. 實際應用建議
    1. 在醫療場景中,可能需要優先保證肺炎樣本的召回率(寧可多診斷,不能漏診)
    2. 可以結合臨床醫生的經驗,調整模型的決策標準

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93355.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

區塊鏈性能優化策略:從理論到實踐

目錄 區塊鏈性能優化策略:從理論到實踐 1. 引言:區塊鏈性能的挑戰 2. 性能評估指標 2.1 核心性能指標 2.2 性能瓶頸分析 3. 分層優化策略 3.1 網絡層優化 3.1.1 Gossip協議改進 3.1.2 網絡分片 3.2 共識層優化 3.2.1 PBFT優化 3.3 數據層優化 3.3.1 狀態樹優化 3.3.2 區塊數據…

【VLLM】open-webui部署模型全流程

目錄 前言 一、租用服務器到服務器連接VScode全流程(可選) 二、下載模型到本地服務器 2.1 進入魔塔社區官網 2.2 選擇下載模型 2.3 執行下載 三、部署VLLM 3.1 參考vllm官網文檔 3.2 查看硬件要求 3.3 安裝vLLM框架 3.4 啟動模型服務 方法1:直接啟動下載的本地模…

辦公自動化入門:如何高效將圖片整合為PDF文檔

將多張圖片合并到一個PDF文件中可以幫助保持特定的順序和布局&#xff0c;同時確保圖像的質量不會因為格式轉換而下降。它是免費&#xff0c;不限次數&#xff0c;批量導入也毫無壓力。操作堪比發朋友圈&#xff1a;拖圖進來 → 選個紙張尺寸 → 點擊轉換 → 指定保存路徑&…

使用寶塔面板搭建 PHP 環境開發一個簡單的 PHP 例子

目錄一、引言二、準備工作2.1 服務器選擇2.2 下載安裝寶塔面板三、使用寶塔面板搭建 PHP 環境3.1 登錄寶塔面板3.2 選擇 Web Server3.3 安裝 PHP3.4 安裝 MySQL 數據庫四、開發一個簡單的 PHP 例子4.1 創建 PHP 文件4.2 編寫 PHP 代碼4.3 設置站點4.4 訪問 PHP 頁面五、常見問題…

AWS WebRTC:我們的業務模式

拉流、卡錄基本流程 設備端&#xff08;攝像機&#xff09; 與 App端 是通過 AWS KVS WebRTC 信令服務進行“點對點連接”的&#xff0c;真正的媒體數據&#xff08;音視頻&#xff09;是通過 WebRTC 的 ICE 通道&#xff08;P2P 或 TURN&#xff09;直接傳輸的&#xff0c;而不…

使用Python,OpenCV,K-Means聚類查找圖像中最主要的顏色

使用Python&#xff0c;OpenCV&#xff0c;K-Means聚類查找圖像中最主要的顏色 分別把跑圖聚類選取1, 2, 3&#xff0c;4, 5, 6, 7&#xff0c;8, 9種主要顏色并繪制colormap顏色圖; 效果圖 分別把跑圖聚類選取3&#xff0c;4, 5&#xff0c;7&#xff0c;9種主要顏色并繪制…

DBAPI 實現分頁查詢的兩種方法

DBAPI 實現分頁查詢的兩種方法 背景 在進行分頁查詢時&#xff0c;用戶通常需要傳入當前頁碼 pageNo 和每頁顯示的條數 pageSize 參數。根據這兩個參數&#xff0c;我們可以從數據庫中查詢出當前頁的數據。以 MySQL 為例&#xff0c;分頁查詢的 SQL 語句如下&#xff1a; se…

第五天上課 SSLPolicy策略和Network Discovery技術

SSL Policy場景1:擁有自家服務器的私鑰&#xff0c;解密訪問自家服務器的ssl流量場景2: 內部用戶訪問互聯網的ssl流量&#xff0c;需要解密并重簽名Correlation and Compliance相關性與合規性配置相關性與合規性策略&#xff0c;在10.1.1.0/24網絡中&#xff0c;當通過Network …

進階07:C#與通用OPC UA通信范例

本節目標&#xff1a; 1&#xff09;安裝軟件&#xff0c;搭建虛擬OPC UA服務器&#xff1b; 2&#xff09;使用UaExpert&#xff0c;讀取OPC UA服務器中的變量&#xff1b; 3&#xff09;編寫Winform程序&#xff0c;讀寫服務器中變量值&#xff0c;創建訂閱觸發事件&#…

大模型微調學習筆記(基于訊飛星辰MaaS速學版)

文章目錄參考資料說明大模型微調入門微調簡介微調步驟數據準備模型選擇訓練方式效果評估模型部署大模型微調&#xff08;基于訊飛星辰Maas&#xff09;構建數據集方法1&#xff1a;預置數據集方法2&#xff1a;創建數據集數據輔助工具數據集劃分模型微調數據配置參數配置模型部…

[CSS]讓overflow不用按shift可以滾輪水平滾動(純CSS)

前言 我不爽前端無法直接滾輪橫向滾動很久了 明明瀏覽器可以直接判斷 x滾動且y不滾動的時候滾輪事件可以直接操作橫向滾動 這個是我探究出來的方法,尤其適合這種很多很多小tag的情況解析 原理是將豎向排列的overflow旋轉成橫向,實際操作的還是豎向overflow.繼而實現鼠標滾輪不用…

截稿倒計時 TrustCom‘25大會即將召開

會議資訊IEEE TrustCom-2025&#xff08;第24屆IEEE計算與通信領域信任、安全與隱私國際會議&#xff09;是一個展示可信計算、通信、網絡和機器學習領域前沿成果的學術平臺。會議聚焦計算機系統、網絡及人工智能在信任、安全、隱私、可靠性、可依賴性、生存性、可用性和容錯性…

Day4.AndroidAudio初始化

1.AudioServer初始化 AudioServer 是 Android 音頻系統的核心服務&#xff0c;負責管理音頻硬件資源、音頻策略調度、跨進程音頻通信等核心功能。它由 Init 進程啟動&#xff0c;是系統核心服務之一&#xff0c;直接影響音頻播放、錄音、音效處理等功能的正常運行。 1.1AudioSe…

OSPF 協議(多區域)

1. OSPF 單區域存在的問題① LSDB龐大&#xff0c;占用內存大&#xff0c;SPF計算開銷大&#xff1b;② LSA洪泛范圍大&#xff0c;拓撲變化影響范圍大&#xff1b;③ 路由不能被匯總&#xff0c;路由表龐大&#xff0c;查找路由開銷大。2. OSPF 多區域優點① 每個區域獨立存儲…

R 語言繪制六種精美熱圖:轉錄組數據可視化實踐(基于 pheatmap 包)

在轉錄組 Bulk 測序數據分析中&#xff0c;熱圖是展示基因表達模式、樣本聚類關系的核心可視化工具。一張高質量的熱圖不僅能清晰呈現數據特征&#xff0c;更能提升研究成果的展示效果。本文基于 R 語言的pheatmap包&#xff0c;整理了六種適用于不同場景的熱圖繪制方法&#x…

圖片PDF識別工具:掃描PDF文件批量OCR區域圖識別改名,識別大量PDF區域內容一次性改名

以下是使用“咕嘎批量OCR識別圖片PDF多區域內容重命名導出表格系統”進行操作的具體步驟&#xff1a;1. 打開工具并獲取區域坐標打開軟件后&#xff0c;選擇“PDF識別模式”。導入一個PDF文件作為樣本&#xff0c;框選需要提取文字的區域&#xff0c;并保存區域坐標。如果有多個…

中國汽車能源消耗量(2010-2024年)

1419中國汽車能源消耗量&#xff08;2010-2024年&#xff09;發文主題分布數據來源中華人民共和國工業和信息化部-中國汽車能源消耗量查詢中國汽車能源消耗量查詢 (miit.gov.cn)時間跨度2010-2024年數據范圍全國汽車企業數據指標本數據集包含包含傳統汽車能源消耗量數據以及新能…

Python 實現服務器自動故障處理工具:從監控到自愈的完整方案

在服務器運維過程中,80% 的故障都是重復性的簡單問題(如磁盤空間不足、內存泄漏、服務進程掛掉等)。本文將介紹如何使用 Python 開發一款輕量級自動故障處理工具,通過狀態監控、異常診斷、自動修復三個核心模塊,實現服務器常見故障的無人值守處理。 核心依賴庫 psutil:跨…

圖片上傳 el+node后端+數據庫

模版部分&#xff1a;鼠標懸浮到頭像的部分就出現下拉框顯示可以修改頭像&#xff0c;el-upload是隱藏的&#xff0c;可能只是為了實現on-change函數和before-upload函數吧這塊做的確實有點馬虎了。<div class"r-content"><el-dropdown><span class&q…

[java 常用類API] 新手小白的編程字典

目錄 1.API 1.1定義: 2.Object類 2.1 toString() 方法 2.2 equals() 方法 3. Arrays 類 3.1 equals() 方法 3.2 sort() 方法 3.2.1排序 3.2.2 自定義對象排序 3.3 binarySearch() 方法 3.4 copyOf() 方法 3.5 fill() 方法 3.6 toString() 方法 4.基本數據類型包裝類 4.…