eel4759_classification

Comparison of different ImageNet-based CNN models for classifying diabetic retinopathy images
Log | Files | Refs | README

old_output.txt (39797B)


      1 Using device: cuda
      2 Downloading/locating dataset via kagglehub...
      3 Dataset root: /home/vin/.cache/kagglehub/datasets/amanneo/diabetic-retinopathy-resized-arranged/versions/1
      4 Dataset split — train: 24588, val: 5269, test: 5269
      5 
      6 ======================================================================
      7 Experiment: resnet50  |  CLAHE: False
      8 ======================================================================
      9   Using 2 GPUs via DataParallel
     10 /home/vin/src/public/eel4759_finalproject_classification/guix-root/lib/python3.10/site-packages/torch/nn/modules/linear.py:125: UserWarning: Attempting to use hipBLASLt on an unsupported architecture! Overriding blas backend to hipblas (Triggered internally at /tmp/guix-build-python-pytorch-rocm-2.5.1.drv-0/source/aten/src/ATen/Context.cpp:296.)
     11   return F.linear(input, self.weight, self.bias)
     12 [resnet50_clahe=False] Epoch   1/50 | train loss: 1.0245 | val loss: 0.9964 | macro F1: 0.1852 | weighted F1: 0.3999 | lr: 1.00e-06
     13 [resnet50_clahe=False] Epoch   2/50 | train loss: 0.9314 | val loss: 0.8414 | macro F1: 0.2588 | weighted F1: 0.4671 | lr: 4.00e-06
     14 [resnet50_clahe=False] Epoch   3/50 | train loss: 0.7615 | val loss: 0.6517 | macro F1: 0.3182 | weighted F1: 0.4632 | lr: 7.00e-06
     15 /home/vin/src/public/eel4759_finalproject_classification/guix-root/lib/python3.10/site-packages/torch/optim/lr_scheduler.py:240: UserWarning: The epoch parameter in `scheduler.step()` was not necessary and is being deprecated where possible. Please use `scheduler.step()` to step the scheduler. During the deprecation, if epoch is different from None, the closed form is used instead of the new chainable form, where available. Please open an issue if you are unable to replicate your use case: https://github.com/pytorch/pytorch/issues/new/choose.
     16   warnings.warn(EPOCH_DEPRECATION_WARNING, UserWarning)
     17 [resnet50_clahe=False] Epoch   4/50 | train loss: 0.6579 | val loss: 0.5784 | macro F1: 0.3628 | weighted F1: 0.5279 | lr: 1.00e-05
     18 [resnet50_clahe=False] Epoch   5/50 | train loss: 0.6052 | val loss: 0.5553 | macro F1: 0.3466 | weighted F1: 0.5052 | lr: 9.99e-06
     19 [resnet50_clahe=False] Epoch   6/50 | train loss: 0.5523 | val loss: 0.5035 | macro F1: 0.3929 | weighted F1: 0.6145 | lr: 9.96e-06
     20 [resnet50_clahe=False] Epoch   7/50 | train loss: 0.5230 | val loss: 0.4800 | macro F1: 0.4087 | weighted F1: 0.5930 | lr: 9.90e-06
     21 [resnet50_clahe=False] Epoch   8/50 | train loss: 0.4867 | val loss: 0.5005 | macro F1: 0.3790 | weighted F1: 0.5139 | lr: 9.82e-06
     22 [resnet50_clahe=False] Epoch   9/50 | train loss: 0.4552 | val loss: 0.5179 | macro F1: 0.3835 | weighted F1: 0.5228 | lr: 9.72e-06
     23 [resnet50_clahe=False] Epoch  10/50 | train loss: 0.4253 | val loss: 0.4365 | macro F1: 0.4274 | weighted F1: 0.6266 | lr: 9.60e-06
     24 [resnet50_clahe=False] Epoch  11/50 | train loss: 0.4028 | val loss: 0.4509 | macro F1: 0.4160 | weighted F1: 0.6024 | lr: 9.46e-06
     25 [resnet50_clahe=False] Epoch  12/50 | train loss: 0.3771 | val loss: 0.4038 | macro F1: 0.4373 | weighted F1: 0.6812 | lr: 9.30e-06
     26 [resnet50_clahe=False] Epoch  13/50 | train loss: 0.3598 | val loss: 0.4183 | macro F1: 0.4330 | weighted F1: 0.6428 | lr: 9.12e-06
     27 [resnet50_clahe=False] Epoch  14/50 | train loss: 0.3373 | val loss: 0.4384 | macro F1: 0.4201 | weighted F1: 0.6056 | lr: 8.92e-06
     28 [resnet50_clahe=False] Epoch  15/50 | train loss: 0.3218 | val loss: 0.4118 | macro F1: 0.4360 | weighted F1: 0.6580 | lr: 8.71e-06
     29 [resnet50_clahe=False] Epoch  16/50 | train loss: 0.3145 | val loss: 0.4351 | macro F1: 0.4273 | weighted F1: 0.6133 | lr: 8.48e-06
     30 [resnet50_clahe=False] Epoch  17/50 | train loss: 0.2979 | val loss: 0.4389 | macro F1: 0.4241 | weighted F1: 0.6119 | lr: 8.23e-06
     31 [resnet50_clahe=False] Epoch  18/50 | train loss: 0.2895 | val loss: 0.4328 | macro F1: 0.4269 | weighted F1: 0.6206 | lr: 7.97e-06
     32 [resnet50_clahe=False] Epoch  19/50 | train loss: 0.2756 | val loss: 0.4400 | macro F1: 0.4357 | weighted F1: 0.6137 | lr: 7.69e-06
     33 [resnet50_clahe=False] Epoch  20/50 | train loss: 0.2712 | val loss: 0.4219 | macro F1: 0.4503 | weighted F1: 0.6445 | lr: 7.40e-06
     34 [resnet50_clahe=False] Epoch  21/50 | train loss: 0.2614 | val loss: 0.4592 | macro F1: 0.4380 | weighted F1: 0.5830 | lr: 7.10e-06
     35 [resnet50_clahe=False] Epoch  22/50 | train loss: 0.2565 | val loss: 0.4278 | macro F1: 0.4368 | weighted F1: 0.6325 | lr: 6.80e-06
     36 [resnet50_clahe=False] Epoch  23/50 | train loss: 0.2517 | val loss: 0.4127 | macro F1: 0.4541 | weighted F1: 0.6641 | lr: 6.48e-06
     37 [resnet50_clahe=False] Epoch  24/50 | train loss: 0.2415 | val loss: 0.4373 | macro F1: 0.4382 | weighted F1: 0.6198 | lr: 6.16e-06
     38 [resnet50_clahe=False] Epoch  25/50 | train loss: 0.2382 | val loss: 0.4130 | macro F1: 0.4585 | weighted F1: 0.6676 | lr: 5.83e-06
     39 [resnet50_clahe=False] Epoch  26/50 | train loss: 0.2363 | val loss: 0.4211 | macro F1: 0.4591 | weighted F1: 0.6563 | lr: 5.50e-06
     40 [resnet50_clahe=False] Epoch  27/50 | train loss: 0.2290 | val loss: 0.4322 | macro F1: 0.4538 | weighted F1: 0.6440 | lr: 5.17e-06
     41 [resnet50_clahe=False] Epoch  28/50 | train loss: 0.2263 | val loss: 0.4299 | macro F1: 0.4437 | weighted F1: 0.6414 | lr: 4.83e-06
     42 [resnet50_clahe=False] Epoch  29/50 | train loss: 0.2177 | val loss: 0.4171 | macro F1: 0.4536 | weighted F1: 0.6538 | lr: 4.50e-06
     43 [resnet50_clahe=False] Epoch  30/50 | train loss: 0.2174 | val loss: 0.4189 | macro F1: 0.4599 | weighted F1: 0.6671 | lr: 4.17e-06
     44 [resnet50_clahe=False] Epoch  31/50 | train loss: 0.2156 | val loss: 0.4180 | macro F1: 0.4590 | weighted F1: 0.6540 | lr: 3.84e-06
     45 [resnet50_clahe=False] Epoch  32/50 | train loss: 0.2094 | val loss: 0.4388 | macro F1: 0.4489 | weighted F1: 0.6309 | lr: 3.52e-06
     46 [resnet50_clahe=False] Epoch  33/50 | train loss: 0.2095 | val loss: 0.4170 | macro F1: 0.4544 | weighted F1: 0.6624 | lr: 3.20e-06
     47 [resnet50_clahe=False] Epoch  34/50 | train loss: 0.2047 | val loss: 0.4129 | macro F1: 0.4593 | weighted F1: 0.6698 | lr: 2.90e-06
     48 [resnet50_clahe=False] Epoch  35/50 | train loss: 0.1990 | val loss: 0.4372 | macro F1: 0.4538 | weighted F1: 0.6288 | lr: 2.60e-06
     49 [resnet50_clahe=False] Epoch  36/50 | train loss: 0.1997 | val loss: 0.4292 | macro F1: 0.4531 | weighted F1: 0.6472 | lr: 2.31e-06
     50 [resnet50_clahe=False] Epoch  37/50 | train loss: 0.2002 | val loss: 0.4450 | macro F1: 0.4547 | weighted F1: 0.6356 | lr: 2.03e-06
     51 [resnet50_clahe=False] Epoch  38/50 | train loss: 0.1953 | val loss: 0.4359 | macro F1: 0.4492 | weighted F1: 0.6448 | lr: 1.77e-06
     52 [resnet50_clahe=False] Epoch  39/50 | train loss: 0.1960 | val loss: 0.4283 | macro F1: 0.4617 | weighted F1: 0.6526 | lr: 1.52e-06
     53 [resnet50_clahe=False] Epoch  40/50 | train loss: 0.1910 | val loss: 0.4416 | macro F1: 0.4534 | weighted F1: 0.6405 | lr: 1.29e-06
     54 [resnet50_clahe=False] Epoch  41/50 | train loss: 0.1896 | val loss: 0.4199 | macro F1: 0.4626 | weighted F1: 0.6711 | lr: 1.08e-06
     55 [resnet50_clahe=False] Epoch  42/50 | train loss: 0.1915 | val loss: 0.4326 | macro F1: 0.4648 | weighted F1: 0.6557 | lr: 8.78e-07
     56 [resnet50_clahe=False] Epoch  43/50 | train loss: 0.1904 | val loss: 0.4213 | macro F1: 0.4547 | weighted F1: 0.6577 | lr: 6.98e-07
     57 [resnet50_clahe=False] Epoch  44/50 | train loss: 0.1883 | val loss: 0.4284 | macro F1: 0.4598 | weighted F1: 0.6512 | lr: 5.37e-07
     58 [resnet50_clahe=False] Epoch  45/50 | train loss: 0.1909 | val loss: 0.4330 | macro F1: 0.4561 | weighted F1: 0.6465 | lr: 3.97e-07
     59 [resnet50_clahe=False] Epoch  46/50 | train loss: 0.1902 | val loss: 0.4259 | macro F1: 0.4594 | weighted F1: 0.6519 | lr: 2.77e-07
     60 [resnet50_clahe=False] Epoch  47/50 | train loss: 0.1863 | val loss: 0.4299 | macro F1: 0.4550 | weighted F1: 0.6489 | lr: 1.78e-07
     61 [resnet50_clahe=False] Epoch  48/50 | train loss: 0.1882 | val loss: 0.4276 | macro F1: 0.4600 | weighted F1: 0.6555 | lr: 1.00e-07
     62 [resnet50_clahe=False] Epoch  49/50 | train loss: 0.1891 | val loss: 0.4210 | macro F1: 0.4625 | weighted F1: 0.6657 | lr: 4.46e-08
     63 [resnet50_clahe=False] Epoch  50/50 | train loss: 0.1895 | val loss: 0.4263 | macro F1: 0.4566 | weighted F1: 0.6599 | lr: 1.12e-08
     64   Training complete: 50 epochs, 7514.0s, best val macro F1: 0.4648
     65   Checkpoint saved: results/resnet50_clahe=False/best_model.pth
     66 
     67   Test results — Weighted F1: 0.6570 | Macro F1: 0.4630 | Accuracy: 0.6111 | Kappa: 0.5341
     68                       precision    recall  f1-score   support
     69 
     70          Healthy (0)       0.86      0.67      0.75      3872
     71        Mild NPDR (1)       0.11      0.35      0.17       366
     72    Moderate NPDR (2)       0.46      0.50      0.48       794
     73      Severe NPDR (3)       0.45      0.41      0.43       131
     74 Proliferative DR (4)       0.64      0.40      0.49       106
     75 
     76             accuracy                           0.61      5269
     77            macro avg       0.50      0.47      0.46      5269
     78         weighted avg       0.73      0.61      0.66      5269
     79 
     80 
     81 ======================================================================
     82 Experiment: resnet50  |  CLAHE: True
     83 ======================================================================
     84   Using 2 GPUs via DataParallel
     85 [resnet50_clahe=True] Epoch   1/50 | train loss: 1.0238 | val loss: 1.0225 | macro F1: 0.1611 | weighted F1: 0.3049 | lr: 1.00e-06
     86 [resnet50_clahe=True] Epoch   2/50 | train loss: 0.9321 | val loss: 0.8636 | macro F1: 0.2377 | weighted F1: 0.3381 | lr: 4.00e-06
     87 [resnet50_clahe=True] Epoch   3/50 | train loss: 0.7489 | val loss: 0.7394 | macro F1: 0.2726 | weighted F1: 0.2384 | lr: 7.00e-06
     88 /home/vin/src/public/eel4759_finalproject_classification/guix-root/lib/python3.10/site-packages/torch/optim/lr_scheduler.py:240: UserWarning: The epoch parameter in `scheduler.step()` was not necessary and is being deprecated where possible. Please use `scheduler.step()` to step the scheduler. During the deprecation, if epoch is different from None, the closed form is used instead of the new chainable form, where available. Please open an issue if you are unable to replicate your use case: https://github.com/pytorch/pytorch/issues/new/choose.
     89   warnings.warn(EPOCH_DEPRECATION_WARNING, UserWarning)
     90 [resnet50_clahe=True] Epoch   4/50 | train loss: 0.6605 | val loss: 0.6103 | macro F1: 0.3472 | weighted F1: 0.4773 | lr: 1.00e-05
     91 [resnet50_clahe=True] Epoch   5/50 | train loss: 0.6087 | val loss: 0.5574 | macro F1: 0.3812 | weighted F1: 0.5527 | lr: 9.99e-06
     92 [resnet50_clahe=True] Epoch   6/50 | train loss: 0.5717 | val loss: 0.6886 | macro F1: 0.3069 | weighted F1: 0.3767 | lr: 9.96e-06
     93 [resnet50_clahe=True] Epoch   7/50 | train loss: 0.5410 | val loss: 0.5472 | macro F1: 0.3861 | weighted F1: 0.5587 | lr: 9.90e-06
     94 [resnet50_clahe=True] Epoch   8/50 | train loss: 0.5153 | val loss: 0.6006 | macro F1: 0.3587 | weighted F1: 0.4748 | lr: 9.82e-06
     95 [resnet50_clahe=True] Epoch   9/50 | train loss: 0.4801 | val loss: 0.5778 | macro F1: 0.3511 | weighted F1: 0.4467 | lr: 9.72e-06
     96 [resnet50_clahe=True] Epoch  10/50 | train loss: 0.4605 | val loss: 0.6081 | macro F1: 0.3479 | weighted F1: 0.3552 | lr: 9.60e-06
     97 [resnet50_clahe=True] Epoch  11/50 | train loss: 0.4312 | val loss: 0.5329 | macro F1: 0.3830 | weighted F1: 0.5007 | lr: 9.46e-06
     98 [resnet50_clahe=True] Epoch  12/50 | train loss: 0.4050 | val loss: 0.6114 | macro F1: 0.3433 | weighted F1: 0.3942 | lr: 9.30e-06
     99 [resnet50_clahe=True] Epoch  13/50 | train loss: 0.3893 | val loss: 0.4973 | macro F1: 0.4002 | weighted F1: 0.5184 | lr: 9.12e-06
    100 [resnet50_clahe=True] Epoch  14/50 | train loss: 0.3720 | val loss: 0.5185 | macro F1: 0.3813 | weighted F1: 0.4926 | lr: 8.92e-06
    101 [resnet50_clahe=True] Epoch  15/50 | train loss: 0.3572 | val loss: 0.4602 | macro F1: 0.4253 | weighted F1: 0.6034 | lr: 8.71e-06
    102 [resnet50_clahe=True] Epoch  16/50 | train loss: 0.3412 | val loss: 0.4855 | macro F1: 0.4119 | weighted F1: 0.5678 | lr: 8.48e-06
    103 [resnet50_clahe=True] Epoch  17/50 | train loss: 0.3293 | val loss: 0.5191 | macro F1: 0.3913 | weighted F1: 0.4668 | lr: 8.23e-06
    104 [resnet50_clahe=True] Epoch  18/50 | train loss: 0.3160 | val loss: 0.4860 | macro F1: 0.4172 | weighted F1: 0.5307 | lr: 7.97e-06
    105 [resnet50_clahe=True] Epoch  19/50 | train loss: 0.3008 | val loss: 0.4435 | macro F1: 0.4492 | weighted F1: 0.6188 | lr: 7.69e-06
    106 [resnet50_clahe=True] Epoch  20/50 | train loss: 0.3014 | val loss: 0.4456 | macro F1: 0.4312 | weighted F1: 0.6130 | lr: 7.40e-06
    107 [resnet50_clahe=True] Epoch  21/50 | train loss: 0.2881 | val loss: 0.4873 | macro F1: 0.4171 | weighted F1: 0.5459 | lr: 7.10e-06
    108 [resnet50_clahe=True] Epoch  22/50 | train loss: 0.2866 | val loss: 0.4176 | macro F1: 0.4596 | weighted F1: 0.6512 | lr: 6.80e-06
    109 [resnet50_clahe=True] Epoch  23/50 | train loss: 0.2749 | val loss: 0.4252 | macro F1: 0.4611 | weighted F1: 0.6455 | lr: 6.48e-06
    110 [resnet50_clahe=True] Epoch  24/50 | train loss: 0.2686 | val loss: 0.4157 | macro F1: 0.4631 | weighted F1: 0.6507 | lr: 6.16e-06
    111 [resnet50_clahe=True] Epoch  25/50 | train loss: 0.2612 | val loss: 0.4571 | macro F1: 0.4375 | weighted F1: 0.5825 | lr: 5.83e-06
    112 [resnet50_clahe=True] Epoch  26/50 | train loss: 0.2605 | val loss: 0.4122 | macro F1: 0.4560 | weighted F1: 0.6547 | lr: 5.50e-06
    113 [resnet50_clahe=True] Epoch  27/50 | train loss: 0.2521 | val loss: 0.4362 | macro F1: 0.4559 | weighted F1: 0.6230 | lr: 5.17e-06
    114 [resnet50_clahe=True] Epoch  28/50 | train loss: 0.2487 | val loss: 0.4511 | macro F1: 0.4397 | weighted F1: 0.5744 | lr: 4.83e-06
    115 [resnet50_clahe=True] Epoch  29/50 | train loss: 0.2446 | val loss: 0.4332 | macro F1: 0.4599 | weighted F1: 0.6134 | lr: 4.50e-06
    116 [resnet50_clahe=True] Epoch  30/50 | train loss: 0.2440 | val loss: 0.4364 | macro F1: 0.4538 | weighted F1: 0.5992 | lr: 4.17e-06
    117 [resnet50_clahe=True] Epoch  31/50 | train loss: 0.2387 | val loss: 0.4493 | macro F1: 0.4453 | weighted F1: 0.5933 | lr: 3.84e-06
    118 [resnet50_clahe=True] Epoch  32/50 | train loss: 0.2329 | val loss: 0.4114 | macro F1: 0.4750 | weighted F1: 0.6623 | lr: 3.52e-06
    119 [resnet50_clahe=True] Epoch  33/50 | train loss: 0.2332 | val loss: 0.4253 | macro F1: 0.4582 | weighted F1: 0.6266 | lr: 3.20e-06
    120 [resnet50_clahe=True] Epoch  34/50 | train loss: 0.2295 | val loss: 0.4181 | macro F1: 0.4710 | weighted F1: 0.6431 | lr: 2.90e-06
    121 [resnet50_clahe=True] Epoch  35/50 | train loss: 0.2271 | val loss: 0.4429 | macro F1: 0.4485 | weighted F1: 0.6159 | lr: 2.60e-06
    122 [resnet50_clahe=True] Epoch  36/50 | train loss: 0.2248 | val loss: 0.4404 | macro F1: 0.4527 | weighted F1: 0.6060 | lr: 2.31e-06
    123 [resnet50_clahe=True] Epoch  37/50 | train loss: 0.2201 | val loss: 0.4329 | macro F1: 0.4633 | weighted F1: 0.6234 | lr: 2.03e-06
    124 [resnet50_clahe=True] Epoch  38/50 | train loss: 0.2219 | val loss: 0.4181 | macro F1: 0.4654 | weighted F1: 0.6392 | lr: 1.77e-06
    125 [resnet50_clahe=True] Epoch  39/50 | train loss: 0.2201 | val loss: 0.4433 | macro F1: 0.4566 | weighted F1: 0.6084 | lr: 1.52e-06
    126 [resnet50_clahe=True] Epoch  40/50 | train loss: 0.2203 | val loss: 0.4200 | macro F1: 0.4683 | weighted F1: 0.6455 | lr: 1.29e-06
    127 [resnet50_clahe=True] Epoch  41/50 | train loss: 0.2174 | val loss: 0.4340 | macro F1: 0.4613 | weighted F1: 0.6123 | lr: 1.08e-06
    128 [resnet50_clahe=True] Epoch  42/50 | train loss: 0.2191 | val loss: 0.4246 | macro F1: 0.4619 | weighted F1: 0.6323 | lr: 8.78e-07
    129   Early stopping at epoch 42 (no improvement for 10 epochs).
    130   Training complete: 42 epochs, 7428.3s, best val macro F1: 0.4750
    131   Checkpoint saved: results/resnet50_clahe=True/best_model.pth
    132 
    133   Test results — Weighted F1: 0.6473 | Macro F1: 0.4426 | Accuracy: 0.6058 | Kappa: 0.5234
    134                       precision    recall  f1-score   support
    135 
    136          Healthy (0)       0.86      0.66      0.75      3872
    137        Mild NPDR (1)       0.12      0.32      0.17       366
    138    Moderate NPDR (2)       0.39      0.52      0.45       794
    139      Severe NPDR (3)       0.35      0.33      0.34       131
    140 Proliferative DR (4)       0.46      0.56      0.50       106
    141 
    142             accuracy                           0.61      5269
    143            macro avg       0.44      0.48      0.44      5269
    144         weighted avg       0.72      0.61      0.65      5269
    145 
    146 
    147 ======================================================================
    148 Experiment: efficientnet_b0  |  CLAHE: False
    149 ======================================================================
    150   Using 2 GPUs via DataParallel
    151 [efficientnet_b0_clahe=False] Epoch   1/50 | train loss: 1.0094 | val loss: 1.0305 | macro F1: 0.1622 | weighted F1: 0.2599 | lr: 1.00e-06
    152 [efficientnet_b0_clahe=False] Epoch   2/50 | train loss: 0.9135 | val loss: 0.8390 | macro F1: 0.2462 | weighted F1: 0.3625 | lr: 4.00e-06
    153 [efficientnet_b0_clahe=False] Epoch   3/50 | train loss: 0.7802 | val loss: 0.6796 | macro F1: 0.3085 | weighted F1: 0.4454 | lr: 7.00e-06
    154 /home/vin/src/public/eel4759_finalproject_classification/guix-root/lib/python3.10/site-packages/torch/optim/lr_scheduler.py:240: UserWarning: The epoch parameter in `scheduler.step()` was not necessary and is being deprecated where possible. Please use `scheduler.step()` to step the scheduler. During the deprecation, if epoch is different from None, the closed form is used instead of the new chainable form, where available. Please open an issue if you are unable to replicate your use case: https://github.com/pytorch/pytorch/issues/new/choose.
    155   warnings.warn(EPOCH_DEPRECATION_WARNING, UserWarning)
    156 [efficientnet_b0_clahe=False] Epoch   4/50 | train loss: 0.6916 | val loss: 0.6145 | macro F1: 0.3412 | weighted F1: 0.4696 | lr: 1.00e-05
    157 [efficientnet_b0_clahe=False] Epoch   5/50 | train loss: 0.6479 | val loss: 0.6016 | macro F1: 0.3530 | weighted F1: 0.4816 | lr: 9.99e-06
    158 [efficientnet_b0_clahe=False] Epoch   6/50 | train loss: 0.6232 | val loss: 0.5439 | macro F1: 0.3814 | weighted F1: 0.5468 | lr: 9.96e-06
    159 [efficientnet_b0_clahe=False] Epoch   7/50 | train loss: 0.6024 | val loss: 0.5210 | macro F1: 0.3909 | weighted F1: 0.5471 | lr: 9.90e-06
    160 [efficientnet_b0_clahe=False] Epoch   8/50 | train loss: 0.5788 | val loss: 0.5330 | macro F1: 0.3936 | weighted F1: 0.5652 | lr: 9.82e-06
    161 [efficientnet_b0_clahe=False] Epoch   9/50 | train loss: 0.5693 | val loss: 0.4784 | macro F1: 0.4241 | weighted F1: 0.6237 | lr: 9.72e-06
    162 [efficientnet_b0_clahe=False] Epoch  10/50 | train loss: 0.5533 | val loss: 0.4836 | macro F1: 0.4168 | weighted F1: 0.6054 | lr: 9.60e-06
    163 [efficientnet_b0_clahe=False] Epoch  11/50 | train loss: 0.5360 | val loss: 0.4841 | macro F1: 0.4225 | weighted F1: 0.6004 | lr: 9.46e-06
    164 [efficientnet_b0_clahe=False] Epoch  12/50 | train loss: 0.5262 | val loss: 0.4864 | macro F1: 0.4240 | weighted F1: 0.5978 | lr: 9.30e-06
    165 [efficientnet_b0_clahe=False] Epoch  13/50 | train loss: 0.5072 | val loss: 0.4667 | macro F1: 0.4395 | weighted F1: 0.6369 | lr: 9.12e-06
    166 [efficientnet_b0_clahe=False] Epoch  14/50 | train loss: 0.4993 | val loss: 0.4608 | macro F1: 0.4295 | weighted F1: 0.5932 | lr: 8.92e-06
    167 [efficientnet_b0_clahe=False] Epoch  15/50 | train loss: 0.4913 | val loss: 0.4630 | macro F1: 0.4375 | weighted F1: 0.6177 | lr: 8.71e-06
    168 [efficientnet_b0_clahe=False] Epoch  16/50 | train loss: 0.4824 | val loss: 0.4439 | macro F1: 0.4395 | weighted F1: 0.6329 | lr: 8.48e-06
    169 [efficientnet_b0_clahe=False] Epoch  17/50 | train loss: 0.4761 | val loss: 0.4512 | macro F1: 0.4469 | weighted F1: 0.6369 | lr: 8.23e-06
    170 [efficientnet_b0_clahe=False] Epoch  18/50 | train loss: 0.4608 | val loss: 0.4420 | macro F1: 0.4512 | weighted F1: 0.6506 | lr: 7.97e-06
    171 [efficientnet_b0_clahe=False] Epoch  19/50 | train loss: 0.4509 | val loss: 0.4284 | macro F1: 0.4489 | weighted F1: 0.6558 | lr: 7.69e-06
    172 [efficientnet_b0_clahe=False] Epoch  20/50 | train loss: 0.4410 | val loss: 0.4232 | macro F1: 0.4586 | weighted F1: 0.6566 | lr: 7.40e-06
    173 [efficientnet_b0_clahe=False] Epoch  21/50 | train loss: 0.4339 | val loss: 0.4292 | macro F1: 0.4498 | weighted F1: 0.6438 | lr: 7.10e-06
    174 [efficientnet_b0_clahe=False] Epoch  22/50 | train loss: 0.4260 | val loss: 0.4554 | macro F1: 0.4252 | weighted F1: 0.6216 | lr: 6.80e-06
    175 [efficientnet_b0_clahe=False] Epoch  23/50 | train loss: 0.4163 | val loss: 0.4584 | macro F1: 0.4267 | weighted F1: 0.5894 | lr: 6.48e-06
    176 [efficientnet_b0_clahe=False] Epoch  24/50 | train loss: 0.4194 | val loss: 0.4317 | macro F1: 0.4393 | weighted F1: 0.6219 | lr: 6.16e-06
    177 [efficientnet_b0_clahe=False] Epoch  25/50 | train loss: 0.4121 | val loss: 0.4469 | macro F1: 0.4260 | weighted F1: 0.6084 | lr: 5.83e-06
    178 [efficientnet_b0_clahe=False] Epoch  26/50 | train loss: 0.4032 | val loss: 0.4448 | macro F1: 0.4315 | weighted F1: 0.6125 | lr: 5.50e-06
    179 [efficientnet_b0_clahe=False] Epoch  27/50 | train loss: 0.3985 | val loss: 0.4556 | macro F1: 0.4163 | weighted F1: 0.5744 | lr: 5.17e-06
    180 [efficientnet_b0_clahe=False] Epoch  28/50 | train loss: 0.4012 | val loss: 0.4414 | macro F1: 0.4369 | weighted F1: 0.6114 | lr: 4.83e-06
    181 [efficientnet_b0_clahe=False] Epoch  29/50 | train loss: 0.3901 | val loss: 0.4544 | macro F1: 0.4269 | weighted F1: 0.5848 | lr: 4.50e-06
    182 [efficientnet_b0_clahe=False] Epoch  30/50 | train loss: 0.3827 | val loss: 0.4198 | macro F1: 0.4493 | weighted F1: 0.6541 | lr: 4.17e-06
    183   Early stopping at epoch 30 (no improvement for 10 epochs).
    184   Training complete: 30 epochs, 4417.0s, best val macro F1: 0.4586
    185   Checkpoint saved: results/efficientnet_b0_clahe=False/best_model.pth
    186 
    187   Test results — Weighted F1: 0.6544 | Macro F1: 0.4565 | Accuracy: 0.6092 | Kappa: 0.5508
    188                       precision    recall  f1-score   support
    189 
    190          Healthy (0)       0.86      0.68      0.76      3872
    191        Mild NPDR (1)       0.12      0.38      0.18       366
    192    Moderate NPDR (2)       0.43      0.44      0.43       794
    193      Severe NPDR (3)       0.37      0.40      0.39       131
    194 Proliferative DR (4)       0.50      0.55      0.52       106
    195 
    196             accuracy                           0.61      5269
    197            macro avg       0.46      0.49      0.46      5269
    198         weighted avg       0.73      0.61      0.65      5269
    199 
    200 
    201 ======================================================================
    202 Experiment: efficientnet_b0  |  CLAHE: True
    203 ======================================================================
    204   Using 2 GPUs via DataParallel
    205 [efficientnet_b0_clahe=True] Epoch   1/50 | train loss: 1.0340 | val loss: 0.9535 | macro F1: 0.1977 | weighted F1: 0.4595 | lr: 1.00e-06
    206 [efficientnet_b0_clahe=True] Epoch   2/50 | train loss: 0.9357 | val loss: 0.8644 | macro F1: 0.2540 | weighted F1: 0.4719 | lr: 4.00e-06
    207 [efficientnet_b0_clahe=True] Epoch   3/50 | train loss: 0.8071 | val loss: 0.7581 | macro F1: 0.2782 | weighted F1: 0.3761 | lr: 7.00e-06
    208 /home/vin/src/public/eel4759_finalproject_classification/guix-root/lib/python3.10/site-packages/torch/optim/lr_scheduler.py:240: UserWarning: The epoch parameter in `scheduler.step()` was not necessary and is being deprecated where possible. Please use `scheduler.step()` to step the scheduler. During the deprecation, if epoch is different from None, the closed form is used instead of the new chainable form, where available. Please open an issue if you are unable to replicate your use case: https://github.com/pytorch/pytorch/issues/new/choose.
    209   warnings.warn(EPOCH_DEPRECATION_WARNING, UserWarning)
    210 [efficientnet_b0_clahe=True] Epoch   4/50 | train loss: 0.7152 | val loss: 0.7045 | macro F1: 0.3216 | weighted F1: 0.4750 | lr: 1.00e-05
    211 [efficientnet_b0_clahe=True] Epoch   5/50 | train loss: 0.6679 | val loss: 0.6061 | macro F1: 0.3530 | weighted F1: 0.5111 | lr: 9.99e-06
    212 [efficientnet_b0_clahe=True] Epoch   6/50 | train loss: 0.6345 | val loss: 0.5824 | macro F1: 0.3795 | weighted F1: 0.5610 | lr: 9.96e-06
    213 [efficientnet_b0_clahe=True] Epoch   7/50 | train loss: 0.6218 | val loss: 0.6082 | macro F1: 0.3673 | weighted F1: 0.5309 | lr: 9.90e-06
    214 [efficientnet_b0_clahe=True] Epoch   8/50 | train loss: 0.5995 | val loss: 0.5310 | macro F1: 0.4200 | weighted F1: 0.6034 | lr: 9.82e-06
    215 [efficientnet_b0_clahe=True] Epoch   9/50 | train loss: 0.5713 | val loss: 0.5494 | macro F1: 0.3984 | weighted F1: 0.5903 | lr: 9.72e-06
    216 [efficientnet_b0_clahe=True] Epoch  10/50 | train loss: 0.5695 | val loss: 0.5148 | macro F1: 0.4143 | weighted F1: 0.5797 | lr: 9.60e-06
    217 [efficientnet_b0_clahe=True] Epoch  11/50 | train loss: 0.5582 | val loss: 0.5137 | macro F1: 0.4164 | weighted F1: 0.6019 | lr: 9.46e-06
    218 [efficientnet_b0_clahe=True] Epoch  12/50 | train loss: 0.5420 | val loss: 0.4829 | macro F1: 0.4390 | weighted F1: 0.6368 | lr: 9.30e-06
    219 [efficientnet_b0_clahe=True] Epoch  13/50 | train loss: 0.5272 | val loss: 0.5464 | macro F1: 0.4034 | weighted F1: 0.5600 | lr: 9.12e-06
    220 [efficientnet_b0_clahe=True] Epoch  14/50 | train loss: 0.5217 | val loss: 0.5122 | macro F1: 0.4191 | weighted F1: 0.5894 | lr: 8.92e-06
    221 [efficientnet_b0_clahe=True] Epoch  15/50 | train loss: 0.5070 | val loss: 0.4664 | macro F1: 0.4436 | weighted F1: 0.6234 | lr: 8.71e-06
    222 [efficientnet_b0_clahe=True] Epoch  16/50 | train loss: 0.5059 | val loss: 0.5205 | macro F1: 0.4144 | weighted F1: 0.5574 | lr: 8.48e-06
    223 [efficientnet_b0_clahe=True] Epoch  17/50 | train loss: 0.4872 | val loss: 0.4746 | macro F1: 0.4323 | weighted F1: 0.6283 | lr: 8.23e-06
    224 [efficientnet_b0_clahe=True] Epoch  18/50 | train loss: 0.4801 | val loss: 0.4534 | macro F1: 0.4345 | weighted F1: 0.6202 | lr: 7.97e-06
    225 [efficientnet_b0_clahe=True] Epoch  19/50 | train loss: 0.4659 | val loss: 0.4260 | macro F1: 0.4591 | weighted F1: 0.6698 | lr: 7.69e-06
    226 [efficientnet_b0_clahe=True] Epoch  20/50 | train loss: 0.4631 | val loss: 0.4721 | macro F1: 0.4343 | weighted F1: 0.6318 | lr: 7.40e-06
    227 [efficientnet_b0_clahe=True] Epoch  21/50 | train loss: 0.4559 | val loss: 0.4620 | macro F1: 0.4281 | weighted F1: 0.6117 | lr: 7.10e-06
    228 [efficientnet_b0_clahe=True] Epoch  22/50 | train loss: 0.4491 | val loss: 0.4908 | macro F1: 0.4294 | weighted F1: 0.6191 | lr: 6.80e-06
    229 [efficientnet_b0_clahe=True] Epoch  23/50 | train loss: 0.4461 | val loss: 0.4441 | macro F1: 0.4530 | weighted F1: 0.6423 | lr: 6.48e-06
    230 [efficientnet_b0_clahe=True] Epoch  24/50 | train loss: 0.4359 | val loss: 0.4833 | macro F1: 0.4273 | weighted F1: 0.6094 | lr: 6.16e-06
    231 [efficientnet_b0_clahe=True] Epoch  25/50 | train loss: 0.4335 | val loss: 0.4640 | macro F1: 0.4372 | weighted F1: 0.6126 | lr: 5.83e-06
    232 [efficientnet_b0_clahe=True] Epoch  26/50 | train loss: 0.4239 | val loss: 0.4630 | macro F1: 0.4415 | weighted F1: 0.6327 | lr: 5.50e-06
    233 [efficientnet_b0_clahe=True] Epoch  27/50 | train loss: 0.4233 | val loss: 0.4814 | macro F1: 0.4333 | weighted F1: 0.5907 | lr: 5.17e-06
    234 [efficientnet_b0_clahe=True] Epoch  28/50 | train loss: 0.4195 | val loss: 0.4707 | macro F1: 0.4348 | weighted F1: 0.6253 | lr: 4.83e-06
    235 [efficientnet_b0_clahe=True] Epoch  29/50 | train loss: 0.4106 | val loss: 0.4524 | macro F1: 0.4444 | weighted F1: 0.6188 | lr: 4.50e-06
    236   Early stopping at epoch 29 (no improvement for 10 epochs).
    237   Training complete: 29 epochs, 5039.9s, best val macro F1: 0.4591
    238   Checkpoint saved: results/efficientnet_b0_clahe=True/best_model.pth
    239 
    240   Test results — Weighted F1: 0.6583 | Macro F1: 0.4510 | Accuracy: 0.6225 | Kappa: 0.5388
    241                       precision    recall  f1-score   support
    242 
    243          Healthy (0)       0.85      0.71      0.77      3872
    244        Mild NPDR (1)       0.11      0.31      0.17       366
    245    Moderate NPDR (2)       0.41      0.36      0.38       794
    246      Severe NPDR (3)       0.35      0.48      0.41       131
    247 Proliferative DR (4)       0.46      0.62      0.53       106
    248 
    249             accuracy                           0.62      5269
    250            macro avg       0.44      0.50      0.45      5269
    251         weighted avg       0.71      0.62      0.66      5269
    252 
    253 
    254 ======================================================================
    255 Experiment: vit_b_16  |  CLAHE: False
    256 ======================================================================
    257   Using 2 GPUs via DataParallel
    258 /home/vin/src/public/eel4759_finalproject_classification/guix-root/lib/python3.10/site-packages/torch/nn/functional.py:6278: UserWarning: 1Torch was not compiled with memory efficient attention. (Triggered internally at /tmp/guix-build-python-pytorch-rocm-2.5.1.drv-0/source/aten/src/ATen/native/transformers/hip/sdp_utils.cpp:655.)
    259   attn_output = scaled_dot_product_attention(
    260 [vit_b_16_clahe=False] Epoch   1/50 | train loss: 0.8742 | val loss: 0.6483 | macro F1: 0.3378 | weighted F1: 0.5137 | lr: 1.00e-06
    261 [vit_b_16_clahe=False] Epoch   2/50 | train loss: 0.6200 | val loss: 0.5276 | macro F1: 0.4139 | weighted F1: 0.6270 | lr: 4.00e-06
    262 [vit_b_16_clahe=False] Epoch   3/50 | train loss: 0.5423 | val loss: 0.4780 | macro F1: 0.4336 | weighted F1: 0.6650 | lr: 7.00e-06
    263 /home/vin/src/public/eel4759_finalproject_classification/guix-root/lib/python3.10/site-packages/torch/optim/lr_scheduler.py:240: UserWarning: The epoch parameter in `scheduler.step()` was not necessary and is being deprecated where possible. Please use `scheduler.step()` to step the scheduler. During the deprecation, if epoch is different from None, the closed form is used instead of the new chainable form, where available. Please open an issue if you are unable to replicate your use case: https://github.com/pytorch/pytorch/issues/new/choose.
    264   warnings.warn(EPOCH_DEPRECATION_WARNING, UserWarning)
    265 [vit_b_16_clahe=False] Epoch   4/50 | train loss: 0.4824 | val loss: 0.4713 | macro F1: 0.4397 | weighted F1: 0.6484 | lr: 1.00e-05
    266 [vit_b_16_clahe=False] Epoch   5/50 | train loss: 0.3943 | val loss: 0.5388 | macro F1: 0.4058 | weighted F1: 0.5305 | lr: 9.99e-06
    267 [vit_b_16_clahe=False] Epoch   6/50 | train loss: 0.3380 | val loss: 0.4502 | macro F1: 0.4414 | weighted F1: 0.6493 | lr: 9.96e-06
    268 [vit_b_16_clahe=False] Epoch   7/50 | train loss: 0.2967 | val loss: 0.5407 | macro F1: 0.4048 | weighted F1: 0.5500 | lr: 9.90e-06
    269 [vit_b_16_clahe=False] Epoch   8/50 | train loss: 0.2683 | val loss: 0.4669 | macro F1: 0.4255 | weighted F1: 0.6103 | lr: 9.82e-06
    270 [vit_b_16_clahe=False] Epoch   9/50 | train loss: 0.2491 | val loss: 0.5058 | macro F1: 0.4202 | weighted F1: 0.5681 | lr: 9.72e-06
    271 [vit_b_16_clahe=False] Epoch  10/50 | train loss: 0.2314 | val loss: 0.5206 | macro F1: 0.3947 | weighted F1: 0.5672 | lr: 9.60e-06
    272 [vit_b_16_clahe=False] Epoch  11/50 | train loss: 0.2123 | val loss: 0.4093 | macro F1: 0.4600 | weighted F1: 0.6873 | lr: 9.46e-06
    273 [vit_b_16_clahe=False] Epoch  12/50 | train loss: 0.1984 | val loss: 0.4557 | macro F1: 0.4462 | weighted F1: 0.6466 | lr: 9.30e-06
    274 [vit_b_16_clahe=False] Epoch  13/50 | train loss: 0.1796 | val loss: 0.5881 | macro F1: 0.3977 | weighted F1: 0.4722 | lr: 9.12e-06
    275 [vit_b_16_clahe=False] Epoch  14/50 | train loss: 0.1653 | val loss: 0.5450 | macro F1: 0.4196 | weighted F1: 0.5442 | lr: 8.92e-06
    276 [vit_b_16_clahe=False] Epoch  15/50 | train loss: 0.1543 | val loss: 0.4631 | macro F1: 0.4565 | weighted F1: 0.6523 | lr: 8.71e-06
    277 [vit_b_16_clahe=False] Epoch  16/50 | train loss: 0.1406 | val loss: 0.4707 | macro F1: 0.4367 | weighted F1: 0.6526 | lr: 8.48e-06
    278 [vit_b_16_clahe=False] Epoch  17/50 | train loss: 0.1301 | val loss: 0.4762 | macro F1: 0.4604 | weighted F1: 0.6645 | lr: 8.23e-06
    279 [vit_b_16_clahe=False] Epoch  18/50 | train loss: 0.1178 | val loss: 0.4418 | macro F1: 0.4740 | weighted F1: 0.7078 | lr: 7.97e-06
    280 [vit_b_16_clahe=False] Epoch  19/50 | train loss: 0.1070 | val loss: 0.5175 | macro F1: 0.4431 | weighted F1: 0.6389 | lr: 7.69e-06
    281 [vit_b_16_clahe=False] Epoch  20/50 | train loss: 0.0997 | val loss: 0.4831 | macro F1: 0.4548 | weighted F1: 0.7043 | lr: 7.40e-06
    282 [vit_b_16_clahe=False] Epoch  21/50 | train loss: 0.0932 | val loss: 0.5100 | macro F1: 0.4572 | weighted F1: 0.6734 | lr: 7.10e-06
    283 [vit_b_16_clahe=False] Epoch  22/50 | train loss: 0.0820 | val loss: 0.5025 | macro F1: 0.4599 | weighted F1: 0.6818 | lr: 6.80e-06
    284 [vit_b_16_clahe=False] Epoch  23/50 | train loss: 0.0732 | val loss: 0.5247 | macro F1: 0.4565 | weighted F1: 0.6924 | lr: 6.48e-06
    285 [vit_b_16_clahe=False] Epoch  24/50 | train loss: 0.0690 | val loss: 0.5487 | macro F1: 0.4732 | weighted F1: 0.7083 | lr: 6.16e-06
    286 [vit_b_16_clahe=False] Epoch  25/50 | train loss: 0.0631 | val loss: 0.5392 | macro F1: 0.4704 | weighted F1: 0.7079 | lr: 5.83e-06
    287 [vit_b_16_clahe=False] Epoch  26/50 | train loss: 0.0585 | val loss: 0.5939 | macro F1: 0.4463 | weighted F1: 0.6931 | lr: 5.50e-06
    288 [vit_b_16_clahe=False] Epoch  27/50 | train loss: 0.0534 | val loss: 0.5767 | macro F1: 0.4859 | weighted F1: 0.7079 | lr: 5.17e-06
    289 [vit_b_16_clahe=False] Epoch  28/50 | train loss: 0.0489 | val loss: 0.5820 | macro F1: 0.4646 | weighted F1: 0.7143 | lr: 4.83e-06
    290 [vit_b_16_clahe=False] Epoch  29/50 | train loss: 0.0472 | val loss: 0.5762 | macro F1: 0.4666 | weighted F1: 0.7230 | lr: 4.50e-06
    291 [vit_b_16_clahe=False] Epoch  30/50 | train loss: 0.0435 | val loss: 0.6125 | macro F1: 0.4653 | weighted F1: 0.7279 | lr: 4.17e-06
    292 [vit_b_16_clahe=False] Epoch  31/50 | train loss: 0.0415 | val loss: 0.6332 | macro F1: 0.4475 | weighted F1: 0.7150 | lr: 3.84e-06
    293 [vit_b_16_clahe=False] Epoch  32/50 | train loss: 0.0366 | val loss: 0.6243 | macro F1: 0.4765 | weighted F1: 0.7230 | lr: 3.52e-06
    294 [vit_b_16_clahe=False] Epoch  33/50 | train loss: 0.0338 | val loss: 0.6617 | macro F1: 0.4562 | weighted F1: 0.7240 | lr: 3.20e-06
    295 [vit_b_16_clahe=False] Epoch  34/50 | train loss: 0.0330 | val loss: 0.6543 | macro F1: 0.4573 | weighted F1: 0.7261 | lr: 2.90e-06
    296 [vit_b_16_clahe=False] Epoch  35/50 | train loss: 0.0306 | val loss: 0.6551 | macro F1: 0.4678 | weighted F1: 0.7145 | lr: 2.60e-06
    297 [vit_b_16_clahe=False] Epoch  36/50 | train loss: 0.0278 | val loss: 0.6882 | macro F1: 0.4576 | weighted F1: 0.7208 | lr: 2.31e-06
    298 [vit_b_16_clahe=False] Epoch  37/50 | train loss: 0.0263 | val loss: 0.6960 | macro F1: 0.4667 | weighted F1: 0.7268 | lr: 2.03e-06
    299   Early stopping at epoch 37 (no improvement for 10 epochs).
    300   Training complete: 37 epochs, 5571.3s, best val macro F1: 0.4859
    301   Checkpoint saved: results/vit_b_16_clahe=False/best_model.pth
    302 
    303   Test results — Weighted F1: 0.6913 | Macro F1: 0.4654 | Accuracy: 0.6800 | Kappa: 0.5326
    304                       precision    recall  f1-score   support
    305 
    306          Healthy (0)       0.83      0.79      0.81      3872
    307        Mild NPDR (1)       0.12      0.17      0.14       366
    308    Moderate NPDR (2)       0.41      0.46      0.43       794
    309      Severe NPDR (3)       0.50      0.37      0.43       131
    310 Proliferative DR (4)       0.63      0.43      0.51       106
    311 
    312             accuracy                           0.68      5269
    313            macro avg       0.50      0.45      0.47      5269
    314         weighted avg       0.71      0.68      0.69      5269
    315 
    316 
    317 ======================================================================
    318 Experiment: vit_b_16  |  CLAHE: True
    319 ======================================================================
    320   Using 2 GPUs via DataParallel
    321 [vit_b_16_clahe=True] Epoch   1/50 | train loss: 0.8458 | val loss: 0.6484 | macro F1: 0.3372 | weighted F1: 0.5862 | lr: 1.00e-06
    322 [vit_b_16_clahe=True] Epoch   2/50 | train loss: 0.6195 | val loss: 0.5034 | macro F1: 0.4192 | weighted F1: 0.6381 | lr: 4.00e-06
    323 [vit_b_16_clahe=True] Epoch   3/50 | train loss: 0.5527 | val loss: 0.4780 | macro F1: 0.4058 | weighted F1: 0.5776 | lr: 7.00e-06
    324 /home/vin/src/public/eel4759_finalproject_classification/guix-root/lib/python3.10/site-packages/torch/optim/lr_scheduler.py:240: UserWarning: The epoch parameter in `scheduler.step()` was not necessary and is being deprecated where possible. Please use `scheduler.step()` to step the scheduler. During the deprecation, if epoch is different from None, the closed form is used instead of the new chainable form, where available. Please open an issue if you are unable to replicate your use case: https://github.com/pytorch/pytorch/issues/new/choose.
    325   warnings.warn(EPOCH_DEPRECATION_WARNING, UserWarning)
    326 [vit_b_16_clahe=True] Epoch   4/50 | train loss: 0.4705 | val loss: 0.5859 | macro F1: 0.3382 | weighted F1: 0.3211 | lr: 1.00e-05
    327 [vit_b_16_clahe=True] Epoch   5/50 | train loss: 0.3984 | val loss: 0.4626 | macro F1: 0.4063 | weighted F1: 0.5911 | lr: 9.99e-06
    328 [vit_b_16_clahe=True] Epoch   6/50 | train loss: 0.3541 | val loss: 0.5024 | macro F1: 0.4102 | weighted F1: 0.5132 | lr: 9.96e-06
    329 [vit_b_16_clahe=True] Epoch   7/50 | train loss: 0.3034 | val loss: 0.5261 | macro F1: 0.3908 | weighted F1: 0.5489 | lr: 9.90e-06
    330 [vit_b_16_clahe=True] Epoch   8/50 | train loss: 0.2757 | val loss: 0.5225 | macro F1: 0.4164 | weighted F1: 0.5205 | lr: 9.82e-06
    331 [vit_b_16_clahe=True] Epoch   9/50 | train loss: 0.2469 | val loss: 0.5351 | macro F1: 0.4040 | weighted F1: 0.5129 | lr: 9.72e-06
    332 [vit_b_16_clahe=True] Epoch  10/50 | train loss: 0.2217 | val loss: 0.4544 | macro F1: 0.4237 | weighted F1: 0.6428 | lr: 9.60e-06
    333 [vit_b_16_clahe=True] Epoch  11/50 | train loss: 0.2108 | val loss: 0.4344 | macro F1: 0.4614 | weighted F1: 0.6458 | lr: 9.46e-06
    334 [vit_b_16_clahe=True] Epoch  12/50 | train loss: 0.1908 | val loss: 0.3916 | macro F1: 0.4673 | weighted F1: 0.6911 | lr: 9.30e-06
    335 [vit_b_16_clahe=True] Epoch  13/50 | train loss: 0.1738 | val loss: 0.4206 | macro F1: 0.4557 | weighted F1: 0.6754 | lr: 9.12e-06
    336 [vit_b_16_clahe=True] Epoch  14/50 | train loss: 0.1640 | val loss: 0.5151 | macro F1: 0.4403 | weighted F1: 0.5692 | lr: 8.92e-06
    337 [vit_b_16_clahe=True] Epoch  15/50 | train loss: 0.1422 | val loss: 0.4217 | macro F1: 0.4604 | weighted F1: 0.6939 | lr: 8.71e-06
    338 [vit_b_16_clahe=True] Epoch  16/50 | train loss: 0.1299 | val loss: 0.5239 | macro F1: 0.4394 | weighted F1: 0.5880 | lr: 8.48e-06
    339 [vit_b_16_clahe=True] Epoch  17/50 | train loss: 0.1205 | val loss: 0.4722 | macro F1: 0.4480 | weighted F1: 0.6693 | lr: 8.23e-06
    340 [vit_b_16_clahe=True] Epoch  18/50 | train loss: 0.1061 | val loss: 0.4824 | macro F1: 0.4514 | weighted F1: 0.6643 | lr: 7.97e-06
    341 [vit_b_16_clahe=True] Epoch  19/50 | train loss: 0.0960 | val loss: 0.4572 | macro F1: 0.4621 | weighted F1: 0.6980 | lr: 7.69e-06
    342 [vit_b_16_clahe=True] Epoch  20/50 | train loss: 0.0899 | val loss: 0.4783 | macro F1: 0.4621 | weighted F1: 0.6845 | lr: 7.40e-06
    343 [vit_b_16_clahe=True] Epoch  21/50 | train loss: 0.0842 | val loss: 0.5032 | macro F1: 0.4517 | weighted F1: 0.6685 | lr: 7.10e-06
    344 [vit_b_16_clahe=True] Epoch  22/50 | train loss: 0.0742 | val loss: 0.5754 | macro F1: 0.4630 | weighted F1: 0.6337 | lr: 6.80e-06
    345   Early stopping at epoch 22 (no improvement for 10 epochs).
    346   Training complete: 22 epochs, 3937.8s, best val macro F1: 0.4673
    347   Checkpoint saved: results/vit_b_16_clahe=True/best_model.pth
    348 
    349   Test results — Weighted F1: 0.6913 | Macro F1: 0.4777 | Accuracy: 0.6705 | Kappa: 0.5624
    350                       precision    recall  f1-score   support
    351 
    352          Healthy (0)       0.85      0.76      0.80      3872
    353        Mild NPDR (1)       0.13      0.22      0.16       366
    354    Moderate NPDR (2)       0.43      0.48      0.45       794
    355      Severe NPDR (3)       0.33      0.43      0.37       131
    356 Proliferative DR (4)       0.66      0.56      0.60       106
    357 
    358             accuracy                           0.67      5269
    359            macro avg       0.48      0.49      0.48      5269
    360         weighted avg       0.72      0.67      0.69      5269
    361 
    362 
    363 ======================================================================
    364 Model              CLAHE    W-F1   M-F1    Acc  Kappa  Time(s)  Epochs
    365 ----------------------------------------------------------------------
    366 resnet50           False  0.6570 0.4630 0.6111 0.5341   7514.0      50
    367 resnet50           True   0.6473 0.4426 0.6058 0.5234   7428.3      42
    368 efficientnet_b0    False  0.6544 0.4565 0.6092 0.5508   4417.0      30
    369 efficientnet_b0    True   0.6583 0.4510 0.6225 0.5388   5039.9      29
    370 vit_b_16           False  0.6913 0.4654 0.6800 0.5326   5571.3      37
    371 vit_b_16           True   0.6913 0.4777 0.6705 0.5624   3937.8      22
    372 ======================================================================
    373 
    374 Summary saved to results/summary.csv
    375 Comparison chart saved to results/comparison_chart.png