milkyroad commited on
Commit
b83ee78
·
verified ·
1 Parent(s): bc2b646

Upload folder using huggingface_hub (part 3)

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +7 -0
  2. stage1_final/results/resized/resnet/seg_resnet_fold3_val.json +261 -0
  3. stage1_final/results/resized/resnet/seg_resnet_fold4_val.json +231 -0
  4. stage1_final/results/resized/resnet/target3_resnet_cv_summary.json +374 -0
  5. stage1_final/results/resized/resnet/target3_resnet_final.json +4512 -0
  6. stage1_final/results/resized/resnet/target3_resnet_fold0_val.json +172 -0
  7. stage1_final/results/resized/resnet/target3_resnet_fold1_val.json +202 -0
  8. stage1_final/results/resized/resnet/target3_resnet_fold2_val.json +132 -0
  9. stage1_final/results/resized/resnet/target3_resnet_fold3_val.json +147 -0
  10. stage1_final/results/resized/resnet/target3_resnet_fold4_val.json +152 -0
  11. stage1_final/results/resized/swin/crt_swin_cv_summary.json +351 -0
  12. stage1_final/results/resized/swin/crt_swin_final.json +70 -0
  13. stage1_final/results/resized/swin/emit_crt_swin_oof.json +351 -0
  14. stage1_final/results/resized/swin/emit_crt_swin_test.json +70 -0
  15. stage1_final/results/resized/swin/emit_plain_swin_oof.json +352 -0
  16. stage1_final/results/resized/swin/emit_plain_swin_test.json +71 -0
  17. stage1_final/results/resized/swin/seg_swin_cv_summary.json +33 -0
  18. stage1_final/results/resized/swin/seg_swin_final.json +133 -0
  19. stage1_final/results/resized/swin/seg_swin_fold0_val.json +141 -0
  20. stage1_final/results/resized/swin/seg_swin_fold1_val.json +165 -0
  21. stage1_final/results/resized/swin/seg_swin_fold2_val.json +237 -0
  22. stage1_final/results/resized/swin/seg_swin_fold3_val.json +189 -0
  23. stage1_final/results/resized/swin/seg_swin_fold4_val.json +183 -0
  24. stage1_final/results/resized/swin/target3_swin_cv_summary.json +349 -0
  25. stage1_final/results/resized/swin/target3_swin_final.json +4517 -0
  26. stage1_final/results/resized/swin/target3_swin_fold0_val.json +112 -0
  27. stage1_final/results/resized/swin/target3_swin_fold1_val.json +147 -0
  28. stage1_final/results/resized/swin/target3_swin_fold2_val.json +142 -0
  29. stage1_final/results/resized/swin/target3_swin_fold3_val.json +162 -0
  30. stage1_final/results/resized/swin/target3_swin_fold4_val.json +112 -0
  31. stage1_final/train_cls.py +352 -0
  32. stage1_final/train_crt.py +347 -0
  33. stage1_final/train_seg.py +340 -0
  34. stage1_final/verify_all.py +566 -0
  35. stage1v2_final/check_progress.sh +21 -0
  36. stage1v2_final/dataset_f.py +202 -0
  37. stage1v2_final/dataset_f_squeeze.py +175 -0
  38. stage1v2_final/ensemble.py +295 -0
  39. stage1v2_final/f_reference_metrics.json +1336 -0
  40. stage1v2_final/gpu_wait.log +325 -0
  41. stage1v2_final/gpu_wait_and_run.sh +54 -0
  42. stage1v2_final/logits/letterbox/convnext/convnext_oof.npz +3 -0
  43. stage1v2_final/logits/letterbox/convnext/convnext_test.npz +3 -0
  44. stage1v2_final/logits/letterbox/convnext/plain_convnext_oof.npz +3 -0
  45. stage1v2_final/logits/letterbox/convnext/plain_convnext_test.npz +3 -0
  46. stage1v2_final/logits/letterbox/mamba/mamba_oof.npz +3 -0
  47. stage1v2_final/logits/letterbox/mamba/mamba_test.npz +3 -0
  48. stage1v2_final/logits/letterbox/mamba/plain_mamba_oof.npz +3 -0
  49. stage1v2_final/logits/letterbox/mamba/plain_mamba_test.npz +3 -0
  50. stage1v2_final/logits/letterbox/resnet/plain_resnet_oof.npz +3 -0
.gitattributes CHANGED
@@ -33,3 +33,10 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ stage2/MLLM_baseline/results/checkpoint_medgemma_27b_it_api_json.json filter=lfs diff=lfs merge=lfs -text
37
+ stage2/MLLM_baseline/results/results_gemma4_26b_a4b_nvfp4.json filter=lfs diff=lfs merge=lfs -text
38
+ stage2/MLLM_baseline/results/results_medgemma_27b_it_api.json filter=lfs diff=lfs merge=lfs -text
39
+ stage2/MLLM_baseline/sample_856.png filter=lfs diff=lfs merge=lfs -text
40
+ stage2/MLLM_baseline/sample_951.png filter=lfs diff=lfs merge=lfs -text
41
+ stage2/MLLM_expert/results/results_gemma4_26b_a4b_nvfp4_expert.json filter=lfs diff=lfs merge=lfs -text
42
+ stage2/MLLM_expert/results/results_gemma4_26b_debate_v2_trial.json filter=lfs diff=lfs merge=lfs -text
stage1_final/results/resized/resnet/seg_resnet_fold3_val.json ADDED
@@ -0,0 +1,261 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 3,
3
+ "metrics": {
4
+ "dice": 0.7222013572851816,
5
+ "iou": 0.580032487710317
6
+ },
7
+ "logs": [
8
+ {
9
+ "epoch": 0,
10
+ "train_loss": 0.6138421297073364,
11
+ "val_dice": 0.1943561447163423,
12
+ "val_iou": 0.13547549691672126
13
+ },
14
+ {
15
+ "epoch": 1,
16
+ "train_loss": 0.4611867715915044,
17
+ "val_dice": 0.4915980746348699,
18
+ "val_iou": 0.35104868064324063
19
+ },
20
+ {
21
+ "epoch": 2,
22
+ "train_loss": 0.3875955541928609,
23
+ "val_dice": 0.5247488568226496,
24
+ "val_iou": 0.3859521374106407
25
+ },
26
+ {
27
+ "epoch": 3,
28
+ "train_loss": 0.3460153142611186,
29
+ "val_dice": 0.6443256934483846,
30
+ "val_iou": 0.49631616473197937
31
+ },
32
+ {
33
+ "epoch": 4,
34
+ "train_loss": 0.30555541813373566,
35
+ "val_dice": 0.6433913509051005,
36
+ "val_iou": 0.4980693111817042
37
+ },
38
+ {
39
+ "epoch": 5,
40
+ "train_loss": 0.27872474243243534,
41
+ "val_dice": 0.666735033194224,
42
+ "val_iou": 0.5198122809330622
43
+ },
44
+ {
45
+ "epoch": 6,
46
+ "train_loss": 0.2527073497573535,
47
+ "val_dice": 0.6600219309329987,
48
+ "val_iou": 0.5157498965660731
49
+ },
50
+ {
51
+ "epoch": 7,
52
+ "train_loss": 0.24121235807736716,
53
+ "val_dice": 0.6940376063187917,
54
+ "val_iou": 0.546457419792811
55
+ },
56
+ {
57
+ "epoch": 8,
58
+ "train_loss": 0.2559986797471841,
59
+ "val_dice": 0.6985281407833099,
60
+ "val_iou": 0.5501155654589335
61
+ },
62
+ {
63
+ "epoch": 9,
64
+ "train_loss": 0.222637248535951,
65
+ "val_dice": 0.6989514728387197,
66
+ "val_iou": 0.5535771598418554
67
+ },
68
+ {
69
+ "epoch": 10,
70
+ "train_loss": 0.20273545136054358,
71
+ "val_dice": 0.6896438300609589,
72
+ "val_iou": 0.5430713991324106
73
+ },
74
+ {
75
+ "epoch": 11,
76
+ "train_loss": 0.19927928472558656,
77
+ "val_dice": 0.6999373634656271,
78
+ "val_iou": 0.5523287753264109
79
+ },
80
+ {
81
+ "epoch": 12,
82
+ "train_loss": 0.19412269443273544,
83
+ "val_dice": 0.7057852943738302,
84
+ "val_iou": 0.5589255591233572
85
+ },
86
+ {
87
+ "epoch": 13,
88
+ "train_loss": 0.20388895645737648,
89
+ "val_dice": 0.7165862222512563,
90
+ "val_iou": 0.5714631279309591
91
+ },
92
+ {
93
+ "epoch": 14,
94
+ "train_loss": 0.19036027416586876,
95
+ "val_dice": 0.6734209656715393,
96
+ "val_iou": 0.5242603818575541
97
+ },
98
+ {
99
+ "epoch": 15,
100
+ "train_loss": 0.1751129391292731,
101
+ "val_dice": 0.7183696230252584,
102
+ "val_iou": 0.5735695958137512
103
+ },
104
+ {
105
+ "epoch": 16,
106
+ "train_loss": 0.17120813205838203,
107
+ "val_dice": 0.7154511710007986,
108
+ "val_iou": 0.5700819492340088
109
+ },
110
+ {
111
+ "epoch": 17,
112
+ "train_loss": 0.1604445514579614,
113
+ "val_dice": 0.7024017373720804,
114
+ "val_iou": 0.5581655701001486
115
+ },
116
+ {
117
+ "epoch": 18,
118
+ "train_loss": 0.15446667869885763,
119
+ "val_dice": 0.7086004813512167,
120
+ "val_iou": 0.5647621154785156
121
+ },
122
+ {
123
+ "epoch": 19,
124
+ "train_loss": 0.15453882018725076,
125
+ "val_dice": 0.7170421183109283,
126
+ "val_iou": 0.5741201341152191
127
+ },
128
+ {
129
+ "epoch": 20,
130
+ "train_loss": 0.15354910617073378,
131
+ "val_dice": 0.7040923436482748,
132
+ "val_iou": 0.5604528784751892
133
+ },
134
+ {
135
+ "epoch": 21,
136
+ "train_loss": 0.13769513430694738,
137
+ "val_dice": 0.7161827186743418,
138
+ "val_iou": 0.5737987955411276
139
+ },
140
+ {
141
+ "epoch": 22,
142
+ "train_loss": 0.14193391924103102,
143
+ "val_dice": 0.7020967503388723,
144
+ "val_iou": 0.5577251513799032
145
+ },
146
+ {
147
+ "epoch": 23,
148
+ "train_loss": 0.14972687885165215,
149
+ "val_dice": 0.7158457736174265,
150
+ "val_iou": 0.5726696451505026
151
+ },
152
+ {
153
+ "epoch": 24,
154
+ "train_loss": 0.13911753023664156,
155
+ "val_dice": 0.7197486261526743,
156
+ "val_iou": 0.5781121154626211
157
+ },
158
+ {
159
+ "epoch": 25,
160
+ "train_loss": 0.13098876923322678,
161
+ "val_dice": 0.7117838561534882,
162
+ "val_iou": 0.5690360367298126
163
+ },
164
+ {
165
+ "epoch": 26,
166
+ "train_loss": 0.13466908037662506,
167
+ "val_dice": 0.7204330960909525,
168
+ "val_iou": 0.5784643093744913
169
+ },
170
+ {
171
+ "epoch": 27,
172
+ "train_loss": 0.12691590810815492,
173
+ "val_dice": 0.7112344602743784,
174
+ "val_iou": 0.5680197179317474
175
+ },
176
+ {
177
+ "epoch": 28,
178
+ "train_loss": 0.1287830757598082,
179
+ "val_dice": 0.7162580788135529,
180
+ "val_iou": 0.5735205312569936
181
+ },
182
+ {
183
+ "epoch": 29,
184
+ "train_loss": 0.12389301943282287,
185
+ "val_dice": 0.7219171524047852,
186
+ "val_iou": 0.5800592104593912
187
+ },
188
+ {
189
+ "epoch": 30,
190
+ "train_loss": 0.13415121845901012,
191
+ "val_dice": 0.7139295240243276,
192
+ "val_iou": 0.5703325172265371
193
+ },
194
+ {
195
+ "epoch": 31,
196
+ "train_loss": 0.12585854406158128,
197
+ "val_dice": 0.7222013572851816,
198
+ "val_iou": 0.580032487710317
199
+ },
200
+ {
201
+ "epoch": 32,
202
+ "train_loss": 0.12343788892030716,
203
+ "val_dice": 0.720237523317337,
204
+ "val_iou": 0.5778035720189413
205
+ },
206
+ {
207
+ "epoch": 33,
208
+ "train_loss": 0.11954182386398315,
209
+ "val_dice": 0.7064505318800608,
210
+ "val_iou": 0.562528133392334
211
+ },
212
+ {
213
+ "epoch": 34,
214
+ "train_loss": 0.11967955467601617,
215
+ "val_dice": 0.7162209153175354,
216
+ "val_iou": 0.573644757270813
217
+ },
218
+ {
219
+ "epoch": 35,
220
+ "train_loss": 0.11718433101971944,
221
+ "val_dice": 0.7062295575936636,
222
+ "val_iou": 0.5626954038937887
223
+ },
224
+ {
225
+ "epoch": 36,
226
+ "train_loss": 0.11980386823415756,
227
+ "val_dice": 0.7176325619220734,
228
+ "val_iou": 0.5755725900332133
229
+ },
230
+ {
231
+ "epoch": 37,
232
+ "train_loss": 0.11400729107360046,
233
+ "val_dice": 0.7148962418238322,
234
+ "val_iou": 0.5722392698129019
235
+ },
236
+ {
237
+ "epoch": 38,
238
+ "train_loss": 0.1147527943054835,
239
+ "val_dice": 0.7107170422871908,
240
+ "val_iou": 0.5681535005569458
241
+ },
242
+ {
243
+ "epoch": 39,
244
+ "train_loss": 0.12165401441355546,
245
+ "val_dice": 0.71102507909139,
246
+ "val_iou": 0.5684216618537903
247
+ },
248
+ {
249
+ "epoch": 40,
250
+ "train_loss": 0.1181034396092097,
251
+ "val_dice": 0.7152372002601624,
252
+ "val_iou": 0.5730333824952444
253
+ },
254
+ {
255
+ "epoch": 41,
256
+ "train_loss": 0.11934215575456619,
257
+ "val_dice": 0.7083025276660919,
258
+ "val_iou": 0.5651046335697174
259
+ }
260
+ ]
261
+ }
stage1_final/results/resized/resnet/seg_resnet_fold4_val.json ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 4,
3
+ "metrics": {
4
+ "dice": 0.6626530170440674,
5
+ "iou": 0.5249902665615082
6
+ },
7
+ "logs": [
8
+ {
9
+ "epoch": 0,
10
+ "train_loss": 0.6040730705628028,
11
+ "val_dice": 0.08611477240920067,
12
+ "val_iou": 0.05037770885974169
13
+ },
14
+ {
15
+ "epoch": 1,
16
+ "train_loss": 0.44077492218751174,
17
+ "val_dice": 0.343757626414299,
18
+ "val_iou": 0.23606418073177338
19
+ },
20
+ {
21
+ "epoch": 2,
22
+ "train_loss": 0.3635135017908536,
23
+ "val_dice": 0.5002379417419434,
24
+ "val_iou": 0.35592806339263916
25
+ },
26
+ {
27
+ "epoch": 3,
28
+ "train_loss": 0.31181351038125843,
29
+ "val_dice": 0.5272990465164185,
30
+ "val_iou": 0.37853812575340273
31
+ },
32
+ {
33
+ "epoch": 4,
34
+ "train_loss": 0.27802517780890834,
35
+ "val_dice": 0.5338006973266601,
36
+ "val_iou": 0.39327751994133
37
+ },
38
+ {
39
+ "epoch": 5,
40
+ "train_loss": 0.2662290334701538,
41
+ "val_dice": 0.5231241226196289,
42
+ "val_iou": 0.3868346750736237
43
+ },
44
+ {
45
+ "epoch": 6,
46
+ "train_loss": 0.24610144816912138,
47
+ "val_dice": 0.5733832120895386,
48
+ "val_iou": 0.4220519125461578
49
+ },
50
+ {
51
+ "epoch": 7,
52
+ "train_loss": 0.24438801063941076,
53
+ "val_dice": 0.5351975083351135,
54
+ "val_iou": 0.38684133887290956
55
+ },
56
+ {
57
+ "epoch": 8,
58
+ "train_loss": 0.24092424832857573,
59
+ "val_dice": 0.5678065180778503,
60
+ "val_iou": 0.4315794944763184
61
+ },
62
+ {
63
+ "epoch": 9,
64
+ "train_loss": 0.21222549562270826,
65
+ "val_dice": 0.6003095746040344,
66
+ "val_iou": 0.45297125577926634
67
+ },
68
+ {
69
+ "epoch": 10,
70
+ "train_loss": 0.19979401162037483,
71
+ "val_dice": 0.6091084241867065,
72
+ "val_iou": 0.46777879595756533
73
+ },
74
+ {
75
+ "epoch": 11,
76
+ "train_loss": 0.1895719480056029,
77
+ "val_dice": 0.6199497103691101,
78
+ "val_iou": 0.4802316606044769
79
+ },
80
+ {
81
+ "epoch": 12,
82
+ "train_loss": 0.1758307390488111,
83
+ "val_dice": 0.6362187981605529,
84
+ "val_iou": 0.49515390396118164
85
+ },
86
+ {
87
+ "epoch": 13,
88
+ "train_loss": 0.18556680129124567,
89
+ "val_dice": 0.6331044793128967,
90
+ "val_iou": 0.4869541168212891
91
+ },
92
+ {
93
+ "epoch": 14,
94
+ "train_loss": 0.1789223551750183,
95
+ "val_dice": 0.6223224997520447,
96
+ "val_iou": 0.4894650101661682
97
+ },
98
+ {
99
+ "epoch": 15,
100
+ "train_loss": 0.16978265688969538,
101
+ "val_dice": 0.6207321286201477,
102
+ "val_iou": 0.48570563793182375
103
+ },
104
+ {
105
+ "epoch": 16,
106
+ "train_loss": 0.16802145426089948,
107
+ "val_dice": 0.6523342132568359,
108
+ "val_iou": 0.5095111727714539
109
+ },
110
+ {
111
+ "epoch": 17,
112
+ "train_loss": 0.1564413899412522,
113
+ "val_dice": 0.6516639590263367,
114
+ "val_iou": 0.5107141315937043
115
+ },
116
+ {
117
+ "epoch": 18,
118
+ "train_loss": 0.16280463739083365,
119
+ "val_dice": 0.6303826212882996,
120
+ "val_iou": 0.4970108330249786
121
+ },
122
+ {
123
+ "epoch": 19,
124
+ "train_loss": 0.1626661362556311,
125
+ "val_dice": 0.6222506403923035,
126
+ "val_iou": 0.49072423577308655
127
+ },
128
+ {
129
+ "epoch": 20,
130
+ "train_loss": 0.15174455768786943,
131
+ "val_dice": 0.6480942249298096,
132
+ "val_iou": 0.5121436834335327
133
+ },
134
+ {
135
+ "epoch": 21,
136
+ "train_loss": 0.14207227528095245,
137
+ "val_dice": 0.6539187073707581,
138
+ "val_iou": 0.5164022505283355
139
+ },
140
+ {
141
+ "epoch": 22,
142
+ "train_loss": 0.14468535838218835,
143
+ "val_dice": 0.6540932655334473,
144
+ "val_iou": 0.5188485503196716
145
+ },
146
+ {
147
+ "epoch": 23,
148
+ "train_loss": 0.13115018606185913,
149
+ "val_dice": 0.6478811740875244,
150
+ "val_iou": 0.5138100147247314
151
+ },
152
+ {
153
+ "epoch": 24,
154
+ "train_loss": 0.14252719626976892,
155
+ "val_dice": 0.6458236694335937,
156
+ "val_iou": 0.5129028975963592
157
+ },
158
+ {
159
+ "epoch": 25,
160
+ "train_loss": 0.12749625169313872,
161
+ "val_dice": 0.6526506900787353,
162
+ "val_iou": 0.517010623216629
163
+ },
164
+ {
165
+ "epoch": 26,
166
+ "train_loss": 0.1366780583675091,
167
+ "val_dice": 0.6626530170440674,
168
+ "val_iou": 0.5249902665615082
169
+ },
170
+ {
171
+ "epoch": 27,
172
+ "train_loss": 0.12716724150455916,
173
+ "val_dice": 0.6465119838714599,
174
+ "val_iou": 0.5124463438987732
175
+ },
176
+ {
177
+ "epoch": 28,
178
+ "train_loss": 0.1254961255651254,
179
+ "val_dice": 0.6618073105812072,
180
+ "val_iou": 0.5281198024749756
181
+ },
182
+ {
183
+ "epoch": 29,
184
+ "train_loss": 0.12263606488704681,
185
+ "val_dice": 0.643485939502716,
186
+ "val_iou": 0.5121323466300964
187
+ },
188
+ {
189
+ "epoch": 30,
190
+ "train_loss": 0.13843052375775117,
191
+ "val_dice": 0.6488198280334473,
192
+ "val_iou": 0.517106431722641
193
+ },
194
+ {
195
+ "epoch": 31,
196
+ "train_loss": 0.12184500006529,
197
+ "val_dice": 0.6512809157371521,
198
+ "val_iou": 0.5181406140327454
199
+ },
200
+ {
201
+ "epoch": 32,
202
+ "train_loss": 0.12715217471122742,
203
+ "val_dice": 0.6488866090774537,
204
+ "val_iou": 0.5170250177383423
205
+ },
206
+ {
207
+ "epoch": 33,
208
+ "train_loss": 0.12302361772610591,
209
+ "val_dice": 0.6596784234046936,
210
+ "val_iou": 0.5265290856361389
211
+ },
212
+ {
213
+ "epoch": 34,
214
+ "train_loss": 0.12177298046075381,
215
+ "val_dice": 0.6553865790367126,
216
+ "val_iou": 0.5238692283630371
217
+ },
218
+ {
219
+ "epoch": 35,
220
+ "train_loss": 0.12020318783246554,
221
+ "val_dice": 0.6599848985671997,
222
+ "val_iou": 0.5274998307228088
223
+ },
224
+ {
225
+ "epoch": 36,
226
+ "train_loss": 0.11910688475920604,
227
+ "val_dice": 0.6577977538108826,
228
+ "val_iou": 0.526485550403595
229
+ }
230
+ ]
231
+ }
stage1_final/results/resized/resnet/target3_resnet_cv_summary.json ADDED
@@ -0,0 +1,374 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "resnet",
3
+ "folds": [
4
+ {
5
+ "fold": 0,
6
+ "macro_f1": 0.7669097256604953,
7
+ "accuracy": 0.9596613545816733,
8
+ "balanced_acc": 0.7458459304900263,
9
+ "per_class_recall": {
10
+ "malignant": 0.9671052631578947,
11
+ "non_malignant": 0.2857142857142857,
12
+ "non_roi": 0.9847182425978988
13
+ },
14
+ "per_class_precision": {
15
+ "malignant": 0.9545454545454546,
16
+ "non_malignant": 0.4827586206896552,
17
+ "non_roi": 0.9772511848341232
18
+ },
19
+ "confusion_matrix": [
20
+ [
21
+ 882,
22
+ 10,
23
+ 20
24
+ ],
25
+ [
26
+ 31,
27
+ 14,
28
+ 4
29
+ ],
30
+ [
31
+ 11,
32
+ 5,
33
+ 1031
34
+ ]
35
+ ],
36
+ "classification_report": {
37
+ "malignant": {
38
+ "precision": 0.9545454545454546,
39
+ "recall": 0.9671052631578947,
40
+ "f1-score": 0.9607843137254902,
41
+ "support": 912.0
42
+ },
43
+ "non_malignant": {
44
+ "precision": 0.4827586206896552,
45
+ "recall": 0.2857142857142857,
46
+ "f1-score": 0.358974358974359,
47
+ "support": 49.0
48
+ },
49
+ "non_roi": {
50
+ "precision": 0.9772511848341232,
51
+ "recall": 0.9847182425978988,
52
+ "f1-score": 0.9809705042816366,
53
+ "support": 1047.0
54
+ },
55
+ "accuracy": 0.9596613545816733,
56
+ "macro avg": {
57
+ "precision": 0.8048517533564109,
58
+ "recall": 0.7458459304900263,
59
+ "f1-score": 0.7669097256604953,
60
+ "support": 2008.0
61
+ },
62
+ "weighted avg": {
63
+ "precision": 0.9548718214544695,
64
+ "recall": 0.9596613545816733,
65
+ "f1-score": 0.9566240815190559,
66
+ "support": 2008.0
67
+ }
68
+ },
69
+ "n": 2008,
70
+ "src_B_acc": 0.9880597014925373,
71
+ "src_B_n": 670,
72
+ "src_C_acc": 0.9435351882160393,
73
+ "src_C_n": 1222,
74
+ "src_D_acc": 0.9655172413793104,
75
+ "src_D_n": 116
76
+ },
77
+ {
78
+ "fold": 1,
79
+ "macro_f1": 0.7695141113129838,
80
+ "accuracy": 0.8963807635101636,
81
+ "balanced_acc": 0.7773867132285691,
82
+ "per_class_recall": {
83
+ "malignant": 0.9078947368421053,
84
+ "non_malignant": 0.52,
85
+ "non_roi": 0.9042654028436019
86
+ },
87
+ "per_class_precision": {
88
+ "malignant": 0.891280947255113,
89
+ "non_malignant": 0.4727272727272727,
90
+ "non_roi": 0.9235237173281704
91
+ },
92
+ "confusion_matrix": [
93
+ [
94
+ 828,
95
+ 13,
96
+ 71
97
+ ],
98
+ [
99
+ 16,
100
+ 26,
101
+ 8
102
+ ],
103
+ [
104
+ 85,
105
+ 16,
106
+ 954
107
+ ]
108
+ ],
109
+ "classification_report": {
110
+ "malignant": {
111
+ "precision": 0.891280947255113,
112
+ "recall": 0.9078947368421053,
113
+ "f1-score": 0.8995111352525801,
114
+ "support": 912.0
115
+ },
116
+ "non_malignant": {
117
+ "precision": 0.4727272727272727,
118
+ "recall": 0.52,
119
+ "f1-score": 0.49523809523809526,
120
+ "support": 50.0
121
+ },
122
+ "non_roi": {
123
+ "precision": 0.9235237173281704,
124
+ "recall": 0.9042654028436019,
125
+ "f1-score": 0.9137931034482759,
126
+ "support": 1055.0
127
+ },
128
+ "accuracy": 0.8963807635101636,
129
+ "macro avg": {
130
+ "precision": 0.7625106457701855,
131
+ "recall": 0.7773867132285691,
132
+ "f1-score": 0.7695141113129838,
133
+ "support": 2017.0
134
+ },
135
+ "weighted avg": {
136
+ "precision": 0.8977700095757296,
137
+ "recall": 0.8963807635101636,
138
+ "f1-score": 0.8969597343828404,
139
+ "support": 2017.0
140
+ }
141
+ },
142
+ "n": 2017,
143
+ "src_B_acc": 0.9024725274725275,
144
+ "src_B_n": 728,
145
+ "src_C_acc": 0.9,
146
+ "src_C_n": 1090,
147
+ "src_D_acc": 0.8542713567839196,
148
+ "src_D_n": 199
149
+ },
150
+ {
151
+ "fold": 2,
152
+ "macro_f1": 0.6957840963889788,
153
+ "accuracy": 0.9300804828973843,
154
+ "balanced_acc": 0.6805923645530574,
155
+ "per_class_recall": {
156
+ "malignant": 0.9407894736842105,
157
+ "non_malignant": 0.14285714285714285,
158
+ "non_roi": 0.9581304771178188
159
+ },
160
+ "per_class_precision": {
161
+ "malignant": 0.9186295503211992,
162
+ "non_malignant": 0.35,
163
+ "non_roi": 0.9516441005802708
164
+ },
165
+ "confusion_matrix": [
166
+ [
167
+ 858,
168
+ 13,
169
+ 41
170
+ ],
171
+ [
172
+ 33,
173
+ 7,
174
+ 9
175
+ ],
176
+ [
177
+ 43,
178
+ 0,
179
+ 984
180
+ ]
181
+ ],
182
+ "classification_report": {
183
+ "malignant": {
184
+ "precision": 0.9186295503211992,
185
+ "recall": 0.9407894736842105,
186
+ "f1-score": 0.9295774647887324,
187
+ "support": 912.0
188
+ },
189
+ "non_malignant": {
190
+ "precision": 0.35,
191
+ "recall": 0.14285714285714285,
192
+ "f1-score": 0.2028985507246377,
193
+ "support": 49.0
194
+ },
195
+ "non_roi": {
196
+ "precision": 0.9516441005802708,
197
+ "recall": 0.9581304771178188,
198
+ "f1-score": 0.9548762736535662,
199
+ "support": 1027.0
200
+ },
201
+ "accuracy": 0.9300804828973843,
202
+ "macro avg": {
203
+ "precision": 0.7400912169671566,
204
+ "recall": 0.6805923645530574,
205
+ "f1-score": 0.6957840963889788,
206
+ "support": 1988.0
207
+ },
208
+ "weighted avg": {
209
+ "precision": 0.9216693366141206,
210
+ "recall": 0.9300804828973843,
211
+ "f1-score": 0.9247357192731607,
212
+ "support": 1988.0
213
+ }
214
+ },
215
+ "n": 1988,
216
+ "src_B_acc": 0.9372496662216289,
217
+ "src_B_n": 749,
218
+ "src_C_acc": 0.9491525423728814,
219
+ "src_C_n": 1062,
220
+ "src_D_acc": 0.7853107344632768,
221
+ "src_D_n": 177
222
+ },
223
+ {
224
+ "fold": 3,
225
+ "macro_f1": 0.7079227203005706,
226
+ "accuracy": 0.8948905109489051,
227
+ "balanced_acc": 0.7567419728865512,
228
+ "per_class_recall": {
229
+ "malignant": 0.8981380065717415,
230
+ "non_malignant": 0.46,
231
+ "non_roi": 0.9120879120879121
232
+ },
233
+ "per_class_precision": {
234
+ "malignant": 0.9244644870349493,
235
+ "non_malignant": 0.2072072072072072,
236
+ "non_roi": 0.9422894985808893
237
+ },
238
+ "confusion_matrix": [
239
+ [
240
+ 820,
241
+ 36,
242
+ 57
243
+ ],
244
+ [
245
+ 23,
246
+ 23,
247
+ 4
248
+ ],
249
+ [
250
+ 44,
251
+ 52,
252
+ 996
253
+ ]
254
+ ],
255
+ "classification_report": {
256
+ "malignant": {
257
+ "precision": 0.9244644870349493,
258
+ "recall": 0.8981380065717415,
259
+ "f1-score": 0.9111111111111111,
260
+ "support": 913.0
261
+ },
262
+ "non_malignant": {
263
+ "precision": 0.2072072072072072,
264
+ "recall": 0.46,
265
+ "f1-score": 0.2857142857142857,
266
+ "support": 50.0
267
+ },
268
+ "non_roi": {
269
+ "precision": 0.9422894985808893,
270
+ "recall": 0.9120879120879121,
271
+ "f1-score": 0.9269427640763146,
272
+ "support": 1092.0
273
+ },
274
+ "accuracy": 0.8948905109489051,
275
+ "macro avg": {
276
+ "precision": 0.6913203976076819,
277
+ "recall": 0.7567419728865512,
278
+ "f1-score": 0.7079227203005706,
279
+ "support": 2055.0
280
+ },
281
+ "weighted avg": {
282
+ "precision": 0.9164849486489539,
283
+ "recall": 0.8948905109489051,
284
+ "f1-score": 0.9043073757184887,
285
+ "support": 2055.0
286
+ }
287
+ },
288
+ "n": 2055,
289
+ "src_B_acc": 0.9451327433628318,
290
+ "src_B_n": 565,
291
+ "src_C_acc": 0.8691507798960139,
292
+ "src_C_n": 1154,
293
+ "src_D_acc": 0.8988095238095238,
294
+ "src_D_n": 336
295
+ },
296
+ {
297
+ "fold": 4,
298
+ "macro_f1": 0.6687781793339193,
299
+ "accuracy": 0.9109554777388694,
300
+ "balanced_acc": 0.6718610005393971,
301
+ "per_class_recall": {
302
+ "malignant": 0.9079956188389924,
303
+ "non_malignant": 0.1568627450980392,
304
+ "non_roi": 0.9507246376811594
305
+ },
306
+ "per_class_precision": {
307
+ "malignant": 0.911991199119912,
308
+ "non_malignant": 0.13114754098360656,
309
+ "non_roi": 0.956268221574344
310
+ },
311
+ "confusion_matrix": [
312
+ [
313
+ 829,
314
+ 43,
315
+ 41
316
+ ],
317
+ [
318
+ 39,
319
+ 8,
320
+ 4
321
+ ],
322
+ [
323
+ 41,
324
+ 10,
325
+ 984
326
+ ]
327
+ ],
328
+ "classification_report": {
329
+ "malignant": {
330
+ "precision": 0.911991199119912,
331
+ "recall": 0.9079956188389924,
332
+ "f1-score": 0.9099890230515917,
333
+ "support": 913.0
334
+ },
335
+ "non_malignant": {
336
+ "precision": 0.13114754098360656,
337
+ "recall": 0.1568627450980392,
338
+ "f1-score": 0.14285714285714285,
339
+ "support": 51.0
340
+ },
341
+ "non_roi": {
342
+ "precision": 0.956268221574344,
343
+ "recall": 0.9507246376811594,
344
+ "f1-score": 0.9534883720930233,
345
+ "support": 1035.0
346
+ },
347
+ "accuracy": 0.9109554777388694,
348
+ "macro avg": {
349
+ "precision": 0.6664689872259543,
350
+ "recall": 0.6718610005393971,
351
+ "f1-score": 0.6687781793339193,
352
+ "support": 1999.0
353
+ },
354
+ "weighted avg": {
355
+ "precision": 0.9149945466313606,
356
+ "recall": 0.9109554777388694,
357
+ "f1-score": 0.9129395484982974,
358
+ "support": 1999.0
359
+ }
360
+ },
361
+ "n": 1999,
362
+ "src_B_acc": 0.9550724637681159,
363
+ "src_B_n": 690,
364
+ "src_C_acc": 0.9076376554174067,
365
+ "src_C_n": 1126,
366
+ "src_D_acc": 0.7650273224043715,
367
+ "src_D_n": 183
368
+ }
369
+ ],
370
+ "cv_macro_f1_mean": 0.7217817665993895,
371
+ "cv_macro_f1_std": 0.03998059955670659,
372
+ "cv_non_malignant_recall_mean": 0.3130868347338936,
373
+ "cv_non_malignant_recall_std": 0.15396746845212542
374
+ }
stage1_final/results/resized/resnet/target3_resnet_final.json ADDED
@@ -0,0 +1,4512 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "resnet",
3
+ "val_metrics": {
4
+ "macro_f1": 0.7193665327851014,
5
+ "accuracy": 0.9100602688919796,
6
+ "balanced_acc": 0.7049432611014911,
7
+ "per_class_recall": {
8
+ "malignant": 0.9117948717948718,
9
+ "non_malignant": 0.2641509433962264,
10
+ "non_roi": 0.9388839681133747
11
+ },
12
+ "per_class_precision": {
13
+ "malignant": 0.908997955010225,
14
+ "non_malignant": 0.3888888888888889,
15
+ "non_roi": 0.9273840769903762
16
+ },
17
+ "confusion_matrix": [
18
+ [
19
+ 889,
20
+ 21,
21
+ 65
22
+ ],
23
+ [
24
+ 21,
25
+ 14,
26
+ 18
27
+ ],
28
+ [
29
+ 68,
30
+ 1,
31
+ 1060
32
+ ]
33
+ ],
34
+ "classification_report": {
35
+ "malignant": {
36
+ "precision": 0.908997955010225,
37
+ "recall": 0.9117948717948718,
38
+ "f1-score": 0.910394265232975,
39
+ "support": 975.0
40
+ },
41
+ "non_malignant": {
42
+ "precision": 0.3888888888888889,
43
+ "recall": 0.2641509433962264,
44
+ "f1-score": 0.3146067415730337,
45
+ "support": 53.0
46
+ },
47
+ "non_roi": {
48
+ "precision": 0.9273840769903762,
49
+ "recall": 0.9388839681133747,
50
+ "f1-score": 0.9330985915492958,
51
+ "support": 1129.0
52
+ },
53
+ "accuracy": 0.9100602688919796,
54
+ "macro avg": {
55
+ "precision": 0.7417569736298301,
56
+ "recall": 0.7049432611014911,
57
+ "f1-score": 0.7193665327851014,
58
+ "support": 2157.0
59
+ },
60
+ "weighted avg": {
61
+ "precision": 0.9058417896004707,
62
+ "recall": 0.9100602688919796,
63
+ "f1-score": 0.9076387926586353,
64
+ "support": 2157.0
65
+ }
66
+ },
67
+ "n": 2157,
68
+ "src_B_acc": 0.9776286353467561,
69
+ "src_B_n": 447,
70
+ "src_C_acc": 0.8725490196078431,
71
+ "src_C_n": 1224,
72
+ "src_D_acc": 0.9423868312757202,
73
+ "src_D_n": 486
74
+ },
75
+ "test_metrics": {
76
+ "macro_f1": 0.7119245671187143,
77
+ "accuracy": 0.9395910780669146,
78
+ "balanced_acc": 0.6959589116293166,
79
+ "per_class_recall": {
80
+ "malignant": 0.9591002044989775,
81
+ "non_malignant": 0.16981132075471697,
82
+ "non_roi": 0.9589652096342551
83
+ },
84
+ "per_class_precision": {
85
+ "malignant": 0.9408224674022067,
86
+ "non_malignant": 0.36,
87
+ "non_roi": 0.9513274336283186
88
+ },
89
+ "confusion_matrix": [
90
+ [
91
+ 938,
92
+ 12,
93
+ 28
94
+ ],
95
+ [
96
+ 17,
97
+ 9,
98
+ 27
99
+ ],
100
+ [
101
+ 42,
102
+ 4,
103
+ 1075
104
+ ]
105
+ ],
106
+ "classification_report": {
107
+ "malignant": {
108
+ "precision": 0.9408224674022067,
109
+ "recall": 0.9591002044989775,
110
+ "f1-score": 0.949873417721519,
111
+ "support": 978.0
112
+ },
113
+ "non_malignant": {
114
+ "precision": 0.36,
115
+ "recall": 0.16981132075471697,
116
+ "f1-score": 0.23076923076923078,
117
+ "support": 53.0
118
+ },
119
+ "non_roi": {
120
+ "precision": 0.9513274336283186,
121
+ "recall": 0.9589652096342551,
122
+ "f1-score": 0.9551310528653931,
123
+ "support": 1121.0
124
+ },
125
+ "accuracy": 0.9395910780669146,
126
+ "macro avg": {
127
+ "precision": 0.7507166336768417,
128
+ "recall": 0.6959589116293166,
129
+ "f1-score": 0.7119245671187143,
130
+ "support": 2152.0
131
+ },
132
+ "weighted avg": {
133
+ "precision": 0.9319899750077618,
134
+ "recall": 0.9395910780669146,
135
+ "f1-score": 0.934901896851543,
136
+ "support": 2152.0
137
+ }
138
+ },
139
+ "n": 2152,
140
+ "src_B_acc": 0.9773371104815864,
141
+ "src_B_n": 706,
142
+ "src_C_acc": 0.9276703111858705,
143
+ "src_C_n": 1189,
144
+ "src_D_acc": 0.8910505836575876,
145
+ "src_D_n": 257
146
+ },
147
+ "test_predictions": [
148
+ 0,
149
+ 0,
150
+ 0,
151
+ 0,
152
+ 0,
153
+ 0,
154
+ 0,
155
+ 0,
156
+ 0,
157
+ 0,
158
+ 0,
159
+ 0,
160
+ 0,
161
+ 0,
162
+ 0,
163
+ 0,
164
+ 0,
165
+ 0,
166
+ 0,
167
+ 0,
168
+ 0,
169
+ 0,
170
+ 0,
171
+ 0,
172
+ 0,
173
+ 0,
174
+ 0,
175
+ 0,
176
+ 0,
177
+ 0,
178
+ 0,
179
+ 0,
180
+ 0,
181
+ 0,
182
+ 0,
183
+ 0,
184
+ 0,
185
+ 0,
186
+ 0,
187
+ 0,
188
+ 0,
189
+ 0,
190
+ 0,
191
+ 0,
192
+ 0,
193
+ 0,
194
+ 0,
195
+ 0,
196
+ 0,
197
+ 0,
198
+ 0,
199
+ 0,
200
+ 0,
201
+ 0,
202
+ 0,
203
+ 0,
204
+ 0,
205
+ 0,
206
+ 0,
207
+ 0,
208
+ 0,
209
+ 0,
210
+ 0,
211
+ 0,
212
+ 0,
213
+ 0,
214
+ 0,
215
+ 0,
216
+ 0,
217
+ 0,
218
+ 0,
219
+ 0,
220
+ 0,
221
+ 0,
222
+ 0,
223
+ 2,
224
+ 2,
225
+ 2,
226
+ 2,
227
+ 0,
228
+ 2,
229
+ 0,
230
+ 0,
231
+ 0,
232
+ 0,
233
+ 0,
234
+ 0,
235
+ 0,
236
+ 0,
237
+ 0,
238
+ 0,
239
+ 0,
240
+ 0,
241
+ 0,
242
+ 0,
243
+ 0,
244
+ 0,
245
+ 0,
246
+ 0,
247
+ 0,
248
+ 0,
249
+ 0,
250
+ 0,
251
+ 0,
252
+ 0,
253
+ 0,
254
+ 2,
255
+ 0,
256
+ 0,
257
+ 0,
258
+ 0,
259
+ 0,
260
+ 0,
261
+ 0,
262
+ 0,
263
+ 0,
264
+ 0,
265
+ 0,
266
+ 0,
267
+ 0,
268
+ 0,
269
+ 0,
270
+ 0,
271
+ 0,
272
+ 0,
273
+ 0,
274
+ 0,
275
+ 2,
276
+ 2,
277
+ 0,
278
+ 0,
279
+ 0,
280
+ 0,
281
+ 0,
282
+ 0,
283
+ 0,
284
+ 2,
285
+ 2,
286
+ 2,
287
+ 2,
288
+ 2,
289
+ 2,
290
+ 2,
291
+ 0,
292
+ 2,
293
+ 2,
294
+ 2,
295
+ 2,
296
+ 2,
297
+ 2,
298
+ 2,
299
+ 2,
300
+ 2,
301
+ 2,
302
+ 2,
303
+ 2,
304
+ 2,
305
+ 2,
306
+ 2,
307
+ 2,
308
+ 2,
309
+ 2,
310
+ 2,
311
+ 2,
312
+ 2,
313
+ 2,
314
+ 2,
315
+ 2,
316
+ 2,
317
+ 2,
318
+ 2,
319
+ 2,
320
+ 2,
321
+ 2,
322
+ 2,
323
+ 2,
324
+ 2,
325
+ 2,
326
+ 2,
327
+ 2,
328
+ 2,
329
+ 2,
330
+ 2,
331
+ 2,
332
+ 2,
333
+ 2,
334
+ 2,
335
+ 2,
336
+ 2,
337
+ 2,
338
+ 2,
339
+ 2,
340
+ 2,
341
+ 2,
342
+ 2,
343
+ 2,
344
+ 2,
345
+ 2,
346
+ 2,
347
+ 2,
348
+ 2,
349
+ 2,
350
+ 2,
351
+ 2,
352
+ 2,
353
+ 2,
354
+ 2,
355
+ 2,
356
+ 2,
357
+ 2,
358
+ 2,
359
+ 2,
360
+ 2,
361
+ 2,
362
+ 2,
363
+ 2,
364
+ 2,
365
+ 2,
366
+ 2,
367
+ 0,
368
+ 2,
369
+ 0,
370
+ 0,
371
+ 0,
372
+ 0,
373
+ 2,
374
+ 2,
375
+ 2,
376
+ 2,
377
+ 2,
378
+ 2,
379
+ 2,
380
+ 2,
381
+ 2,
382
+ 0,
383
+ 2,
384
+ 0,
385
+ 0,
386
+ 0,
387
+ 2,
388
+ 0,
389
+ 2,
390
+ 2,
391
+ 2,
392
+ 2,
393
+ 2,
394
+ 2,
395
+ 2,
396
+ 2,
397
+ 2,
398
+ 2,
399
+ 2,
400
+ 2,
401
+ 2,
402
+ 2,
403
+ 2,
404
+ 2,
405
+ 2,
406
+ 2,
407
+ 2,
408
+ 2,
409
+ 2,
410
+ 2,
411
+ 2,
412
+ 2,
413
+ 2,
414
+ 2,
415
+ 2,
416
+ 2,
417
+ 2,
418
+ 2,
419
+ 2,
420
+ 2,
421
+ 2,
422
+ 2,
423
+ 0,
424
+ 2,
425
+ 2,
426
+ 0,
427
+ 2,
428
+ 2,
429
+ 2,
430
+ 0,
431
+ 2,
432
+ 2,
433
+ 2,
434
+ 2,
435
+ 2,
436
+ 2,
437
+ 2,
438
+ 2,
439
+ 2,
440
+ 2,
441
+ 2,
442
+ 2,
443
+ 2,
444
+ 2,
445
+ 2,
446
+ 2,
447
+ 2,
448
+ 2,
449
+ 2,
450
+ 2,
451
+ 2,
452
+ 2,
453
+ 2,
454
+ 2,
455
+ 2,
456
+ 2,
457
+ 2,
458
+ 2,
459
+ 2,
460
+ 2,
461
+ 2,
462
+ 2,
463
+ 2,
464
+ 2,
465
+ 2,
466
+ 2,
467
+ 2,
468
+ 2,
469
+ 2,
470
+ 2,
471
+ 2,
472
+ 2,
473
+ 2,
474
+ 2,
475
+ 2,
476
+ 2,
477
+ 2,
478
+ 2,
479
+ 2,
480
+ 2,
481
+ 2,
482
+ 2,
483
+ 2,
484
+ 2,
485
+ 2,
486
+ 2,
487
+ 2,
488
+ 2,
489
+ 2,
490
+ 2,
491
+ 2,
492
+ 2,
493
+ 2,
494
+ 2,
495
+ 2,
496
+ 2,
497
+ 2,
498
+ 2,
499
+ 2,
500
+ 2,
501
+ 2,
502
+ 2,
503
+ 2,
504
+ 2,
505
+ 2,
506
+ 2,
507
+ 2,
508
+ 2,
509
+ 2,
510
+ 2,
511
+ 2,
512
+ 2,
513
+ 2,
514
+ 2,
515
+ 2,
516
+ 2,
517
+ 2,
518
+ 2,
519
+ 2,
520
+ 2,
521
+ 2,
522
+ 2,
523
+ 2,
524
+ 2,
525
+ 2,
526
+ 2,
527
+ 2,
528
+ 2,
529
+ 2,
530
+ 2,
531
+ 2,
532
+ 2,
533
+ 2,
534
+ 2,
535
+ 2,
536
+ 2,
537
+ 2,
538
+ 0,
539
+ 2,
540
+ 0,
541
+ 2,
542
+ 0,
543
+ 2,
544
+ 2,
545
+ 0,
546
+ 0,
547
+ 2,
548
+ 2,
549
+ 2,
550
+ 0,
551
+ 2,
552
+ 2,
553
+ 0,
554
+ 0,
555
+ 2,
556
+ 2,
557
+ 2,
558
+ 2,
559
+ 2,
560
+ 2,
561
+ 2,
562
+ 2,
563
+ 2,
564
+ 2,
565
+ 2,
566
+ 2,
567
+ 2,
568
+ 2,
569
+ 2,
570
+ 2,
571
+ 2,
572
+ 2,
573
+ 2,
574
+ 2,
575
+ 2,
576
+ 2,
577
+ 2,
578
+ 2,
579
+ 2,
580
+ 2,
581
+ 2,
582
+ 2,
583
+ 2,
584
+ 2,
585
+ 2,
586
+ 2,
587
+ 2,
588
+ 2,
589
+ 2,
590
+ 2,
591
+ 2,
592
+ 2,
593
+ 2,
594
+ 2,
595
+ 2,
596
+ 2,
597
+ 2,
598
+ 2,
599
+ 2,
600
+ 2,
601
+ 0,
602
+ 2,
603
+ 2,
604
+ 2,
605
+ 2,
606
+ 2,
607
+ 2,
608
+ 2,
609
+ 2,
610
+ 2,
611
+ 2,
612
+ 2,
613
+ 2,
614
+ 2,
615
+ 2,
616
+ 2,
617
+ 2,
618
+ 2,
619
+ 2,
620
+ 2,
621
+ 2,
622
+ 2,
623
+ 2,
624
+ 2,
625
+ 2,
626
+ 2,
627
+ 2,
628
+ 2,
629
+ 2,
630
+ 2,
631
+ 2,
632
+ 2,
633
+ 2,
634
+ 2,
635
+ 2,
636
+ 2,
637
+ 2,
638
+ 2,
639
+ 0,
640
+ 2,
641
+ 2,
642
+ 2,
643
+ 0,
644
+ 2,
645
+ 2,
646
+ 2,
647
+ 2,
648
+ 2,
649
+ 2,
650
+ 2,
651
+ 2,
652
+ 2,
653
+ 2,
654
+ 2,
655
+ 2,
656
+ 2,
657
+ 2,
658
+ 2,
659
+ 2,
660
+ 2,
661
+ 2,
662
+ 2,
663
+ 2,
664
+ 2,
665
+ 2,
666
+ 2,
667
+ 2,
668
+ 2,
669
+ 2,
670
+ 2,
671
+ 2,
672
+ 2,
673
+ 2,
674
+ 2,
675
+ 2,
676
+ 2,
677
+ 2,
678
+ 2,
679
+ 2,
680
+ 2,
681
+ 2,
682
+ 2,
683
+ 2,
684
+ 2,
685
+ 2,
686
+ 2,
687
+ 2,
688
+ 2,
689
+ 2,
690
+ 2,
691
+ 2,
692
+ 2,
693
+ 2,
694
+ 2,
695
+ 2,
696
+ 2,
697
+ 2,
698
+ 2,
699
+ 2,
700
+ 2,
701
+ 2,
702
+ 2,
703
+ 2,
704
+ 2,
705
+ 2,
706
+ 2,
707
+ 2,
708
+ 2,
709
+ 2,
710
+ 2,
711
+ 2,
712
+ 2,
713
+ 2,
714
+ 2,
715
+ 2,
716
+ 2,
717
+ 2,
718
+ 2,
719
+ 2,
720
+ 2,
721
+ 2,
722
+ 2,
723
+ 2,
724
+ 2,
725
+ 2,
726
+ 2,
727
+ 2,
728
+ 2,
729
+ 2,
730
+ 2,
731
+ 2,
732
+ 2,
733
+ 2,
734
+ 2,
735
+ 2,
736
+ 2,
737
+ 2,
738
+ 2,
739
+ 2,
740
+ 2,
741
+ 2,
742
+ 2,
743
+ 2,
744
+ 2,
745
+ 2,
746
+ 2,
747
+ 2,
748
+ 2,
749
+ 2,
750
+ 2,
751
+ 2,
752
+ 2,
753
+ 2,
754
+ 2,
755
+ 2,
756
+ 2,
757
+ 2,
758
+ 2,
759
+ 2,
760
+ 2,
761
+ 2,
762
+ 2,
763
+ 2,
764
+ 2,
765
+ 2,
766
+ 2,
767
+ 2,
768
+ 2,
769
+ 2,
770
+ 2,
771
+ 2,
772
+ 2,
773
+ 2,
774
+ 2,
775
+ 2,
776
+ 2,
777
+ 2,
778
+ 2,
779
+ 2,
780
+ 2,
781
+ 2,
782
+ 2,
783
+ 2,
784
+ 2,
785
+ 2,
786
+ 2,
787
+ 2,
788
+ 2,
789
+ 2,
790
+ 2,
791
+ 2,
792
+ 2,
793
+ 2,
794
+ 2,
795
+ 2,
796
+ 2,
797
+ 2,
798
+ 2,
799
+ 2,
800
+ 2,
801
+ 2,
802
+ 2,
803
+ 2,
804
+ 2,
805
+ 2,
806
+ 2,
807
+ 2,
808
+ 0,
809
+ 0,
810
+ 0,
811
+ 2,
812
+ 2,
813
+ 2,
814
+ 0,
815
+ 0,
816
+ 2,
817
+ 2,
818
+ 2,
819
+ 2,
820
+ 2,
821
+ 2,
822
+ 2,
823
+ 2,
824
+ 2,
825
+ 2,
826
+ 2,
827
+ 2,
828
+ 2,
829
+ 2,
830
+ 2,
831
+ 2,
832
+ 2,
833
+ 2,
834
+ 2,
835
+ 2,
836
+ 2,
837
+ 2,
838
+ 2,
839
+ 2,
840
+ 2,
841
+ 2,
842
+ 2,
843
+ 2,
844
+ 2,
845
+ 2,
846
+ 2,
847
+ 2,
848
+ 2,
849
+ 2,
850
+ 2,
851
+ 2,
852
+ 2,
853
+ 2,
854
+ 2,
855
+ 2,
856
+ 2,
857
+ 2,
858
+ 2,
859
+ 2,
860
+ 2,
861
+ 2,
862
+ 2,
863
+ 2,
864
+ 2,
865
+ 2,
866
+ 2,
867
+ 2,
868
+ 2,
869
+ 2,
870
+ 2,
871
+ 2,
872
+ 2,
873
+ 2,
874
+ 2,
875
+ 2,
876
+ 2,
877
+ 2,
878
+ 2,
879
+ 2,
880
+ 2,
881
+ 2,
882
+ 2,
883
+ 2,
884
+ 2,
885
+ 2,
886
+ 2,
887
+ 2,
888
+ 2,
889
+ 2,
890
+ 2,
891
+ 2,
892
+ 2,
893
+ 2,
894
+ 2,
895
+ 2,
896
+ 2,
897
+ 2,
898
+ 2,
899
+ 2,
900
+ 2,
901
+ 2,
902
+ 2,
903
+ 2,
904
+ 2,
905
+ 2,
906
+ 2,
907
+ 2,
908
+ 2,
909
+ 2,
910
+ 2,
911
+ 2,
912
+ 2,
913
+ 2,
914
+ 2,
915
+ 2,
916
+ 2,
917
+ 2,
918
+ 2,
919
+ 2,
920
+ 2,
921
+ 2,
922
+ 0,
923
+ 2,
924
+ 2,
925
+ 2,
926
+ 2,
927
+ 2,
928
+ 2,
929
+ 0,
930
+ 2,
931
+ 2,
932
+ 2,
933
+ 2,
934
+ 0,
935
+ 2,
936
+ 2,
937
+ 2,
938
+ 2,
939
+ 2,
940
+ 2,
941
+ 2,
942
+ 2,
943
+ 2,
944
+ 0,
945
+ 2,
946
+ 0,
947
+ 2,
948
+ 2,
949
+ 2,
950
+ 2,
951
+ 2,
952
+ 2,
953
+ 2,
954
+ 2,
955
+ 2,
956
+ 2,
957
+ 2,
958
+ 2,
959
+ 2,
960
+ 2,
961
+ 2,
962
+ 2,
963
+ 2,
964
+ 2,
965
+ 2,
966
+ 2,
967
+ 2,
968
+ 2,
969
+ 2,
970
+ 2,
971
+ 2,
972
+ 2,
973
+ 2,
974
+ 2,
975
+ 2,
976
+ 2,
977
+ 2,
978
+ 2,
979
+ 2,
980
+ 2,
981
+ 2,
982
+ 2,
983
+ 2,
984
+ 2,
985
+ 2,
986
+ 2,
987
+ 2,
988
+ 2,
989
+ 2,
990
+ 2,
991
+ 2,
992
+ 2,
993
+ 2,
994
+ 2,
995
+ 2,
996
+ 2,
997
+ 2,
998
+ 2,
999
+ 2,
1000
+ 2,
1001
+ 2,
1002
+ 2,
1003
+ 2,
1004
+ 0,
1005
+ 2,
1006
+ 2,
1007
+ 2,
1008
+ 2,
1009
+ 2,
1010
+ 2,
1011
+ 2,
1012
+ 2,
1013
+ 2,
1014
+ 2,
1015
+ 0,
1016
+ 2,
1017
+ 0,
1018
+ 2,
1019
+ 2,
1020
+ 2,
1021
+ 2,
1022
+ 2,
1023
+ 2,
1024
+ 2,
1025
+ 0,
1026
+ 0,
1027
+ 2,
1028
+ 2,
1029
+ 2,
1030
+ 2,
1031
+ 2,
1032
+ 2,
1033
+ 2,
1034
+ 2,
1035
+ 2,
1036
+ 2,
1037
+ 2,
1038
+ 2,
1039
+ 2,
1040
+ 2,
1041
+ 2,
1042
+ 2,
1043
+ 2,
1044
+ 2,
1045
+ 2,
1046
+ 2,
1047
+ 2,
1048
+ 2,
1049
+ 2,
1050
+ 2,
1051
+ 2,
1052
+ 2,
1053
+ 2,
1054
+ 2,
1055
+ 2,
1056
+ 2,
1057
+ 2,
1058
+ 2,
1059
+ 2,
1060
+ 2,
1061
+ 2,
1062
+ 2,
1063
+ 2,
1064
+ 2,
1065
+ 0,
1066
+ 0,
1067
+ 0,
1068
+ 0,
1069
+ 0,
1070
+ 2,
1071
+ 2,
1072
+ 2,
1073
+ 2,
1074
+ 2,
1075
+ 2,
1076
+ 2,
1077
+ 2,
1078
+ 2,
1079
+ 2,
1080
+ 2,
1081
+ 2,
1082
+ 2,
1083
+ 2,
1084
+ 2,
1085
+ 2,
1086
+ 2,
1087
+ 2,
1088
+ 2,
1089
+ 2,
1090
+ 2,
1091
+ 2,
1092
+ 2,
1093
+ 2,
1094
+ 0,
1095
+ 2,
1096
+ 0,
1097
+ 0,
1098
+ 0,
1099
+ 2,
1100
+ 0,
1101
+ 0,
1102
+ 0,
1103
+ 0,
1104
+ 0,
1105
+ 2,
1106
+ 0,
1107
+ 0,
1108
+ 0,
1109
+ 0,
1110
+ 1,
1111
+ 1,
1112
+ 0,
1113
+ 0,
1114
+ 2,
1115
+ 0,
1116
+ 2,
1117
+ 2,
1118
+ 0,
1119
+ 0,
1120
+ 0,
1121
+ 2,
1122
+ 1,
1123
+ 0,
1124
+ 0,
1125
+ 0,
1126
+ 0,
1127
+ 0,
1128
+ 0,
1129
+ 0,
1130
+ 0,
1131
+ 2,
1132
+ 2,
1133
+ 2,
1134
+ 0,
1135
+ 0,
1136
+ 0,
1137
+ 0,
1138
+ 0,
1139
+ 0,
1140
+ 0,
1141
+ 0,
1142
+ 0,
1143
+ 2,
1144
+ 0,
1145
+ 0,
1146
+ 0,
1147
+ 0,
1148
+ 1,
1149
+ 0,
1150
+ 0,
1151
+ 0,
1152
+ 0,
1153
+ 0,
1154
+ 0,
1155
+ 1,
1156
+ 0,
1157
+ 0,
1158
+ 0,
1159
+ 0,
1160
+ 0,
1161
+ 1,
1162
+ 0,
1163
+ 0,
1164
+ 0,
1165
+ 0,
1166
+ 2,
1167
+ 2,
1168
+ 2,
1169
+ 2,
1170
+ 2,
1171
+ 2,
1172
+ 2,
1173
+ 1,
1174
+ 2,
1175
+ 2,
1176
+ 2,
1177
+ 2,
1178
+ 0,
1179
+ 0,
1180
+ 0,
1181
+ 0,
1182
+ 0,
1183
+ 0,
1184
+ 0,
1185
+ 0,
1186
+ 0,
1187
+ 0,
1188
+ 0,
1189
+ 0,
1190
+ 0,
1191
+ 0,
1192
+ 0,
1193
+ 0,
1194
+ 0,
1195
+ 0,
1196
+ 0,
1197
+ 0,
1198
+ 0,
1199
+ 0,
1200
+ 0,
1201
+ 0,
1202
+ 0,
1203
+ 0,
1204
+ 0,
1205
+ 0,
1206
+ 0,
1207
+ 0,
1208
+ 0,
1209
+ 0,
1210
+ 0,
1211
+ 0,
1212
+ 0,
1213
+ 0,
1214
+ 0,
1215
+ 0,
1216
+ 0,
1217
+ 0,
1218
+ 0,
1219
+ 0,
1220
+ 0,
1221
+ 0,
1222
+ 0,
1223
+ 0,
1224
+ 0,
1225
+ 0,
1226
+ 0,
1227
+ 0,
1228
+ 0,
1229
+ 0,
1230
+ 0,
1231
+ 0,
1232
+ 0,
1233
+ 0,
1234
+ 0,
1235
+ 0,
1236
+ 0,
1237
+ 0,
1238
+ 0,
1239
+ 0,
1240
+ 0,
1241
+ 0,
1242
+ 0,
1243
+ 0,
1244
+ 0,
1245
+ 0,
1246
+ 0,
1247
+ 0,
1248
+ 0,
1249
+ 0,
1250
+ 0,
1251
+ 0,
1252
+ 0,
1253
+ 0,
1254
+ 0,
1255
+ 0,
1256
+ 0,
1257
+ 0,
1258
+ 0,
1259
+ 0,
1260
+ 0,
1261
+ 0,
1262
+ 0,
1263
+ 0,
1264
+ 0,
1265
+ 0,
1266
+ 0,
1267
+ 0,
1268
+ 0,
1269
+ 0,
1270
+ 0,
1271
+ 0,
1272
+ 0,
1273
+ 0,
1274
+ 0,
1275
+ 0,
1276
+ 0,
1277
+ 0,
1278
+ 0,
1279
+ 0,
1280
+ 0,
1281
+ 0,
1282
+ 0,
1283
+ 0,
1284
+ 0,
1285
+ 0,
1286
+ 0,
1287
+ 0,
1288
+ 0,
1289
+ 0,
1290
+ 0,
1291
+ 0,
1292
+ 0,
1293
+ 0,
1294
+ 0,
1295
+ 0,
1296
+ 0,
1297
+ 0,
1298
+ 0,
1299
+ 0,
1300
+ 0,
1301
+ 0,
1302
+ 0,
1303
+ 0,
1304
+ 0,
1305
+ 0,
1306
+ 0,
1307
+ 0,
1308
+ 0,
1309
+ 0,
1310
+ 0,
1311
+ 0,
1312
+ 0,
1313
+ 0,
1314
+ 0,
1315
+ 0,
1316
+ 0,
1317
+ 0,
1318
+ 0,
1319
+ 0,
1320
+ 0,
1321
+ 0,
1322
+ 0,
1323
+ 0,
1324
+ 0,
1325
+ 0,
1326
+ 0,
1327
+ 0,
1328
+ 0,
1329
+ 0,
1330
+ 0,
1331
+ 0,
1332
+ 0,
1333
+ 0,
1334
+ 0,
1335
+ 0,
1336
+ 0,
1337
+ 0,
1338
+ 0,
1339
+ 0,
1340
+ 0,
1341
+ 0,
1342
+ 0,
1343
+ 0,
1344
+ 0,
1345
+ 0,
1346
+ 0,
1347
+ 0,
1348
+ 0,
1349
+ 0,
1350
+ 0,
1351
+ 0,
1352
+ 0,
1353
+ 0,
1354
+ 0,
1355
+ 0,
1356
+ 0,
1357
+ 0,
1358
+ 0,
1359
+ 0,
1360
+ 0,
1361
+ 0,
1362
+ 0,
1363
+ 0,
1364
+ 0,
1365
+ 0,
1366
+ 0,
1367
+ 0,
1368
+ 0,
1369
+ 0,
1370
+ 0,
1371
+ 0,
1372
+ 0,
1373
+ 0,
1374
+ 0,
1375
+ 0,
1376
+ 0,
1377
+ 0,
1378
+ 0,
1379
+ 0,
1380
+ 0,
1381
+ 0,
1382
+ 0,
1383
+ 0,
1384
+ 0,
1385
+ 0,
1386
+ 0,
1387
+ 0,
1388
+ 0,
1389
+ 0,
1390
+ 0,
1391
+ 0,
1392
+ 0,
1393
+ 0,
1394
+ 0,
1395
+ 0,
1396
+ 0,
1397
+ 0,
1398
+ 0,
1399
+ 0,
1400
+ 0,
1401
+ 0,
1402
+ 0,
1403
+ 0,
1404
+ 0,
1405
+ 0,
1406
+ 0,
1407
+ 0,
1408
+ 0,
1409
+ 0,
1410
+ 0,
1411
+ 0,
1412
+ 0,
1413
+ 0,
1414
+ 0,
1415
+ 0,
1416
+ 0,
1417
+ 0,
1418
+ 0,
1419
+ 0,
1420
+ 0,
1421
+ 0,
1422
+ 0,
1423
+ 0,
1424
+ 0,
1425
+ 0,
1426
+ 0,
1427
+ 0,
1428
+ 0,
1429
+ 0,
1430
+ 0,
1431
+ 0,
1432
+ 0,
1433
+ 0,
1434
+ 0,
1435
+ 0,
1436
+ 0,
1437
+ 0,
1438
+ 0,
1439
+ 0,
1440
+ 0,
1441
+ 0,
1442
+ 0,
1443
+ 0,
1444
+ 0,
1445
+ 0,
1446
+ 0,
1447
+ 0,
1448
+ 0,
1449
+ 0,
1450
+ 0,
1451
+ 0,
1452
+ 0,
1453
+ 0,
1454
+ 0,
1455
+ 0,
1456
+ 0,
1457
+ 0,
1458
+ 0,
1459
+ 0,
1460
+ 0,
1461
+ 0,
1462
+ 0,
1463
+ 0,
1464
+ 0,
1465
+ 0,
1466
+ 0,
1467
+ 0,
1468
+ 0,
1469
+ 0,
1470
+ 0,
1471
+ 0,
1472
+ 0,
1473
+ 0,
1474
+ 0,
1475
+ 0,
1476
+ 0,
1477
+ 0,
1478
+ 0,
1479
+ 0,
1480
+ 0,
1481
+ 0,
1482
+ 0,
1483
+ 0,
1484
+ 0,
1485
+ 0,
1486
+ 0,
1487
+ 0,
1488
+ 0,
1489
+ 0,
1490
+ 0,
1491
+ 0,
1492
+ 0,
1493
+ 0,
1494
+ 0,
1495
+ 0,
1496
+ 0,
1497
+ 0,
1498
+ 0,
1499
+ 0,
1500
+ 0,
1501
+ 0,
1502
+ 0,
1503
+ 0,
1504
+ 0,
1505
+ 0,
1506
+ 0,
1507
+ 0,
1508
+ 0,
1509
+ 0,
1510
+ 0,
1511
+ 0,
1512
+ 0,
1513
+ 0,
1514
+ 0,
1515
+ 0,
1516
+ 0,
1517
+ 0,
1518
+ 0,
1519
+ 0,
1520
+ 0,
1521
+ 0,
1522
+ 0,
1523
+ 0,
1524
+ 0,
1525
+ 0,
1526
+ 0,
1527
+ 0,
1528
+ 0,
1529
+ 0,
1530
+ 0,
1531
+ 0,
1532
+ 0,
1533
+ 0,
1534
+ 0,
1535
+ 0,
1536
+ 0,
1537
+ 0,
1538
+ 0,
1539
+ 0,
1540
+ 0,
1541
+ 0,
1542
+ 0,
1543
+ 0,
1544
+ 0,
1545
+ 0,
1546
+ 0,
1547
+ 0,
1548
+ 0,
1549
+ 0,
1550
+ 0,
1551
+ 0,
1552
+ 0,
1553
+ 0,
1554
+ 0,
1555
+ 0,
1556
+ 0,
1557
+ 0,
1558
+ 0,
1559
+ 0,
1560
+ 0,
1561
+ 0,
1562
+ 0,
1563
+ 2,
1564
+ 0,
1565
+ 0,
1566
+ 0,
1567
+ 0,
1568
+ 0,
1569
+ 0,
1570
+ 0,
1571
+ 0,
1572
+ 0,
1573
+ 0,
1574
+ 0,
1575
+ 0,
1576
+ 0,
1577
+ 0,
1578
+ 0,
1579
+ 0,
1580
+ 0,
1581
+ 0,
1582
+ 0,
1583
+ 0,
1584
+ 0,
1585
+ 0,
1586
+ 0,
1587
+ 0,
1588
+ 0,
1589
+ 0,
1590
+ 0,
1591
+ 0,
1592
+ 0,
1593
+ 0,
1594
+ 0,
1595
+ 0,
1596
+ 0,
1597
+ 0,
1598
+ 0,
1599
+ 0,
1600
+ 0,
1601
+ 0,
1602
+ 0,
1603
+ 0,
1604
+ 0,
1605
+ 0,
1606
+ 0,
1607
+ 0,
1608
+ 0,
1609
+ 0,
1610
+ 0,
1611
+ 0,
1612
+ 0,
1613
+ 0,
1614
+ 0,
1615
+ 0,
1616
+ 0,
1617
+ 0,
1618
+ 2,
1619
+ 2,
1620
+ 2,
1621
+ 2,
1622
+ 0,
1623
+ 2,
1624
+ 0,
1625
+ 0,
1626
+ 0,
1627
+ 0,
1628
+ 0,
1629
+ 0,
1630
+ 0,
1631
+ 0,
1632
+ 0,
1633
+ 0,
1634
+ 0,
1635
+ 0,
1636
+ 0,
1637
+ 0,
1638
+ 0,
1639
+ 0,
1640
+ 0,
1641
+ 0,
1642
+ 0,
1643
+ 2,
1644
+ 0,
1645
+ 0,
1646
+ 0,
1647
+ 0,
1648
+ 0,
1649
+ 0,
1650
+ 0,
1651
+ 0,
1652
+ 0,
1653
+ 0,
1654
+ 0,
1655
+ 0,
1656
+ 0,
1657
+ 0,
1658
+ 0,
1659
+ 0,
1660
+ 0,
1661
+ 0,
1662
+ 0,
1663
+ 0,
1664
+ 0,
1665
+ 0,
1666
+ 0,
1667
+ 0,
1668
+ 0,
1669
+ 0,
1670
+ 0,
1671
+ 0,
1672
+ 0,
1673
+ 0,
1674
+ 0,
1675
+ 0,
1676
+ 0,
1677
+ 0,
1678
+ 0,
1679
+ 0,
1680
+ 0,
1681
+ 0,
1682
+ 0,
1683
+ 0,
1684
+ 0,
1685
+ 0,
1686
+ 0,
1687
+ 0,
1688
+ 0,
1689
+ 0,
1690
+ 0,
1691
+ 0,
1692
+ 0,
1693
+ 0,
1694
+ 0,
1695
+ 0,
1696
+ 0,
1697
+ 0,
1698
+ 0,
1699
+ 0,
1700
+ 0,
1701
+ 0,
1702
+ 0,
1703
+ 0,
1704
+ 0,
1705
+ 0,
1706
+ 0,
1707
+ 0,
1708
+ 0,
1709
+ 0,
1710
+ 0,
1711
+ 0,
1712
+ 0,
1713
+ 0,
1714
+ 0,
1715
+ 0,
1716
+ 0,
1717
+ 0,
1718
+ 0,
1719
+ 0,
1720
+ 0,
1721
+ 0,
1722
+ 0,
1723
+ 0,
1724
+ 0,
1725
+ 0,
1726
+ 0,
1727
+ 0,
1728
+ 0,
1729
+ 0,
1730
+ 0,
1731
+ 0,
1732
+ 0,
1733
+ 0,
1734
+ 0,
1735
+ 0,
1736
+ 0,
1737
+ 0,
1738
+ 0,
1739
+ 0,
1740
+ 0,
1741
+ 0,
1742
+ 0,
1743
+ 0,
1744
+ 0,
1745
+ 0,
1746
+ 0,
1747
+ 0,
1748
+ 0,
1749
+ 0,
1750
+ 0,
1751
+ 0,
1752
+ 0,
1753
+ 0,
1754
+ 0,
1755
+ 0,
1756
+ 0,
1757
+ 0,
1758
+ 0,
1759
+ 0,
1760
+ 0,
1761
+ 0,
1762
+ 0,
1763
+ 0,
1764
+ 0,
1765
+ 0,
1766
+ 0,
1767
+ 0,
1768
+ 0,
1769
+ 0,
1770
+ 0,
1771
+ 0,
1772
+ 0,
1773
+ 0,
1774
+ 0,
1775
+ 0,
1776
+ 0,
1777
+ 0,
1778
+ 0,
1779
+ 0,
1780
+ 0,
1781
+ 0,
1782
+ 0,
1783
+ 0,
1784
+ 0,
1785
+ 0,
1786
+ 0,
1787
+ 0,
1788
+ 0,
1789
+ 0,
1790
+ 0,
1791
+ 0,
1792
+ 0,
1793
+ 0,
1794
+ 0,
1795
+ 0,
1796
+ 0,
1797
+ 0,
1798
+ 0,
1799
+ 0,
1800
+ 0,
1801
+ 0,
1802
+ 0,
1803
+ 0,
1804
+ 0,
1805
+ 0,
1806
+ 0,
1807
+ 0,
1808
+ 0,
1809
+ 0,
1810
+ 0,
1811
+ 0,
1812
+ 0,
1813
+ 0,
1814
+ 0,
1815
+ 0,
1816
+ 0,
1817
+ 0,
1818
+ 0,
1819
+ 0,
1820
+ 0,
1821
+ 0,
1822
+ 0,
1823
+ 0,
1824
+ 0,
1825
+ 0,
1826
+ 0,
1827
+ 0,
1828
+ 0,
1829
+ 0,
1830
+ 0,
1831
+ 0,
1832
+ 0,
1833
+ 0,
1834
+ 0,
1835
+ 0,
1836
+ 0,
1837
+ 0,
1838
+ 0,
1839
+ 0,
1840
+ 0,
1841
+ 0,
1842
+ 0,
1843
+ 0,
1844
+ 0,
1845
+ 0,
1846
+ 0,
1847
+ 0,
1848
+ 0,
1849
+ 0,
1850
+ 0,
1851
+ 0,
1852
+ 0,
1853
+ 0,
1854
+ 0,
1855
+ 0,
1856
+ 0,
1857
+ 0,
1858
+ 0,
1859
+ 0,
1860
+ 0,
1861
+ 0,
1862
+ 0,
1863
+ 0,
1864
+ 0,
1865
+ 0,
1866
+ 0,
1867
+ 0,
1868
+ 0,
1869
+ 0,
1870
+ 0,
1871
+ 0,
1872
+ 0,
1873
+ 0,
1874
+ 0,
1875
+ 0,
1876
+ 0,
1877
+ 0,
1878
+ 0,
1879
+ 0,
1880
+ 0,
1881
+ 0,
1882
+ 0,
1883
+ 0,
1884
+ 0,
1885
+ 0,
1886
+ 0,
1887
+ 0,
1888
+ 0,
1889
+ 0,
1890
+ 0,
1891
+ 0,
1892
+ 0,
1893
+ 0,
1894
+ 0,
1895
+ 0,
1896
+ 0,
1897
+ 0,
1898
+ 0,
1899
+ 0,
1900
+ 0,
1901
+ 0,
1902
+ 0,
1903
+ 0,
1904
+ 0,
1905
+ 0,
1906
+ 0,
1907
+ 0,
1908
+ 0,
1909
+ 0,
1910
+ 0,
1911
+ 0,
1912
+ 0,
1913
+ 0,
1914
+ 0,
1915
+ 0,
1916
+ 0,
1917
+ 0,
1918
+ 0,
1919
+ 0,
1920
+ 1,
1921
+ 1,
1922
+ 0,
1923
+ 0,
1924
+ 0,
1925
+ 0,
1926
+ 2,
1927
+ 2,
1928
+ 2,
1929
+ 2,
1930
+ 2,
1931
+ 2,
1932
+ 2,
1933
+ 2,
1934
+ 2,
1935
+ 2,
1936
+ 2,
1937
+ 2,
1938
+ 2,
1939
+ 2,
1940
+ 2,
1941
+ 2,
1942
+ 2,
1943
+ 2,
1944
+ 2,
1945
+ 2,
1946
+ 2,
1947
+ 1,
1948
+ 2,
1949
+ 2,
1950
+ 2,
1951
+ 2,
1952
+ 2,
1953
+ 2,
1954
+ 2,
1955
+ 2,
1956
+ 2,
1957
+ 2,
1958
+ 2,
1959
+ 2,
1960
+ 2,
1961
+ 2,
1962
+ 2,
1963
+ 2,
1964
+ 2,
1965
+ 2,
1966
+ 2,
1967
+ 2,
1968
+ 2,
1969
+ 2,
1970
+ 2,
1971
+ 0,
1972
+ 2,
1973
+ 1,
1974
+ 2,
1975
+ 1,
1976
+ 0,
1977
+ 0,
1978
+ 0,
1979
+ 0,
1980
+ 0,
1981
+ 0,
1982
+ 0,
1983
+ 0,
1984
+ 0,
1985
+ 0,
1986
+ 0,
1987
+ 0,
1988
+ 0,
1989
+ 0,
1990
+ 0,
1991
+ 2,
1992
+ 2,
1993
+ 2,
1994
+ 2,
1995
+ 2,
1996
+ 2,
1997
+ 2,
1998
+ 2,
1999
+ 2,
2000
+ 0,
2001
+ 2,
2002
+ 2,
2003
+ 2,
2004
+ 2,
2005
+ 2,
2006
+ 2,
2007
+ 2,
2008
+ 2,
2009
+ 2,
2010
+ 2,
2011
+ 2,
2012
+ 2,
2013
+ 2,
2014
+ 2,
2015
+ 2,
2016
+ 2,
2017
+ 2,
2018
+ 2,
2019
+ 2,
2020
+ 2,
2021
+ 2,
2022
+ 2,
2023
+ 2,
2024
+ 2,
2025
+ 2,
2026
+ 2,
2027
+ 2,
2028
+ 2,
2029
+ 2,
2030
+ 2,
2031
+ 2,
2032
+ 2,
2033
+ 2,
2034
+ 2,
2035
+ 2,
2036
+ 2,
2037
+ 2,
2038
+ 2,
2039
+ 2,
2040
+ 2,
2041
+ 2,
2042
+ 2,
2043
+ 2,
2044
+ 2,
2045
+ 2,
2046
+ 2,
2047
+ 2,
2048
+ 2,
2049
+ 2,
2050
+ 2,
2051
+ 2,
2052
+ 2,
2053
+ 2,
2054
+ 2,
2055
+ 2,
2056
+ 2,
2057
+ 2,
2058
+ 2,
2059
+ 2,
2060
+ 2,
2061
+ 2,
2062
+ 2,
2063
+ 2,
2064
+ 2,
2065
+ 2,
2066
+ 2,
2067
+ 2,
2068
+ 2,
2069
+ 2,
2070
+ 2,
2071
+ 2,
2072
+ 2,
2073
+ 2,
2074
+ 2,
2075
+ 2,
2076
+ 2,
2077
+ 2,
2078
+ 2,
2079
+ 2,
2080
+ 2,
2081
+ 2,
2082
+ 2,
2083
+ 2,
2084
+ 2,
2085
+ 2,
2086
+ 2,
2087
+ 2,
2088
+ 2,
2089
+ 2,
2090
+ 2,
2091
+ 2,
2092
+ 2,
2093
+ 2,
2094
+ 2,
2095
+ 2,
2096
+ 2,
2097
+ 2,
2098
+ 2,
2099
+ 2,
2100
+ 2,
2101
+ 2,
2102
+ 2,
2103
+ 2,
2104
+ 2,
2105
+ 2,
2106
+ 2,
2107
+ 2,
2108
+ 2,
2109
+ 2,
2110
+ 2,
2111
+ 2,
2112
+ 2,
2113
+ 2,
2114
+ 2,
2115
+ 2,
2116
+ 2,
2117
+ 2,
2118
+ 2,
2119
+ 2,
2120
+ 2,
2121
+ 2,
2122
+ 2,
2123
+ 2,
2124
+ 2,
2125
+ 2,
2126
+ 2,
2127
+ 2,
2128
+ 2,
2129
+ 2,
2130
+ 2,
2131
+ 2,
2132
+ 2,
2133
+ 2,
2134
+ 2,
2135
+ 2,
2136
+ 2,
2137
+ 2,
2138
+ 2,
2139
+ 2,
2140
+ 2,
2141
+ 0,
2142
+ 2,
2143
+ 2,
2144
+ 2,
2145
+ 2,
2146
+ 2,
2147
+ 2,
2148
+ 2,
2149
+ 2,
2150
+ 2,
2151
+ 2,
2152
+ 2,
2153
+ 2,
2154
+ 2,
2155
+ 2,
2156
+ 2,
2157
+ 2,
2158
+ 2,
2159
+ 2,
2160
+ 2,
2161
+ 2,
2162
+ 2,
2163
+ 2,
2164
+ 2,
2165
+ 2,
2166
+ 2,
2167
+ 2,
2168
+ 2,
2169
+ 2,
2170
+ 2,
2171
+ 2,
2172
+ 2,
2173
+ 2,
2174
+ 2,
2175
+ 2,
2176
+ 2,
2177
+ 2,
2178
+ 2,
2179
+ 2,
2180
+ 2,
2181
+ 2,
2182
+ 2,
2183
+ 2,
2184
+ 2,
2185
+ 2,
2186
+ 2,
2187
+ 2,
2188
+ 2,
2189
+ 2,
2190
+ 2,
2191
+ 2,
2192
+ 2,
2193
+ 2,
2194
+ 2,
2195
+ 2,
2196
+ 2,
2197
+ 2,
2198
+ 2,
2199
+ 2,
2200
+ 2,
2201
+ 2,
2202
+ 2,
2203
+ 2,
2204
+ 2,
2205
+ 2,
2206
+ 2,
2207
+ 2,
2208
+ 2,
2209
+ 2,
2210
+ 2,
2211
+ 2,
2212
+ 2,
2213
+ 2,
2214
+ 2,
2215
+ 2,
2216
+ 2,
2217
+ 2,
2218
+ 2,
2219
+ 2,
2220
+ 2,
2221
+ 2,
2222
+ 2,
2223
+ 2,
2224
+ 2,
2225
+ 2,
2226
+ 2,
2227
+ 2,
2228
+ 2,
2229
+ 2,
2230
+ 2,
2231
+ 2,
2232
+ 2,
2233
+ 2,
2234
+ 2,
2235
+ 2,
2236
+ 2,
2237
+ 2,
2238
+ 2,
2239
+ 2,
2240
+ 2,
2241
+ 2,
2242
+ 2,
2243
+ 2,
2244
+ 2,
2245
+ 2,
2246
+ 2,
2247
+ 2,
2248
+ 2,
2249
+ 2,
2250
+ 2,
2251
+ 2,
2252
+ 2,
2253
+ 2,
2254
+ 2,
2255
+ 2,
2256
+ 2,
2257
+ 2,
2258
+ 2,
2259
+ 2,
2260
+ 2,
2261
+ 2,
2262
+ 2,
2263
+ 2,
2264
+ 2,
2265
+ 2,
2266
+ 2,
2267
+ 2,
2268
+ 2,
2269
+ 0,
2270
+ 2,
2271
+ 0,
2272
+ 0,
2273
+ 0,
2274
+ 0,
2275
+ 0,
2276
+ 0,
2277
+ 1,
2278
+ 0,
2279
+ 1,
2280
+ 0,
2281
+ 1,
2282
+ 1,
2283
+ 1,
2284
+ 1,
2285
+ 1,
2286
+ 1,
2287
+ 2,
2288
+ 2,
2289
+ 0,
2290
+ 1,
2291
+ 2,
2292
+ 1,
2293
+ 1,
2294
+ 1,
2295
+ 0,
2296
+ 0,
2297
+ 1,
2298
+ 2,
2299
+ 2
2300
+ ],
2301
+ "test_true": [
2302
+ 0,
2303
+ 0,
2304
+ 0,
2305
+ 0,
2306
+ 0,
2307
+ 0,
2308
+ 0,
2309
+ 0,
2310
+ 0,
2311
+ 0,
2312
+ 0,
2313
+ 0,
2314
+ 0,
2315
+ 0,
2316
+ 0,
2317
+ 0,
2318
+ 0,
2319
+ 0,
2320
+ 0,
2321
+ 0,
2322
+ 0,
2323
+ 0,
2324
+ 0,
2325
+ 0,
2326
+ 0,
2327
+ 0,
2328
+ 0,
2329
+ 0,
2330
+ 0,
2331
+ 0,
2332
+ 0,
2333
+ 0,
2334
+ 0,
2335
+ 0,
2336
+ 0,
2337
+ 0,
2338
+ 0,
2339
+ 0,
2340
+ 0,
2341
+ 0,
2342
+ 0,
2343
+ 0,
2344
+ 0,
2345
+ 0,
2346
+ 0,
2347
+ 0,
2348
+ 0,
2349
+ 0,
2350
+ 0,
2351
+ 0,
2352
+ 0,
2353
+ 0,
2354
+ 0,
2355
+ 0,
2356
+ 0,
2357
+ 0,
2358
+ 0,
2359
+ 0,
2360
+ 0,
2361
+ 0,
2362
+ 0,
2363
+ 0,
2364
+ 0,
2365
+ 0,
2366
+ 0,
2367
+ 0,
2368
+ 0,
2369
+ 0,
2370
+ 0,
2371
+ 0,
2372
+ 0,
2373
+ 0,
2374
+ 0,
2375
+ 0,
2376
+ 0,
2377
+ 2,
2378
+ 2,
2379
+ 2,
2380
+ 2,
2381
+ 0,
2382
+ 0,
2383
+ 0,
2384
+ 0,
2385
+ 0,
2386
+ 0,
2387
+ 0,
2388
+ 0,
2389
+ 0,
2390
+ 0,
2391
+ 0,
2392
+ 0,
2393
+ 0,
2394
+ 0,
2395
+ 0,
2396
+ 0,
2397
+ 0,
2398
+ 0,
2399
+ 0,
2400
+ 0,
2401
+ 0,
2402
+ 0,
2403
+ 0,
2404
+ 0,
2405
+ 0,
2406
+ 0,
2407
+ 0,
2408
+ 0,
2409
+ 0,
2410
+ 0,
2411
+ 0,
2412
+ 0,
2413
+ 0,
2414
+ 0,
2415
+ 0,
2416
+ 0,
2417
+ 0,
2418
+ 0,
2419
+ 0,
2420
+ 0,
2421
+ 0,
2422
+ 0,
2423
+ 0,
2424
+ 0,
2425
+ 0,
2426
+ 0,
2427
+ 0,
2428
+ 0,
2429
+ 2,
2430
+ 2,
2431
+ 0,
2432
+ 0,
2433
+ 0,
2434
+ 0,
2435
+ 0,
2436
+ 0,
2437
+ 0,
2438
+ 2,
2439
+ 2,
2440
+ 2,
2441
+ 2,
2442
+ 2,
2443
+ 2,
2444
+ 2,
2445
+ 0,
2446
+ 2,
2447
+ 2,
2448
+ 2,
2449
+ 2,
2450
+ 2,
2451
+ 2,
2452
+ 2,
2453
+ 2,
2454
+ 2,
2455
+ 2,
2456
+ 2,
2457
+ 2,
2458
+ 2,
2459
+ 2,
2460
+ 2,
2461
+ 2,
2462
+ 2,
2463
+ 2,
2464
+ 2,
2465
+ 2,
2466
+ 2,
2467
+ 2,
2468
+ 2,
2469
+ 2,
2470
+ 2,
2471
+ 2,
2472
+ 2,
2473
+ 2,
2474
+ 2,
2475
+ 2,
2476
+ 2,
2477
+ 2,
2478
+ 2,
2479
+ 2,
2480
+ 2,
2481
+ 2,
2482
+ 2,
2483
+ 2,
2484
+ 2,
2485
+ 2,
2486
+ 2,
2487
+ 2,
2488
+ 2,
2489
+ 2,
2490
+ 2,
2491
+ 2,
2492
+ 2,
2493
+ 2,
2494
+ 2,
2495
+ 2,
2496
+ 2,
2497
+ 2,
2498
+ 2,
2499
+ 2,
2500
+ 2,
2501
+ 2,
2502
+ 2,
2503
+ 2,
2504
+ 2,
2505
+ 2,
2506
+ 2,
2507
+ 2,
2508
+ 2,
2509
+ 2,
2510
+ 2,
2511
+ 2,
2512
+ 2,
2513
+ 2,
2514
+ 2,
2515
+ 2,
2516
+ 2,
2517
+ 2,
2518
+ 0,
2519
+ 2,
2520
+ 2,
2521
+ 2,
2522
+ 2,
2523
+ 2,
2524
+ 2,
2525
+ 2,
2526
+ 2,
2527
+ 2,
2528
+ 2,
2529
+ 2,
2530
+ 2,
2531
+ 2,
2532
+ 2,
2533
+ 2,
2534
+ 2,
2535
+ 2,
2536
+ 2,
2537
+ 2,
2538
+ 2,
2539
+ 2,
2540
+ 2,
2541
+ 2,
2542
+ 2,
2543
+ 2,
2544
+ 2,
2545
+ 2,
2546
+ 2,
2547
+ 2,
2548
+ 2,
2549
+ 2,
2550
+ 2,
2551
+ 2,
2552
+ 2,
2553
+ 2,
2554
+ 2,
2555
+ 2,
2556
+ 2,
2557
+ 2,
2558
+ 2,
2559
+ 2,
2560
+ 2,
2561
+ 2,
2562
+ 2,
2563
+ 2,
2564
+ 2,
2565
+ 2,
2566
+ 2,
2567
+ 2,
2568
+ 2,
2569
+ 2,
2570
+ 2,
2571
+ 2,
2572
+ 2,
2573
+ 2,
2574
+ 2,
2575
+ 2,
2576
+ 2,
2577
+ 2,
2578
+ 2,
2579
+ 2,
2580
+ 2,
2581
+ 2,
2582
+ 2,
2583
+ 2,
2584
+ 2,
2585
+ 2,
2586
+ 2,
2587
+ 2,
2588
+ 2,
2589
+ 2,
2590
+ 2,
2591
+ 2,
2592
+ 2,
2593
+ 2,
2594
+ 2,
2595
+ 2,
2596
+ 2,
2597
+ 2,
2598
+ 2,
2599
+ 2,
2600
+ 2,
2601
+ 2,
2602
+ 2,
2603
+ 2,
2604
+ 2,
2605
+ 2,
2606
+ 2,
2607
+ 2,
2608
+ 2,
2609
+ 2,
2610
+ 2,
2611
+ 2,
2612
+ 2,
2613
+ 2,
2614
+ 2,
2615
+ 2,
2616
+ 2,
2617
+ 2,
2618
+ 2,
2619
+ 2,
2620
+ 2,
2621
+ 2,
2622
+ 2,
2623
+ 2,
2624
+ 2,
2625
+ 2,
2626
+ 2,
2627
+ 2,
2628
+ 2,
2629
+ 2,
2630
+ 2,
2631
+ 2,
2632
+ 2,
2633
+ 2,
2634
+ 2,
2635
+ 2,
2636
+ 2,
2637
+ 2,
2638
+ 2,
2639
+ 2,
2640
+ 2,
2641
+ 2,
2642
+ 2,
2643
+ 2,
2644
+ 2,
2645
+ 2,
2646
+ 2,
2647
+ 2,
2648
+ 2,
2649
+ 2,
2650
+ 2,
2651
+ 2,
2652
+ 2,
2653
+ 2,
2654
+ 2,
2655
+ 2,
2656
+ 2,
2657
+ 2,
2658
+ 2,
2659
+ 2,
2660
+ 2,
2661
+ 2,
2662
+ 2,
2663
+ 2,
2664
+ 2,
2665
+ 2,
2666
+ 2,
2667
+ 2,
2668
+ 2,
2669
+ 2,
2670
+ 2,
2671
+ 2,
2672
+ 2,
2673
+ 2,
2674
+ 2,
2675
+ 2,
2676
+ 2,
2677
+ 2,
2678
+ 2,
2679
+ 2,
2680
+ 2,
2681
+ 2,
2682
+ 2,
2683
+ 2,
2684
+ 2,
2685
+ 2,
2686
+ 2,
2687
+ 2,
2688
+ 2,
2689
+ 2,
2690
+ 2,
2691
+ 2,
2692
+ 2,
2693
+ 2,
2694
+ 2,
2695
+ 2,
2696
+ 2,
2697
+ 2,
2698
+ 2,
2699
+ 2,
2700
+ 2,
2701
+ 2,
2702
+ 2,
2703
+ 2,
2704
+ 0,
2705
+ 2,
2706
+ 2,
2707
+ 0,
2708
+ 0,
2709
+ 2,
2710
+ 2,
2711
+ 2,
2712
+ 2,
2713
+ 2,
2714
+ 2,
2715
+ 2,
2716
+ 2,
2717
+ 2,
2718
+ 2,
2719
+ 2,
2720
+ 2,
2721
+ 2,
2722
+ 2,
2723
+ 2,
2724
+ 2,
2725
+ 2,
2726
+ 2,
2727
+ 2,
2728
+ 2,
2729
+ 2,
2730
+ 2,
2731
+ 2,
2732
+ 2,
2733
+ 2,
2734
+ 2,
2735
+ 2,
2736
+ 2,
2737
+ 2,
2738
+ 2,
2739
+ 2,
2740
+ 2,
2741
+ 2,
2742
+ 2,
2743
+ 2,
2744
+ 2,
2745
+ 2,
2746
+ 2,
2747
+ 2,
2748
+ 2,
2749
+ 2,
2750
+ 2,
2751
+ 2,
2752
+ 2,
2753
+ 2,
2754
+ 2,
2755
+ 2,
2756
+ 2,
2757
+ 2,
2758
+ 2,
2759
+ 2,
2760
+ 2,
2761
+ 2,
2762
+ 2,
2763
+ 2,
2764
+ 2,
2765
+ 2,
2766
+ 2,
2767
+ 2,
2768
+ 2,
2769
+ 2,
2770
+ 2,
2771
+ 2,
2772
+ 2,
2773
+ 2,
2774
+ 2,
2775
+ 2,
2776
+ 2,
2777
+ 2,
2778
+ 2,
2779
+ 2,
2780
+ 2,
2781
+ 2,
2782
+ 2,
2783
+ 2,
2784
+ 2,
2785
+ 2,
2786
+ 2,
2787
+ 2,
2788
+ 2,
2789
+ 2,
2790
+ 2,
2791
+ 2,
2792
+ 2,
2793
+ 2,
2794
+ 2,
2795
+ 2,
2796
+ 2,
2797
+ 2,
2798
+ 2,
2799
+ 2,
2800
+ 2,
2801
+ 2,
2802
+ 2,
2803
+ 2,
2804
+ 2,
2805
+ 2,
2806
+ 2,
2807
+ 2,
2808
+ 2,
2809
+ 2,
2810
+ 2,
2811
+ 2,
2812
+ 2,
2813
+ 2,
2814
+ 2,
2815
+ 2,
2816
+ 2,
2817
+ 2,
2818
+ 2,
2819
+ 2,
2820
+ 2,
2821
+ 2,
2822
+ 2,
2823
+ 2,
2824
+ 2,
2825
+ 2,
2826
+ 2,
2827
+ 2,
2828
+ 2,
2829
+ 2,
2830
+ 2,
2831
+ 2,
2832
+ 2,
2833
+ 2,
2834
+ 2,
2835
+ 2,
2836
+ 2,
2837
+ 2,
2838
+ 2,
2839
+ 2,
2840
+ 2,
2841
+ 2,
2842
+ 2,
2843
+ 2,
2844
+ 2,
2845
+ 2,
2846
+ 2,
2847
+ 2,
2848
+ 2,
2849
+ 2,
2850
+ 2,
2851
+ 2,
2852
+ 2,
2853
+ 2,
2854
+ 2,
2855
+ 2,
2856
+ 2,
2857
+ 2,
2858
+ 2,
2859
+ 2,
2860
+ 2,
2861
+ 2,
2862
+ 2,
2863
+ 2,
2864
+ 2,
2865
+ 2,
2866
+ 2,
2867
+ 2,
2868
+ 2,
2869
+ 2,
2870
+ 2,
2871
+ 2,
2872
+ 2,
2873
+ 2,
2874
+ 2,
2875
+ 2,
2876
+ 2,
2877
+ 2,
2878
+ 2,
2879
+ 2,
2880
+ 2,
2881
+ 2,
2882
+ 2,
2883
+ 2,
2884
+ 2,
2885
+ 2,
2886
+ 2,
2887
+ 2,
2888
+ 2,
2889
+ 2,
2890
+ 2,
2891
+ 2,
2892
+ 2,
2893
+ 2,
2894
+ 2,
2895
+ 2,
2896
+ 2,
2897
+ 2,
2898
+ 2,
2899
+ 2,
2900
+ 2,
2901
+ 2,
2902
+ 2,
2903
+ 2,
2904
+ 2,
2905
+ 2,
2906
+ 2,
2907
+ 2,
2908
+ 2,
2909
+ 2,
2910
+ 2,
2911
+ 2,
2912
+ 2,
2913
+ 2,
2914
+ 2,
2915
+ 2,
2916
+ 2,
2917
+ 2,
2918
+ 2,
2919
+ 2,
2920
+ 2,
2921
+ 2,
2922
+ 2,
2923
+ 2,
2924
+ 2,
2925
+ 2,
2926
+ 2,
2927
+ 2,
2928
+ 2,
2929
+ 2,
2930
+ 2,
2931
+ 2,
2932
+ 2,
2933
+ 2,
2934
+ 2,
2935
+ 2,
2936
+ 2,
2937
+ 2,
2938
+ 2,
2939
+ 2,
2940
+ 2,
2941
+ 2,
2942
+ 2,
2943
+ 2,
2944
+ 2,
2945
+ 2,
2946
+ 2,
2947
+ 2,
2948
+ 2,
2949
+ 2,
2950
+ 2,
2951
+ 2,
2952
+ 2,
2953
+ 2,
2954
+ 2,
2955
+ 2,
2956
+ 2,
2957
+ 2,
2958
+ 2,
2959
+ 2,
2960
+ 2,
2961
+ 2,
2962
+ 0,
2963
+ 0,
2964
+ 0,
2965
+ 2,
2966
+ 2,
2967
+ 2,
2968
+ 0,
2969
+ 0,
2970
+ 2,
2971
+ 2,
2972
+ 2,
2973
+ 2,
2974
+ 2,
2975
+ 2,
2976
+ 2,
2977
+ 2,
2978
+ 2,
2979
+ 2,
2980
+ 2,
2981
+ 2,
2982
+ 2,
2983
+ 2,
2984
+ 2,
2985
+ 2,
2986
+ 2,
2987
+ 2,
2988
+ 2,
2989
+ 2,
2990
+ 2,
2991
+ 2,
2992
+ 2,
2993
+ 2,
2994
+ 2,
2995
+ 2,
2996
+ 2,
2997
+ 2,
2998
+ 2,
2999
+ 2,
3000
+ 2,
3001
+ 2,
3002
+ 2,
3003
+ 2,
3004
+ 2,
3005
+ 2,
3006
+ 2,
3007
+ 2,
3008
+ 2,
3009
+ 2,
3010
+ 2,
3011
+ 2,
3012
+ 2,
3013
+ 2,
3014
+ 2,
3015
+ 2,
3016
+ 2,
3017
+ 2,
3018
+ 2,
3019
+ 2,
3020
+ 2,
3021
+ 2,
3022
+ 2,
3023
+ 2,
3024
+ 2,
3025
+ 2,
3026
+ 2,
3027
+ 2,
3028
+ 2,
3029
+ 2,
3030
+ 2,
3031
+ 2,
3032
+ 2,
3033
+ 2,
3034
+ 2,
3035
+ 2,
3036
+ 2,
3037
+ 2,
3038
+ 2,
3039
+ 2,
3040
+ 2,
3041
+ 2,
3042
+ 2,
3043
+ 2,
3044
+ 2,
3045
+ 2,
3046
+ 2,
3047
+ 2,
3048
+ 2,
3049
+ 2,
3050
+ 2,
3051
+ 2,
3052
+ 2,
3053
+ 2,
3054
+ 2,
3055
+ 2,
3056
+ 2,
3057
+ 2,
3058
+ 2,
3059
+ 2,
3060
+ 2,
3061
+ 2,
3062
+ 2,
3063
+ 2,
3064
+ 2,
3065
+ 2,
3066
+ 2,
3067
+ 2,
3068
+ 2,
3069
+ 2,
3070
+ 2,
3071
+ 2,
3072
+ 2,
3073
+ 2,
3074
+ 2,
3075
+ 2,
3076
+ 2,
3077
+ 2,
3078
+ 2,
3079
+ 2,
3080
+ 2,
3081
+ 2,
3082
+ 2,
3083
+ 2,
3084
+ 2,
3085
+ 2,
3086
+ 2,
3087
+ 2,
3088
+ 2,
3089
+ 2,
3090
+ 2,
3091
+ 2,
3092
+ 2,
3093
+ 2,
3094
+ 2,
3095
+ 2,
3096
+ 2,
3097
+ 2,
3098
+ 2,
3099
+ 2,
3100
+ 2,
3101
+ 2,
3102
+ 2,
3103
+ 2,
3104
+ 2,
3105
+ 2,
3106
+ 2,
3107
+ 2,
3108
+ 2,
3109
+ 2,
3110
+ 2,
3111
+ 2,
3112
+ 2,
3113
+ 2,
3114
+ 2,
3115
+ 2,
3116
+ 2,
3117
+ 2,
3118
+ 2,
3119
+ 2,
3120
+ 2,
3121
+ 2,
3122
+ 2,
3123
+ 2,
3124
+ 2,
3125
+ 2,
3126
+ 2,
3127
+ 2,
3128
+ 2,
3129
+ 2,
3130
+ 2,
3131
+ 2,
3132
+ 2,
3133
+ 2,
3134
+ 2,
3135
+ 2,
3136
+ 2,
3137
+ 2,
3138
+ 2,
3139
+ 2,
3140
+ 2,
3141
+ 2,
3142
+ 2,
3143
+ 2,
3144
+ 2,
3145
+ 2,
3146
+ 2,
3147
+ 2,
3148
+ 2,
3149
+ 2,
3150
+ 2,
3151
+ 2,
3152
+ 2,
3153
+ 2,
3154
+ 2,
3155
+ 2,
3156
+ 2,
3157
+ 2,
3158
+ 0,
3159
+ 2,
3160
+ 2,
3161
+ 2,
3162
+ 2,
3163
+ 2,
3164
+ 2,
3165
+ 2,
3166
+ 2,
3167
+ 2,
3168
+ 2,
3169
+ 2,
3170
+ 2,
3171
+ 2,
3172
+ 2,
3173
+ 2,
3174
+ 2,
3175
+ 2,
3176
+ 2,
3177
+ 2,
3178
+ 2,
3179
+ 0,
3180
+ 0,
3181
+ 0,
3182
+ 2,
3183
+ 2,
3184
+ 2,
3185
+ 2,
3186
+ 2,
3187
+ 2,
3188
+ 2,
3189
+ 2,
3190
+ 2,
3191
+ 2,
3192
+ 2,
3193
+ 2,
3194
+ 2,
3195
+ 2,
3196
+ 2,
3197
+ 2,
3198
+ 2,
3199
+ 2,
3200
+ 2,
3201
+ 2,
3202
+ 2,
3203
+ 2,
3204
+ 2,
3205
+ 2,
3206
+ 2,
3207
+ 2,
3208
+ 2,
3209
+ 2,
3210
+ 2,
3211
+ 2,
3212
+ 2,
3213
+ 2,
3214
+ 2,
3215
+ 2,
3216
+ 2,
3217
+ 2,
3218
+ 2,
3219
+ 0,
3220
+ 0,
3221
+ 0,
3222
+ 0,
3223
+ 0,
3224
+ 2,
3225
+ 2,
3226
+ 2,
3227
+ 2,
3228
+ 2,
3229
+ 2,
3230
+ 2,
3231
+ 2,
3232
+ 2,
3233
+ 2,
3234
+ 2,
3235
+ 2,
3236
+ 2,
3237
+ 2,
3238
+ 2,
3239
+ 0,
3240
+ 0,
3241
+ 0,
3242
+ 0,
3243
+ 0,
3244
+ 0,
3245
+ 0,
3246
+ 0,
3247
+ 0,
3248
+ 0,
3249
+ 0,
3250
+ 0,
3251
+ 0,
3252
+ 1,
3253
+ 1,
3254
+ 1,
3255
+ 1,
3256
+ 0,
3257
+ 0,
3258
+ 0,
3259
+ 0,
3260
+ 0,
3261
+ 0,
3262
+ 0,
3263
+ 0,
3264
+ 1,
3265
+ 1,
3266
+ 0,
3267
+ 0,
3268
+ 2,
3269
+ 2,
3270
+ 1,
3271
+ 1,
3272
+ 1,
3273
+ 0,
3274
+ 0,
3275
+ 0,
3276
+ 2,
3277
+ 2,
3278
+ 0,
3279
+ 0,
3280
+ 1,
3281
+ 1,
3282
+ 1,
3283
+ 0,
3284
+ 0,
3285
+ 1,
3286
+ 1,
3287
+ 1,
3288
+ 1,
3289
+ 2,
3290
+ 0,
3291
+ 0,
3292
+ 0,
3293
+ 0,
3294
+ 0,
3295
+ 0,
3296
+ 0,
3297
+ 2,
3298
+ 0,
3299
+ 0,
3300
+ 0,
3301
+ 0,
3302
+ 1,
3303
+ 1,
3304
+ 0,
3305
+ 0,
3306
+ 0,
3307
+ 0,
3308
+ 1,
3309
+ 1,
3310
+ 0,
3311
+ 0,
3312
+ 0,
3313
+ 0,
3314
+ 2,
3315
+ 2,
3316
+ 0,
3317
+ 0,
3318
+ 1,
3319
+ 1,
3320
+ 2,
3321
+ 2,
3322
+ 2,
3323
+ 2,
3324
+ 2,
3325
+ 2,
3326
+ 2,
3327
+ 2,
3328
+ 2,
3329
+ 2,
3330
+ 2,
3331
+ 2,
3332
+ 0,
3333
+ 0,
3334
+ 0,
3335
+ 0,
3336
+ 0,
3337
+ 0,
3338
+ 0,
3339
+ 0,
3340
+ 0,
3341
+ 0,
3342
+ 0,
3343
+ 0,
3344
+ 0,
3345
+ 0,
3346
+ 0,
3347
+ 0,
3348
+ 0,
3349
+ 0,
3350
+ 0,
3351
+ 0,
3352
+ 0,
3353
+ 0,
3354
+ 0,
3355
+ 0,
3356
+ 0,
3357
+ 0,
3358
+ 0,
3359
+ 0,
3360
+ 0,
3361
+ 0,
3362
+ 0,
3363
+ 0,
3364
+ 0,
3365
+ 0,
3366
+ 0,
3367
+ 0,
3368
+ 0,
3369
+ 0,
3370
+ 0,
3371
+ 0,
3372
+ 0,
3373
+ 0,
3374
+ 0,
3375
+ 0,
3376
+ 0,
3377
+ 0,
3378
+ 0,
3379
+ 0,
3380
+ 0,
3381
+ 0,
3382
+ 0,
3383
+ 0,
3384
+ 0,
3385
+ 0,
3386
+ 0,
3387
+ 0,
3388
+ 0,
3389
+ 0,
3390
+ 0,
3391
+ 0,
3392
+ 0,
3393
+ 0,
3394
+ 0,
3395
+ 0,
3396
+ 0,
3397
+ 0,
3398
+ 0,
3399
+ 0,
3400
+ 0,
3401
+ 0,
3402
+ 0,
3403
+ 0,
3404
+ 0,
3405
+ 0,
3406
+ 0,
3407
+ 0,
3408
+ 0,
3409
+ 0,
3410
+ 0,
3411
+ 0,
3412
+ 0,
3413
+ 0,
3414
+ 0,
3415
+ 0,
3416
+ 0,
3417
+ 0,
3418
+ 0,
3419
+ 0,
3420
+ 0,
3421
+ 0,
3422
+ 0,
3423
+ 0,
3424
+ 0,
3425
+ 0,
3426
+ 0,
3427
+ 0,
3428
+ 0,
3429
+ 0,
3430
+ 0,
3431
+ 0,
3432
+ 0,
3433
+ 0,
3434
+ 0,
3435
+ 0,
3436
+ 0,
3437
+ 0,
3438
+ 0,
3439
+ 0,
3440
+ 0,
3441
+ 0,
3442
+ 0,
3443
+ 0,
3444
+ 0,
3445
+ 0,
3446
+ 0,
3447
+ 0,
3448
+ 0,
3449
+ 0,
3450
+ 0,
3451
+ 0,
3452
+ 0,
3453
+ 0,
3454
+ 0,
3455
+ 0,
3456
+ 0,
3457
+ 0,
3458
+ 0,
3459
+ 0,
3460
+ 0,
3461
+ 0,
3462
+ 0,
3463
+ 0,
3464
+ 0,
3465
+ 0,
3466
+ 0,
3467
+ 0,
3468
+ 0,
3469
+ 0,
3470
+ 0,
3471
+ 0,
3472
+ 0,
3473
+ 0,
3474
+ 0,
3475
+ 0,
3476
+ 0,
3477
+ 0,
3478
+ 0,
3479
+ 0,
3480
+ 0,
3481
+ 0,
3482
+ 0,
3483
+ 0,
3484
+ 0,
3485
+ 0,
3486
+ 0,
3487
+ 0,
3488
+ 0,
3489
+ 0,
3490
+ 0,
3491
+ 0,
3492
+ 0,
3493
+ 0,
3494
+ 0,
3495
+ 0,
3496
+ 0,
3497
+ 0,
3498
+ 0,
3499
+ 2,
3500
+ 2,
3501
+ 2,
3502
+ 0,
3503
+ 0,
3504
+ 0,
3505
+ 0,
3506
+ 0,
3507
+ 0,
3508
+ 0,
3509
+ 0,
3510
+ 0,
3511
+ 0,
3512
+ 0,
3513
+ 0,
3514
+ 0,
3515
+ 0,
3516
+ 0,
3517
+ 0,
3518
+ 0,
3519
+ 0,
3520
+ 0,
3521
+ 0,
3522
+ 0,
3523
+ 0,
3524
+ 0,
3525
+ 0,
3526
+ 0,
3527
+ 0,
3528
+ 0,
3529
+ 0,
3530
+ 0,
3531
+ 0,
3532
+ 0,
3533
+ 0,
3534
+ 0,
3535
+ 0,
3536
+ 0,
3537
+ 0,
3538
+ 0,
3539
+ 0,
3540
+ 0,
3541
+ 0,
3542
+ 0,
3543
+ 0,
3544
+ 0,
3545
+ 0,
3546
+ 0,
3547
+ 0,
3548
+ 0,
3549
+ 0,
3550
+ 0,
3551
+ 0,
3552
+ 0,
3553
+ 0,
3554
+ 0,
3555
+ 0,
3556
+ 0,
3557
+ 0,
3558
+ 0,
3559
+ 0,
3560
+ 0,
3561
+ 0,
3562
+ 0,
3563
+ 0,
3564
+ 0,
3565
+ 0,
3566
+ 0,
3567
+ 0,
3568
+ 0,
3569
+ 0,
3570
+ 0,
3571
+ 0,
3572
+ 0,
3573
+ 0,
3574
+ 0,
3575
+ 0,
3576
+ 0,
3577
+ 0,
3578
+ 0,
3579
+ 0,
3580
+ 0,
3581
+ 0,
3582
+ 0,
3583
+ 0,
3584
+ 0,
3585
+ 0,
3586
+ 0,
3587
+ 0,
3588
+ 0,
3589
+ 0,
3590
+ 0,
3591
+ 0,
3592
+ 0,
3593
+ 0,
3594
+ 0,
3595
+ 0,
3596
+ 0,
3597
+ 0,
3598
+ 0,
3599
+ 0,
3600
+ 0,
3601
+ 0,
3602
+ 0,
3603
+ 0,
3604
+ 0,
3605
+ 0,
3606
+ 0,
3607
+ 0,
3608
+ 0,
3609
+ 0,
3610
+ 0,
3611
+ 0,
3612
+ 0,
3613
+ 0,
3614
+ 0,
3615
+ 0,
3616
+ 0,
3617
+ 0,
3618
+ 0,
3619
+ 0,
3620
+ 0,
3621
+ 0,
3622
+ 0,
3623
+ 0,
3624
+ 0,
3625
+ 0,
3626
+ 0,
3627
+ 0,
3628
+ 0,
3629
+ 0,
3630
+ 0,
3631
+ 0,
3632
+ 0,
3633
+ 0,
3634
+ 0,
3635
+ 0,
3636
+ 0,
3637
+ 0,
3638
+ 0,
3639
+ 0,
3640
+ 0,
3641
+ 0,
3642
+ 0,
3643
+ 0,
3644
+ 0,
3645
+ 0,
3646
+ 0,
3647
+ 0,
3648
+ 0,
3649
+ 0,
3650
+ 0,
3651
+ 0,
3652
+ 0,
3653
+ 0,
3654
+ 0,
3655
+ 0,
3656
+ 0,
3657
+ 0,
3658
+ 0,
3659
+ 0,
3660
+ 0,
3661
+ 0,
3662
+ 0,
3663
+ 0,
3664
+ 0,
3665
+ 0,
3666
+ 0,
3667
+ 0,
3668
+ 0,
3669
+ 0,
3670
+ 0,
3671
+ 0,
3672
+ 0,
3673
+ 0,
3674
+ 0,
3675
+ 0,
3676
+ 0,
3677
+ 0,
3678
+ 0,
3679
+ 0,
3680
+ 0,
3681
+ 0,
3682
+ 0,
3683
+ 0,
3684
+ 0,
3685
+ 0,
3686
+ 0,
3687
+ 0,
3688
+ 0,
3689
+ 0,
3690
+ 0,
3691
+ 0,
3692
+ 0,
3693
+ 0,
3694
+ 0,
3695
+ 0,
3696
+ 0,
3697
+ 0,
3698
+ 0,
3699
+ 0,
3700
+ 0,
3701
+ 0,
3702
+ 0,
3703
+ 0,
3704
+ 0,
3705
+ 0,
3706
+ 0,
3707
+ 0,
3708
+ 0,
3709
+ 0,
3710
+ 0,
3711
+ 0,
3712
+ 0,
3713
+ 0,
3714
+ 0,
3715
+ 0,
3716
+ 0,
3717
+ 0,
3718
+ 0,
3719
+ 0,
3720
+ 0,
3721
+ 0,
3722
+ 0,
3723
+ 0,
3724
+ 0,
3725
+ 0,
3726
+ 0,
3727
+ 0,
3728
+ 0,
3729
+ 0,
3730
+ 0,
3731
+ 0,
3732
+ 0,
3733
+ 0,
3734
+ 0,
3735
+ 0,
3736
+ 0,
3737
+ 0,
3738
+ 0,
3739
+ 0,
3740
+ 0,
3741
+ 0,
3742
+ 0,
3743
+ 0,
3744
+ 0,
3745
+ 0,
3746
+ 0,
3747
+ 0,
3748
+ 0,
3749
+ 0,
3750
+ 0,
3751
+ 0,
3752
+ 0,
3753
+ 0,
3754
+ 0,
3755
+ 0,
3756
+ 0,
3757
+ 0,
3758
+ 0,
3759
+ 0,
3760
+ 0,
3761
+ 0,
3762
+ 0,
3763
+ 0,
3764
+ 0,
3765
+ 0,
3766
+ 0,
3767
+ 0,
3768
+ 0,
3769
+ 0,
3770
+ 0,
3771
+ 0,
3772
+ 0,
3773
+ 0,
3774
+ 0,
3775
+ 0,
3776
+ 0,
3777
+ 0,
3778
+ 0,
3779
+ 0,
3780
+ 0,
3781
+ 0,
3782
+ 0,
3783
+ 0,
3784
+ 0,
3785
+ 0,
3786
+ 0,
3787
+ 0,
3788
+ 0,
3789
+ 0,
3790
+ 0,
3791
+ 0,
3792
+ 0,
3793
+ 0,
3794
+ 0,
3795
+ 0,
3796
+ 0,
3797
+ 0,
3798
+ 0,
3799
+ 0,
3800
+ 0,
3801
+ 0,
3802
+ 0,
3803
+ 0,
3804
+ 0,
3805
+ 0,
3806
+ 0,
3807
+ 2,
3808
+ 0,
3809
+ 0,
3810
+ 0,
3811
+ 0,
3812
+ 0,
3813
+ 0,
3814
+ 0,
3815
+ 0,
3816
+ 0,
3817
+ 0,
3818
+ 0,
3819
+ 0,
3820
+ 0,
3821
+ 0,
3822
+ 0,
3823
+ 0,
3824
+ 0,
3825
+ 0,
3826
+ 0,
3827
+ 0,
3828
+ 0,
3829
+ 0,
3830
+ 0,
3831
+ 0,
3832
+ 0,
3833
+ 0,
3834
+ 0,
3835
+ 0,
3836
+ 0,
3837
+ 0,
3838
+ 0,
3839
+ 0,
3840
+ 0,
3841
+ 0,
3842
+ 0,
3843
+ 0,
3844
+ 0,
3845
+ 0,
3846
+ 0,
3847
+ 0,
3848
+ 0,
3849
+ 0,
3850
+ 0,
3851
+ 0,
3852
+ 2,
3853
+ 0,
3854
+ 0,
3855
+ 0,
3856
+ 0,
3857
+ 0,
3858
+ 0,
3859
+ 0,
3860
+ 0,
3861
+ 0,
3862
+ 0,
3863
+ 0,
3864
+ 0,
3865
+ 0,
3866
+ 0,
3867
+ 0,
3868
+ 0,
3869
+ 0,
3870
+ 0,
3871
+ 0,
3872
+ 0,
3873
+ 2,
3874
+ 2,
3875
+ 2,
3876
+ 0,
3877
+ 0,
3878
+ 0,
3879
+ 0,
3880
+ 0,
3881
+ 0,
3882
+ 0,
3883
+ 0,
3884
+ 0,
3885
+ 0,
3886
+ 0,
3887
+ 0,
3888
+ 0,
3889
+ 0,
3890
+ 0,
3891
+ 0,
3892
+ 0,
3893
+ 0,
3894
+ 0,
3895
+ 0,
3896
+ 0,
3897
+ 0,
3898
+ 0,
3899
+ 0,
3900
+ 0,
3901
+ 0,
3902
+ 0,
3903
+ 0,
3904
+ 0,
3905
+ 0,
3906
+ 0,
3907
+ 0,
3908
+ 0,
3909
+ 0,
3910
+ 0,
3911
+ 0,
3912
+ 2,
3913
+ 0,
3914
+ 0,
3915
+ 0,
3916
+ 0,
3917
+ 0,
3918
+ 0,
3919
+ 0,
3920
+ 0,
3921
+ 0,
3922
+ 0,
3923
+ 0,
3924
+ 0,
3925
+ 0,
3926
+ 0,
3927
+ 0,
3928
+ 0,
3929
+ 0,
3930
+ 0,
3931
+ 0,
3932
+ 0,
3933
+ 0,
3934
+ 0,
3935
+ 0,
3936
+ 0,
3937
+ 0,
3938
+ 0,
3939
+ 0,
3940
+ 0,
3941
+ 0,
3942
+ 0,
3943
+ 0,
3944
+ 0,
3945
+ 0,
3946
+ 0,
3947
+ 0,
3948
+ 0,
3949
+ 0,
3950
+ 0,
3951
+ 0,
3952
+ 0,
3953
+ 0,
3954
+ 0,
3955
+ 0,
3956
+ 0,
3957
+ 0,
3958
+ 0,
3959
+ 0,
3960
+ 0,
3961
+ 0,
3962
+ 0,
3963
+ 0,
3964
+ 0,
3965
+ 0,
3966
+ 0,
3967
+ 0,
3968
+ 0,
3969
+ 0,
3970
+ 0,
3971
+ 0,
3972
+ 0,
3973
+ 0,
3974
+ 0,
3975
+ 0,
3976
+ 0,
3977
+ 0,
3978
+ 0,
3979
+ 0,
3980
+ 0,
3981
+ 0,
3982
+ 0,
3983
+ 0,
3984
+ 0,
3985
+ 0,
3986
+ 0,
3987
+ 0,
3988
+ 0,
3989
+ 0,
3990
+ 0,
3991
+ 0,
3992
+ 0,
3993
+ 0,
3994
+ 0,
3995
+ 0,
3996
+ 0,
3997
+ 0,
3998
+ 0,
3999
+ 0,
4000
+ 0,
4001
+ 0,
4002
+ 0,
4003
+ 0,
4004
+ 0,
4005
+ 0,
4006
+ 0,
4007
+ 0,
4008
+ 0,
4009
+ 0,
4010
+ 0,
4011
+ 0,
4012
+ 0,
4013
+ 0,
4014
+ 0,
4015
+ 0,
4016
+ 0,
4017
+ 0,
4018
+ 0,
4019
+ 0,
4020
+ 0,
4021
+ 0,
4022
+ 0,
4023
+ 0,
4024
+ 0,
4025
+ 0,
4026
+ 0,
4027
+ 0,
4028
+ 0,
4029
+ 0,
4030
+ 0,
4031
+ 0,
4032
+ 0,
4033
+ 0,
4034
+ 0,
4035
+ 0,
4036
+ 0,
4037
+ 0,
4038
+ 0,
4039
+ 0,
4040
+ 0,
4041
+ 0,
4042
+ 0,
4043
+ 0,
4044
+ 0,
4045
+ 0,
4046
+ 0,
4047
+ 0,
4048
+ 0,
4049
+ 0,
4050
+ 0,
4051
+ 0,
4052
+ 0,
4053
+ 0,
4054
+ 0,
4055
+ 0,
4056
+ 0,
4057
+ 0,
4058
+ 0,
4059
+ 0,
4060
+ 0,
4061
+ 0,
4062
+ 0,
4063
+ 0,
4064
+ 0,
4065
+ 0,
4066
+ 0,
4067
+ 0,
4068
+ 0,
4069
+ 0,
4070
+ 0,
4071
+ 0,
4072
+ 0,
4073
+ 0,
4074
+ 0,
4075
+ 0,
4076
+ 0,
4077
+ 0,
4078
+ 0,
4079
+ 0,
4080
+ 2,
4081
+ 2,
4082
+ 2,
4083
+ 2,
4084
+ 2,
4085
+ 2,
4086
+ 2,
4087
+ 2,
4088
+ 2,
4089
+ 2,
4090
+ 2,
4091
+ 2,
4092
+ 2,
4093
+ 2,
4094
+ 2,
4095
+ 2,
4096
+ 2,
4097
+ 2,
4098
+ 2,
4099
+ 2,
4100
+ 2,
4101
+ 2,
4102
+ 2,
4103
+ 2,
4104
+ 2,
4105
+ 2,
4106
+ 2,
4107
+ 2,
4108
+ 2,
4109
+ 2,
4110
+ 2,
4111
+ 2,
4112
+ 2,
4113
+ 1,
4114
+ 1,
4115
+ 1,
4116
+ 1,
4117
+ 1,
4118
+ 1,
4119
+ 1,
4120
+ 1,
4121
+ 1,
4122
+ 1,
4123
+ 1,
4124
+ 1,
4125
+ 1,
4126
+ 1,
4127
+ 1,
4128
+ 1,
4129
+ 1,
4130
+ 0,
4131
+ 0,
4132
+ 0,
4133
+ 0,
4134
+ 0,
4135
+ 0,
4136
+ 0,
4137
+ 0,
4138
+ 0,
4139
+ 0,
4140
+ 0,
4141
+ 0,
4142
+ 0,
4143
+ 0,
4144
+ 0,
4145
+ 2,
4146
+ 2,
4147
+ 2,
4148
+ 2,
4149
+ 2,
4150
+ 1,
4151
+ 1,
4152
+ 1,
4153
+ 1,
4154
+ 1,
4155
+ 1,
4156
+ 2,
4157
+ 2,
4158
+ 2,
4159
+ 2,
4160
+ 2,
4161
+ 2,
4162
+ 2,
4163
+ 2,
4164
+ 2,
4165
+ 2,
4166
+ 2,
4167
+ 2,
4168
+ 2,
4169
+ 2,
4170
+ 2,
4171
+ 2,
4172
+ 2,
4173
+ 2,
4174
+ 2,
4175
+ 2,
4176
+ 2,
4177
+ 2,
4178
+ 0,
4179
+ 2,
4180
+ 2,
4181
+ 0,
4182
+ 2,
4183
+ 0,
4184
+ 2,
4185
+ 2,
4186
+ 2,
4187
+ 2,
4188
+ 2,
4189
+ 2,
4190
+ 2,
4191
+ 2,
4192
+ 2,
4193
+ 2,
4194
+ 2,
4195
+ 2,
4196
+ 2,
4197
+ 2,
4198
+ 2,
4199
+ 2,
4200
+ 2,
4201
+ 2,
4202
+ 2,
4203
+ 2,
4204
+ 2,
4205
+ 2,
4206
+ 2,
4207
+ 2,
4208
+ 2,
4209
+ 2,
4210
+ 2,
4211
+ 2,
4212
+ 2,
4213
+ 2,
4214
+ 2,
4215
+ 2,
4216
+ 2,
4217
+ 2,
4218
+ 2,
4219
+ 2,
4220
+ 2,
4221
+ 2,
4222
+ 2,
4223
+ 2,
4224
+ 2,
4225
+ 2,
4226
+ 2,
4227
+ 2,
4228
+ 2,
4229
+ 2,
4230
+ 2,
4231
+ 2,
4232
+ 2,
4233
+ 2,
4234
+ 2,
4235
+ 2,
4236
+ 2,
4237
+ 2,
4238
+ 2,
4239
+ 2,
4240
+ 2,
4241
+ 2,
4242
+ 2,
4243
+ 2,
4244
+ 2,
4245
+ 2,
4246
+ 2,
4247
+ 2,
4248
+ 2,
4249
+ 2,
4250
+ 2,
4251
+ 2,
4252
+ 2,
4253
+ 2,
4254
+ 2,
4255
+ 2,
4256
+ 2,
4257
+ 2,
4258
+ 2,
4259
+ 2,
4260
+ 2,
4261
+ 2,
4262
+ 2,
4263
+ 2,
4264
+ 2,
4265
+ 2,
4266
+ 2,
4267
+ 2,
4268
+ 2,
4269
+ 2,
4270
+ 2,
4271
+ 2,
4272
+ 2,
4273
+ 2,
4274
+ 2,
4275
+ 2,
4276
+ 2,
4277
+ 2,
4278
+ 2,
4279
+ 2,
4280
+ 2,
4281
+ 2,
4282
+ 2,
4283
+ 2,
4284
+ 2,
4285
+ 2,
4286
+ 2,
4287
+ 2,
4288
+ 2,
4289
+ 2,
4290
+ 2,
4291
+ 2,
4292
+ 2,
4293
+ 2,
4294
+ 2,
4295
+ 2,
4296
+ 2,
4297
+ 2,
4298
+ 2,
4299
+ 2,
4300
+ 2,
4301
+ 2,
4302
+ 2,
4303
+ 2,
4304
+ 2,
4305
+ 2,
4306
+ 2,
4307
+ 2,
4308
+ 2,
4309
+ 2,
4310
+ 2,
4311
+ 2,
4312
+ 2,
4313
+ 2,
4314
+ 2,
4315
+ 2,
4316
+ 2,
4317
+ 2,
4318
+ 2,
4319
+ 2,
4320
+ 2,
4321
+ 2,
4322
+ 2,
4323
+ 2,
4324
+ 2,
4325
+ 2,
4326
+ 2,
4327
+ 2,
4328
+ 2,
4329
+ 2,
4330
+ 2,
4331
+ 2,
4332
+ 2,
4333
+ 2,
4334
+ 2,
4335
+ 2,
4336
+ 2,
4337
+ 2,
4338
+ 2,
4339
+ 2,
4340
+ 2,
4341
+ 2,
4342
+ 2,
4343
+ 2,
4344
+ 2,
4345
+ 2,
4346
+ 2,
4347
+ 2,
4348
+ 2,
4349
+ 2,
4350
+ 2,
4351
+ 2,
4352
+ 2,
4353
+ 2,
4354
+ 2,
4355
+ 2,
4356
+ 2,
4357
+ 2,
4358
+ 2,
4359
+ 2,
4360
+ 2,
4361
+ 2,
4362
+ 2,
4363
+ 2,
4364
+ 2,
4365
+ 2,
4366
+ 2,
4367
+ 2,
4368
+ 2,
4369
+ 2,
4370
+ 2,
4371
+ 2,
4372
+ 2,
4373
+ 2,
4374
+ 2,
4375
+ 2,
4376
+ 2,
4377
+ 2,
4378
+ 2,
4379
+ 2,
4380
+ 2,
4381
+ 2,
4382
+ 2,
4383
+ 2,
4384
+ 2,
4385
+ 2,
4386
+ 2,
4387
+ 2,
4388
+ 2,
4389
+ 2,
4390
+ 2,
4391
+ 2,
4392
+ 2,
4393
+ 2,
4394
+ 2,
4395
+ 2,
4396
+ 2,
4397
+ 2,
4398
+ 2,
4399
+ 2,
4400
+ 2,
4401
+ 2,
4402
+ 2,
4403
+ 2,
4404
+ 2,
4405
+ 2,
4406
+ 2,
4407
+ 2,
4408
+ 2,
4409
+ 2,
4410
+ 2,
4411
+ 2,
4412
+ 2,
4413
+ 2,
4414
+ 2,
4415
+ 2,
4416
+ 2,
4417
+ 2,
4418
+ 2,
4419
+ 2,
4420
+ 2,
4421
+ 2,
4422
+ 0,
4423
+ 0,
4424
+ 0,
4425
+ 0,
4426
+ 0,
4427
+ 0,
4428
+ 0,
4429
+ 0,
4430
+ 0,
4431
+ 0,
4432
+ 0,
4433
+ 0,
4434
+ 0,
4435
+ 0,
4436
+ 0,
4437
+ 0,
4438
+ 0,
4439
+ 0,
4440
+ 0,
4441
+ 2,
4442
+ 2,
4443
+ 1,
4444
+ 1,
4445
+ 1,
4446
+ 0,
4447
+ 0,
4448
+ 1,
4449
+ 1,
4450
+ 1,
4451
+ 1,
4452
+ 1,
4453
+ 2
4454
+ ],
4455
+ "logs": [
4456
+ {
4457
+ "epoch": 0,
4458
+ "train_loss": 0.5677797354900154,
4459
+ "val_macro_f1": 0.592232633089784
4460
+ },
4461
+ {
4462
+ "epoch": 1,
4463
+ "train_loss": 0.4545698167791792,
4464
+ "val_macro_f1": 0.604437698177766
4465
+ },
4466
+ {
4467
+ "epoch": 2,
4468
+ "train_loss": 0.4273961460704257,
4469
+ "val_macro_f1": 0.6090933641564936
4470
+ },
4471
+ {
4472
+ "epoch": 3,
4473
+ "train_loss": 0.40763816768956035,
4474
+ "val_macro_f1": 0.610777865958665
4475
+ },
4476
+ {
4477
+ "epoch": 4,
4478
+ "train_loss": 0.3948697293070471,
4479
+ "val_macro_f1": 0.6355935637826163
4480
+ },
4481
+ {
4482
+ "epoch": 5,
4483
+ "train_loss": 0.38202083196229997,
4484
+ "val_macro_f1": 0.7193665327851014
4485
+ },
4486
+ {
4487
+ "epoch": 6,
4488
+ "train_loss": 0.37681593902551447,
4489
+ "val_macro_f1": 0.7046550710595891
4490
+ },
4491
+ {
4492
+ "epoch": 7,
4493
+ "train_loss": 0.3684334899209867,
4494
+ "val_macro_f1": 0.7040061253703519
4495
+ },
4496
+ {
4497
+ "epoch": 8,
4498
+ "train_loss": 0.36200026218678544,
4499
+ "val_macro_f1": 0.6820087370257072
4500
+ },
4501
+ {
4502
+ "epoch": 9,
4503
+ "train_loss": 0.3574927460615802,
4504
+ "val_macro_f1": 0.6991856086384466
4505
+ },
4506
+ {
4507
+ "epoch": 10,
4508
+ "train_loss": 0.34856044183111495,
4509
+ "val_macro_f1": 0.6832906568276146
4510
+ }
4511
+ ]
4512
+ }
stage1_final/results/resized/resnet/target3_resnet_fold0_val.json ADDED
@@ -0,0 +1,172 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 0,
3
+ "metrics": {
4
+ "macro_f1": 0.7669097256604953,
5
+ "accuracy": 0.9596613545816733,
6
+ "balanced_acc": 0.7458459304900263,
7
+ "per_class_recall": {
8
+ "malignant": 0.9671052631578947,
9
+ "non_malignant": 0.2857142857142857,
10
+ "non_roi": 0.9847182425978988
11
+ },
12
+ "per_class_precision": {
13
+ "malignant": 0.9545454545454546,
14
+ "non_malignant": 0.4827586206896552,
15
+ "non_roi": 0.9772511848341232
16
+ },
17
+ "confusion_matrix": [
18
+ [
19
+ 882,
20
+ 10,
21
+ 20
22
+ ],
23
+ [
24
+ 31,
25
+ 14,
26
+ 4
27
+ ],
28
+ [
29
+ 11,
30
+ 5,
31
+ 1031
32
+ ]
33
+ ],
34
+ "classification_report": {
35
+ "malignant": {
36
+ "precision": 0.9545454545454546,
37
+ "recall": 0.9671052631578947,
38
+ "f1-score": 0.9607843137254902,
39
+ "support": 912.0
40
+ },
41
+ "non_malignant": {
42
+ "precision": 0.4827586206896552,
43
+ "recall": 0.2857142857142857,
44
+ "f1-score": 0.358974358974359,
45
+ "support": 49.0
46
+ },
47
+ "non_roi": {
48
+ "precision": 0.9772511848341232,
49
+ "recall": 0.9847182425978988,
50
+ "f1-score": 0.9809705042816366,
51
+ "support": 1047.0
52
+ },
53
+ "accuracy": 0.9596613545816733,
54
+ "macro avg": {
55
+ "precision": 0.8048517533564109,
56
+ "recall": 0.7458459304900263,
57
+ "f1-score": 0.7669097256604953,
58
+ "support": 2008.0
59
+ },
60
+ "weighted avg": {
61
+ "precision": 0.9548718214544695,
62
+ "recall": 0.9596613545816733,
63
+ "f1-score": 0.9566240815190559,
64
+ "support": 2008.0
65
+ }
66
+ },
67
+ "n": 2008,
68
+ "src_B_acc": 0.9880597014925373,
69
+ "src_B_n": 670,
70
+ "src_C_acc": 0.9435351882160393,
71
+ "src_C_n": 1222,
72
+ "src_D_acc": 0.9655172413793104,
73
+ "src_D_n": 116
74
+ },
75
+ "logs": [
76
+ {
77
+ "epoch": 0,
78
+ "train_loss": 0.6050805728511507,
79
+ "val_macro_f1": 0.6313669416249618
80
+ },
81
+ {
82
+ "epoch": 1,
83
+ "train_loss": 0.4691683718882709,
84
+ "val_macro_f1": 0.6391362154941193
85
+ },
86
+ {
87
+ "epoch": 2,
88
+ "train_loss": 0.4380907803417677,
89
+ "val_macro_f1": 0.6349674478966452
90
+ },
91
+ {
92
+ "epoch": 3,
93
+ "train_loss": 0.4171715313457398,
94
+ "val_macro_f1": 0.6412973341427826
95
+ },
96
+ {
97
+ "epoch": 4,
98
+ "train_loss": 0.40251701405323836,
99
+ "val_macro_f1": 0.6427553517132649
100
+ },
101
+ {
102
+ "epoch": 5,
103
+ "train_loss": 0.39060967115766976,
104
+ "val_macro_f1": 0.7011805263583774
105
+ },
106
+ {
107
+ "epoch": 6,
108
+ "train_loss": 0.38212327688813685,
109
+ "val_macro_f1": 0.6519419773403696
110
+ },
111
+ {
112
+ "epoch": 7,
113
+ "train_loss": 0.37417113199177016,
114
+ "val_macro_f1": 0.7054602717350882
115
+ },
116
+ {
117
+ "epoch": 8,
118
+ "train_loss": 0.36605466801331815,
119
+ "val_macro_f1": 0.7064377891399604
120
+ },
121
+ {
122
+ "epoch": 9,
123
+ "train_loss": 0.36623483813141444,
124
+ "val_macro_f1": 0.7023099110211101
125
+ },
126
+ {
127
+ "epoch": 10,
128
+ "train_loss": 0.35619951244369447,
129
+ "val_macro_f1": 0.7164318675792903
130
+ },
131
+ {
132
+ "epoch": 11,
133
+ "train_loss": 0.35203937182863393,
134
+ "val_macro_f1": 0.6979816727799437
135
+ },
136
+ {
137
+ "epoch": 12,
138
+ "train_loss": 0.34607618999671175,
139
+ "val_macro_f1": 0.6973895721863203
140
+ },
141
+ {
142
+ "epoch": 13,
143
+ "train_loss": 0.3474459091268213,
144
+ "val_macro_f1": 0.7669097256604953
145
+ },
146
+ {
147
+ "epoch": 14,
148
+ "train_loss": 0.340821238390478,
149
+ "val_macro_f1": 0.7266668393022071
150
+ },
151
+ {
152
+ "epoch": 15,
153
+ "train_loss": 0.33871670631298506,
154
+ "val_macro_f1": 0.7486194607955093
155
+ },
156
+ {
157
+ "epoch": 16,
158
+ "train_loss": 0.33838437028615126,
159
+ "val_macro_f1": 0.7351403165632654
160
+ },
161
+ {
162
+ "epoch": 17,
163
+ "train_loss": 0.3343004012012862,
164
+ "val_macro_f1": 0.738138756627643
165
+ },
166
+ {
167
+ "epoch": 18,
168
+ "train_loss": 0.3341703215443281,
169
+ "val_macro_f1": 0.7374761573037435
170
+ }
171
+ ]
172
+ }
stage1_final/results/resized/resnet/target3_resnet_fold1_val.json ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 1,
3
+ "metrics": {
4
+ "macro_f1": 0.7695141113129838,
5
+ "accuracy": 0.8963807635101636,
6
+ "balanced_acc": 0.7773867132285691,
7
+ "per_class_recall": {
8
+ "malignant": 0.9078947368421053,
9
+ "non_malignant": 0.52,
10
+ "non_roi": 0.9042654028436019
11
+ },
12
+ "per_class_precision": {
13
+ "malignant": 0.891280947255113,
14
+ "non_malignant": 0.4727272727272727,
15
+ "non_roi": 0.9235237173281704
16
+ },
17
+ "confusion_matrix": [
18
+ [
19
+ 828,
20
+ 13,
21
+ 71
22
+ ],
23
+ [
24
+ 16,
25
+ 26,
26
+ 8
27
+ ],
28
+ [
29
+ 85,
30
+ 16,
31
+ 954
32
+ ]
33
+ ],
34
+ "classification_report": {
35
+ "malignant": {
36
+ "precision": 0.891280947255113,
37
+ "recall": 0.9078947368421053,
38
+ "f1-score": 0.8995111352525801,
39
+ "support": 912.0
40
+ },
41
+ "non_malignant": {
42
+ "precision": 0.4727272727272727,
43
+ "recall": 0.52,
44
+ "f1-score": 0.49523809523809526,
45
+ "support": 50.0
46
+ },
47
+ "non_roi": {
48
+ "precision": 0.9235237173281704,
49
+ "recall": 0.9042654028436019,
50
+ "f1-score": 0.9137931034482759,
51
+ "support": 1055.0
52
+ },
53
+ "accuracy": 0.8963807635101636,
54
+ "macro avg": {
55
+ "precision": 0.7625106457701855,
56
+ "recall": 0.7773867132285691,
57
+ "f1-score": 0.7695141113129838,
58
+ "support": 2017.0
59
+ },
60
+ "weighted avg": {
61
+ "precision": 0.8977700095757296,
62
+ "recall": 0.8963807635101636,
63
+ "f1-score": 0.8969597343828404,
64
+ "support": 2017.0
65
+ }
66
+ },
67
+ "n": 2017,
68
+ "src_B_acc": 0.9024725274725275,
69
+ "src_B_n": 728,
70
+ "src_C_acc": 0.9,
71
+ "src_C_n": 1090,
72
+ "src_D_acc": 0.8542713567839196,
73
+ "src_D_n": 199
74
+ },
75
+ "logs": [
76
+ {
77
+ "epoch": 0,
78
+ "train_loss": 0.5862791400506677,
79
+ "val_macro_f1": 0.5755450631329523
80
+ },
81
+ {
82
+ "epoch": 1,
83
+ "train_loss": 0.4544045711418547,
84
+ "val_macro_f1": 0.5713652143056487
85
+ },
86
+ {
87
+ "epoch": 2,
88
+ "train_loss": 0.42114763300257374,
89
+ "val_macro_f1": 0.5954653250218861
90
+ },
91
+ {
92
+ "epoch": 3,
93
+ "train_loss": 0.40235607320094013,
94
+ "val_macro_f1": 0.6007487710750304
95
+ },
96
+ {
97
+ "epoch": 4,
98
+ "train_loss": 0.39150939412800917,
99
+ "val_macro_f1": 0.5769832403360954
100
+ },
101
+ {
102
+ "epoch": 5,
103
+ "train_loss": 0.3808657033035005,
104
+ "val_macro_f1": 0.6036042429230637
105
+ },
106
+ {
107
+ "epoch": 6,
108
+ "train_loss": 0.3696990492809341,
109
+ "val_macro_f1": 0.6248364813435859
110
+ },
111
+ {
112
+ "epoch": 7,
113
+ "train_loss": 0.36666548252105713,
114
+ "val_macro_f1": 0.6668540381895748
115
+ },
116
+ {
117
+ "epoch": 8,
118
+ "train_loss": 0.3611885702230066,
119
+ "val_macro_f1": 0.6902881369239225
120
+ },
121
+ {
122
+ "epoch": 9,
123
+ "train_loss": 0.35643412618048165,
124
+ "val_macro_f1": 0.6992416997135407
125
+ },
126
+ {
127
+ "epoch": 10,
128
+ "train_loss": 0.35112619055694794,
129
+ "val_macro_f1": 0.6875010103798656
130
+ },
131
+ {
132
+ "epoch": 11,
133
+ "train_loss": 0.3442631365056057,
134
+ "val_macro_f1": 0.727497245564409
135
+ },
136
+ {
137
+ "epoch": 12,
138
+ "train_loss": 0.34078379432518646,
139
+ "val_macro_f1": 0.7472320111548997
140
+ },
141
+ {
142
+ "epoch": 13,
143
+ "train_loss": 0.3370276197969201,
144
+ "val_macro_f1": 0.7121640775213388
145
+ },
146
+ {
147
+ "epoch": 14,
148
+ "train_loss": 0.3344917253431571,
149
+ "val_macro_f1": 0.7411823330799567
150
+ },
151
+ {
152
+ "epoch": 15,
153
+ "train_loss": 0.33370923117337475,
154
+ "val_macro_f1": 0.7357283607309165
155
+ },
156
+ {
157
+ "epoch": 16,
158
+ "train_loss": 0.33070088584584545,
159
+ "val_macro_f1": 0.7581841925508507
160
+ },
161
+ {
162
+ "epoch": 17,
163
+ "train_loss": 0.3309394530803559,
164
+ "val_macro_f1": 0.7379255692674273
165
+ },
166
+ {
167
+ "epoch": 18,
168
+ "train_loss": 0.3275098101313846,
169
+ "val_macro_f1": 0.7521121189582995
170
+ },
171
+ {
172
+ "epoch": 19,
173
+ "train_loss": 0.32701652505958223,
174
+ "val_macro_f1": 0.751110037134488
175
+ },
176
+ {
177
+ "epoch": 20,
178
+ "train_loss": 0.3248174125217347,
179
+ "val_macro_f1": 0.7695141113129838
180
+ },
181
+ {
182
+ "epoch": 21,
183
+ "train_loss": 0.324052482487196,
184
+ "val_macro_f1": 0.7411399841324112
185
+ },
186
+ {
187
+ "epoch": 22,
188
+ "train_loss": 0.32497002973974465,
189
+ "val_macro_f1": 0.7332669142568652
190
+ },
191
+ {
192
+ "epoch": 23,
193
+ "train_loss": 0.32566232332195416,
194
+ "val_macro_f1": 0.7649247320535896
195
+ },
196
+ {
197
+ "epoch": 24,
198
+ "train_loss": 0.3248545466903671,
199
+ "val_macro_f1": 0.7485859760034078
200
+ }
201
+ ]
202
+ }
stage1_final/results/resized/resnet/target3_resnet_fold2_val.json ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 2,
3
+ "metrics": {
4
+ "macro_f1": 0.6957840963889788,
5
+ "accuracy": 0.9300804828973843,
6
+ "balanced_acc": 0.6805923645530574,
7
+ "per_class_recall": {
8
+ "malignant": 0.9407894736842105,
9
+ "non_malignant": 0.14285714285714285,
10
+ "non_roi": 0.9581304771178188
11
+ },
12
+ "per_class_precision": {
13
+ "malignant": 0.9186295503211992,
14
+ "non_malignant": 0.35,
15
+ "non_roi": 0.9516441005802708
16
+ },
17
+ "confusion_matrix": [
18
+ [
19
+ 858,
20
+ 13,
21
+ 41
22
+ ],
23
+ [
24
+ 33,
25
+ 7,
26
+ 9
27
+ ],
28
+ [
29
+ 43,
30
+ 0,
31
+ 984
32
+ ]
33
+ ],
34
+ "classification_report": {
35
+ "malignant": {
36
+ "precision": 0.9186295503211992,
37
+ "recall": 0.9407894736842105,
38
+ "f1-score": 0.9295774647887324,
39
+ "support": 912.0
40
+ },
41
+ "non_malignant": {
42
+ "precision": 0.35,
43
+ "recall": 0.14285714285714285,
44
+ "f1-score": 0.2028985507246377,
45
+ "support": 49.0
46
+ },
47
+ "non_roi": {
48
+ "precision": 0.9516441005802708,
49
+ "recall": 0.9581304771178188,
50
+ "f1-score": 0.9548762736535662,
51
+ "support": 1027.0
52
+ },
53
+ "accuracy": 0.9300804828973843,
54
+ "macro avg": {
55
+ "precision": 0.7400912169671566,
56
+ "recall": 0.6805923645530574,
57
+ "f1-score": 0.6957840963889788,
58
+ "support": 1988.0
59
+ },
60
+ "weighted avg": {
61
+ "precision": 0.9216693366141206,
62
+ "recall": 0.9300804828973843,
63
+ "f1-score": 0.9247357192731607,
64
+ "support": 1988.0
65
+ }
66
+ },
67
+ "n": 1988,
68
+ "src_B_acc": 0.9372496662216289,
69
+ "src_B_n": 749,
70
+ "src_C_acc": 0.9491525423728814,
71
+ "src_C_n": 1062,
72
+ "src_D_acc": 0.7853107344632768,
73
+ "src_D_n": 177
74
+ },
75
+ "logs": [
76
+ {
77
+ "epoch": 0,
78
+ "train_loss": 0.5996393859386444,
79
+ "val_macro_f1": 0.6168862009731272
80
+ },
81
+ {
82
+ "epoch": 1,
83
+ "train_loss": 0.4565472359222079,
84
+ "val_macro_f1": 0.6178196104563186
85
+ },
86
+ {
87
+ "epoch": 2,
88
+ "train_loss": 0.4275396502916775,
89
+ "val_macro_f1": 0.6248186330660558
90
+ },
91
+ {
92
+ "epoch": 3,
93
+ "train_loss": 0.40960738121990176,
94
+ "val_macro_f1": 0.6249745683158534
95
+ },
96
+ {
97
+ "epoch": 4,
98
+ "train_loss": 0.3959436754858683,
99
+ "val_macro_f1": 0.6494977310563619
100
+ },
101
+ {
102
+ "epoch": 5,
103
+ "train_loss": 0.38486289138358737,
104
+ "val_macro_f1": 0.6957840963889788
105
+ },
106
+ {
107
+ "epoch": 6,
108
+ "train_loss": 0.37389940437343383,
109
+ "val_macro_f1": 0.678817239829529
110
+ },
111
+ {
112
+ "epoch": 7,
113
+ "train_loss": 0.3681201468857508,
114
+ "val_macro_f1": 0.6567043012927218
115
+ },
116
+ {
117
+ "epoch": 8,
118
+ "train_loss": 0.3602101288381077,
119
+ "val_macro_f1": 0.6592877140336414
120
+ },
121
+ {
122
+ "epoch": 9,
123
+ "train_loss": 0.35944106548078475,
124
+ "val_macro_f1": 0.6518638964167419
125
+ },
126
+ {
127
+ "epoch": 10,
128
+ "train_loss": 0.35268214782552115,
129
+ "val_macro_f1": 0.648521002542589
130
+ }
131
+ ]
132
+ }
stage1_final/results/resized/resnet/target3_resnet_fold3_val.json ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 3,
3
+ "metrics": {
4
+ "macro_f1": 0.7079227203005706,
5
+ "accuracy": 0.8948905109489051,
6
+ "balanced_acc": 0.7567419728865512,
7
+ "per_class_recall": {
8
+ "malignant": 0.8981380065717415,
9
+ "non_malignant": 0.46,
10
+ "non_roi": 0.9120879120879121
11
+ },
12
+ "per_class_precision": {
13
+ "malignant": 0.9244644870349493,
14
+ "non_malignant": 0.2072072072072072,
15
+ "non_roi": 0.9422894985808893
16
+ },
17
+ "confusion_matrix": [
18
+ [
19
+ 820,
20
+ 36,
21
+ 57
22
+ ],
23
+ [
24
+ 23,
25
+ 23,
26
+ 4
27
+ ],
28
+ [
29
+ 44,
30
+ 52,
31
+ 996
32
+ ]
33
+ ],
34
+ "classification_report": {
35
+ "malignant": {
36
+ "precision": 0.9244644870349493,
37
+ "recall": 0.8981380065717415,
38
+ "f1-score": 0.9111111111111111,
39
+ "support": 913.0
40
+ },
41
+ "non_malignant": {
42
+ "precision": 0.2072072072072072,
43
+ "recall": 0.46,
44
+ "f1-score": 0.2857142857142857,
45
+ "support": 50.0
46
+ },
47
+ "non_roi": {
48
+ "precision": 0.9422894985808893,
49
+ "recall": 0.9120879120879121,
50
+ "f1-score": 0.9269427640763146,
51
+ "support": 1092.0
52
+ },
53
+ "accuracy": 0.8948905109489051,
54
+ "macro avg": {
55
+ "precision": 0.6913203976076819,
56
+ "recall": 0.7567419728865512,
57
+ "f1-score": 0.7079227203005706,
58
+ "support": 2055.0
59
+ },
60
+ "weighted avg": {
61
+ "precision": 0.9164849486489539,
62
+ "recall": 0.8948905109489051,
63
+ "f1-score": 0.9043073757184887,
64
+ "support": 2055.0
65
+ }
66
+ },
67
+ "n": 2055,
68
+ "src_B_acc": 0.9451327433628318,
69
+ "src_B_n": 565,
70
+ "src_C_acc": 0.8691507798960139,
71
+ "src_C_n": 1154,
72
+ "src_D_acc": 0.8988095238095238,
73
+ "src_D_n": 336
74
+ },
75
+ "logs": [
76
+ {
77
+ "epoch": 0,
78
+ "train_loss": 0.5900231055021286,
79
+ "val_macro_f1": 0.6036015909458324
80
+ },
81
+ {
82
+ "epoch": 1,
83
+ "train_loss": 0.4523381717205048,
84
+ "val_macro_f1": 0.5951500769302872
85
+ },
86
+ {
87
+ "epoch": 2,
88
+ "train_loss": 0.42416903913021087,
89
+ "val_macro_f1": 0.6055980862452174
90
+ },
91
+ {
92
+ "epoch": 3,
93
+ "train_loss": 0.4073605946302414,
94
+ "val_macro_f1": 0.5989113112293961
95
+ },
96
+ {
97
+ "epoch": 4,
98
+ "train_loss": 0.3907556425333023,
99
+ "val_macro_f1": 0.6289632425897458
100
+ },
101
+ {
102
+ "epoch": 5,
103
+ "train_loss": 0.38582120859622954,
104
+ "val_macro_f1": 0.6662972117930456
105
+ },
106
+ {
107
+ "epoch": 6,
108
+ "train_loss": 0.3755620759725571,
109
+ "val_macro_f1": 0.6664676396874539
110
+ },
111
+ {
112
+ "epoch": 7,
113
+ "train_loss": 0.36996381974220277,
114
+ "val_macro_f1": 0.6939644912691444
115
+ },
116
+ {
117
+ "epoch": 8,
118
+ "train_loss": 0.36474189126491546,
119
+ "val_macro_f1": 0.7079227203005706
120
+ },
121
+ {
122
+ "epoch": 9,
123
+ "train_loss": 0.35668133544921876,
124
+ "val_macro_f1": 0.6683267933320051
125
+ },
126
+ {
127
+ "epoch": 10,
128
+ "train_loss": 0.3536795753240585,
129
+ "val_macro_f1": 0.6831144762405307
130
+ },
131
+ {
132
+ "epoch": 11,
133
+ "train_loss": 0.34778629159927366,
134
+ "val_macro_f1": 0.6698354417011821
135
+ },
136
+ {
137
+ "epoch": 12,
138
+ "train_loss": 0.3454807804822922,
139
+ "val_macro_f1": 0.6734959027186332
140
+ },
141
+ {
142
+ "epoch": 13,
143
+ "train_loss": 0.3423498936891556,
144
+ "val_macro_f1": 0.6685731837436523
145
+ }
146
+ ]
147
+ }
stage1_final/results/resized/resnet/target3_resnet_fold4_val.json ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 4,
3
+ "metrics": {
4
+ "macro_f1": 0.6687781793339193,
5
+ "accuracy": 0.9109554777388694,
6
+ "balanced_acc": 0.6718610005393971,
7
+ "per_class_recall": {
8
+ "malignant": 0.9079956188389924,
9
+ "non_malignant": 0.1568627450980392,
10
+ "non_roi": 0.9507246376811594
11
+ },
12
+ "per_class_precision": {
13
+ "malignant": 0.911991199119912,
14
+ "non_malignant": 0.13114754098360656,
15
+ "non_roi": 0.956268221574344
16
+ },
17
+ "confusion_matrix": [
18
+ [
19
+ 829,
20
+ 43,
21
+ 41
22
+ ],
23
+ [
24
+ 39,
25
+ 8,
26
+ 4
27
+ ],
28
+ [
29
+ 41,
30
+ 10,
31
+ 984
32
+ ]
33
+ ],
34
+ "classification_report": {
35
+ "malignant": {
36
+ "precision": 0.911991199119912,
37
+ "recall": 0.9079956188389924,
38
+ "f1-score": 0.9099890230515917,
39
+ "support": 913.0
40
+ },
41
+ "non_malignant": {
42
+ "precision": 0.13114754098360656,
43
+ "recall": 0.1568627450980392,
44
+ "f1-score": 0.14285714285714285,
45
+ "support": 51.0
46
+ },
47
+ "non_roi": {
48
+ "precision": 0.956268221574344,
49
+ "recall": 0.9507246376811594,
50
+ "f1-score": 0.9534883720930233,
51
+ "support": 1035.0
52
+ },
53
+ "accuracy": 0.9109554777388694,
54
+ "macro avg": {
55
+ "precision": 0.6664689872259543,
56
+ "recall": 0.6718610005393971,
57
+ "f1-score": 0.6687781793339193,
58
+ "support": 1999.0
59
+ },
60
+ "weighted avg": {
61
+ "precision": 0.9149945466313606,
62
+ "recall": 0.9109554777388694,
63
+ "f1-score": 0.9129395484982974,
64
+ "support": 1999.0
65
+ }
66
+ },
67
+ "n": 1999,
68
+ "src_B_acc": 0.9550724637681159,
69
+ "src_B_n": 690,
70
+ "src_C_acc": 0.9076376554174067,
71
+ "src_C_n": 1126,
72
+ "src_D_acc": 0.7650273224043715,
73
+ "src_D_n": 183
74
+ },
75
+ "logs": [
76
+ {
77
+ "epoch": 0,
78
+ "train_loss": 0.5923536739179066,
79
+ "val_macro_f1": 0.6018129443850064
80
+ },
81
+ {
82
+ "epoch": 1,
83
+ "train_loss": 0.45125278357475523,
84
+ "val_macro_f1": 0.6111214021762593
85
+ },
86
+ {
87
+ "epoch": 2,
88
+ "train_loss": 0.4290022871323994,
89
+ "val_macro_f1": 0.618591138362458
90
+ },
91
+ {
92
+ "epoch": 3,
93
+ "train_loss": 0.4083874915090818,
94
+ "val_macro_f1": 0.6203184970876795
95
+ },
96
+ {
97
+ "epoch": 4,
98
+ "train_loss": 0.39386624689140015,
99
+ "val_macro_f1": 0.6141627751425929
100
+ },
101
+ {
102
+ "epoch": 5,
103
+ "train_loss": 0.3832538424739762,
104
+ "val_macro_f1": 0.644181115303455
105
+ },
106
+ {
107
+ "epoch": 6,
108
+ "train_loss": 0.37560216183700257,
109
+ "val_macro_f1": 0.6345993836622051
110
+ },
111
+ {
112
+ "epoch": 7,
113
+ "train_loss": 0.3700622676147355,
114
+ "val_macro_f1": 0.6333246095807131
115
+ },
116
+ {
117
+ "epoch": 8,
118
+ "train_loss": 0.36172997963333886,
119
+ "val_macro_f1": 0.6575796225353324
120
+ },
121
+ {
122
+ "epoch": 9,
123
+ "train_loss": 0.35636535346034975,
124
+ "val_macro_f1": 0.6687781793339193
125
+ },
126
+ {
127
+ "epoch": 10,
128
+ "train_loss": 0.3533143174080622,
129
+ "val_macro_f1": 0.6504909310551195
130
+ },
131
+ {
132
+ "epoch": 11,
133
+ "train_loss": 0.3467717588184372,
134
+ "val_macro_f1": 0.6406098683026856
135
+ },
136
+ {
137
+ "epoch": 12,
138
+ "train_loss": 0.3425122916934982,
139
+ "val_macro_f1": 0.6569967659752955
140
+ },
141
+ {
142
+ "epoch": 13,
143
+ "train_loss": 0.34202422934865195,
144
+ "val_macro_f1": 0.6415643637555548
145
+ },
146
+ {
147
+ "epoch": 14,
148
+ "train_loss": 0.3363454665929552,
149
+ "val_macro_f1": 0.6639683704649714
150
+ }
151
+ ]
152
+ }
stage1_final/results/resized/swin/crt_swin_cv_summary.json ADDED
@@ -0,0 +1,351 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "swin",
3
+ "folds": [
4
+ {
5
+ "fold": 0,
6
+ "macro_f1": 0.7660181830579172,
7
+ "accuracy": 0.9407370517928287,
8
+ "balanced_acc": 0.8225023219462217,
9
+ "per_class_recall": {
10
+ "malignant": 0.9199561403508771,
11
+ "non_malignant": 0.5714285714285714,
12
+ "non_roi": 0.9761222540592168
13
+ },
14
+ "confusion_matrix": [
15
+ [
16
+ 839,
17
+ 57,
18
+ 16
19
+ ],
20
+ [
21
+ 17,
22
+ 28,
23
+ 4
24
+ ],
25
+ [
26
+ 10,
27
+ 15,
28
+ 1022
29
+ ]
30
+ ],
31
+ "classification_report": {
32
+ "malignant": {
33
+ "precision": 0.9688221709006929,
34
+ "recall": 0.9199561403508771,
35
+ "f1-score": 0.9437570303712036,
36
+ "support": 912.0
37
+ },
38
+ "non_malignant": {
39
+ "precision": 0.28,
40
+ "recall": 0.5714285714285714,
41
+ "f1-score": 0.37583892617449666,
42
+ "support": 49.0
43
+ },
44
+ "non_roi": {
45
+ "precision": 0.980806142034549,
46
+ "recall": 0.9761222540592168,
47
+ "f1-score": 0.9784585926280517,
48
+ "support": 1047.0
49
+ },
50
+ "accuracy": 0.9407370517928287,
51
+ "macro avg": {
52
+ "precision": 0.7432094376450805,
53
+ "recall": 0.8225023219462217,
54
+ "f1-score": 0.7660181830579172,
55
+ "support": 2008.0
56
+ },
57
+ "weighted avg": {
58
+ "precision": 0.9582618777747035,
59
+ "recall": 0.9407370517928287,
60
+ "f1-score": 0.9479923633280171,
61
+ "support": 2008.0
62
+ }
63
+ },
64
+ "n": 2008,
65
+ "src_B_acc": 0.9835820895522388,
66
+ "src_B_n": 670,
67
+ "src_C_acc": 0.9279869067103109,
68
+ "src_C_n": 1222,
69
+ "src_D_acc": 0.8275862068965517,
70
+ "src_D_n": 116
71
+ },
72
+ {
73
+ "fold": 1,
74
+ "macro_f1": 0.7950040721460113,
75
+ "accuracy": 0.9236489836390679,
76
+ "balanced_acc": 0.8397642110806242,
77
+ "per_class_recall": {
78
+ "malignant": 0.9199561403508771,
79
+ "non_malignant": 0.66,
80
+ "non_roi": 0.9393364928909953
81
+ },
82
+ "confusion_matrix": [
83
+ [
84
+ 839,
85
+ 25,
86
+ 48
87
+ ],
88
+ [
89
+ 12,
90
+ 33,
91
+ 5
92
+ ],
93
+ [
94
+ 43,
95
+ 21,
96
+ 991
97
+ ]
98
+ ],
99
+ "classification_report": {
100
+ "malignant": {
101
+ "precision": 0.9384787472035794,
102
+ "recall": 0.9199561403508771,
103
+ "f1-score": 0.929125138427464,
104
+ "support": 912.0
105
+ },
106
+ "non_malignant": {
107
+ "precision": 0.4177215189873418,
108
+ "recall": 0.66,
109
+ "f1-score": 0.5116279069767442,
110
+ "support": 50.0
111
+ },
112
+ "non_roi": {
113
+ "precision": 0.9492337164750958,
114
+ "recall": 0.9393364928909953,
115
+ "f1-score": 0.9442591710338256,
116
+ "support": 1055.0
117
+ },
118
+ "accuracy": 0.9236489836390679,
119
+ "macro avg": {
120
+ "precision": 0.7684779942220056,
121
+ "recall": 0.8397642110806242,
122
+ "f1-score": 0.7950040721460113,
123
+ "support": 2017.0
124
+ },
125
+ "weighted avg": {
126
+ "precision": 0.9311949748538709,
127
+ "recall": 0.9236489836390679,
128
+ "f1-score": 0.9266915949605208,
129
+ "support": 2017.0
130
+ }
131
+ },
132
+ "n": 2017,
133
+ "src_B_acc": 0.929945054945055,
134
+ "src_B_n": 728,
135
+ "src_C_acc": 0.9339449541284404,
136
+ "src_C_n": 1090,
137
+ "src_D_acc": 0.8442211055276382,
138
+ "src_D_n": 199
139
+ },
140
+ {
141
+ "fold": 2,
142
+ "macro_f1": 0.69226916519116,
143
+ "accuracy": 0.9049295774647887,
144
+ "balanced_acc": 0.694544557945148,
145
+ "per_class_recall": {
146
+ "malignant": 0.881578947368421,
147
+ "non_malignant": 0.24489795918367346,
148
+ "non_roi": 0.9571567672833495
149
+ },
150
+ "confusion_matrix": [
151
+ [
152
+ 804,
153
+ 38,
154
+ 70
155
+ ],
156
+ [
157
+ 37,
158
+ 12,
159
+ 0
160
+ ],
161
+ [
162
+ 41,
163
+ 3,
164
+ 983
165
+ ]
166
+ ],
167
+ "classification_report": {
168
+ "malignant": {
169
+ "precision": 0.9115646258503401,
170
+ "recall": 0.881578947368421,
171
+ "f1-score": 0.8963210702341137,
172
+ "support": 912.0
173
+ },
174
+ "non_malignant": {
175
+ "precision": 0.22641509433962265,
176
+ "recall": 0.24489795918367346,
177
+ "f1-score": 0.23529411764705882,
178
+ "support": 49.0
179
+ },
180
+ "non_roi": {
181
+ "precision": 0.9335232668566001,
182
+ "recall": 0.9571567672833495,
183
+ "f1-score": 0.9451923076923077,
184
+ "support": 1027.0
185
+ },
186
+ "accuracy": 0.9049295774647887,
187
+ "macro avg": {
188
+ "precision": 0.6905009956821876,
189
+ "recall": 0.694544557945148,
190
+ "f1-score": 0.69226916519116,
191
+ "support": 1988.0
192
+ },
193
+ "weighted avg": {
194
+ "precision": 0.9060209625049698,
195
+ "recall": 0.9049295774647887,
196
+ "f1-score": 0.9052750139930672,
197
+ "support": 1988.0
198
+ }
199
+ },
200
+ "n": 1988,
201
+ "src_B_acc": 0.8811748998664887,
202
+ "src_B_n": 749,
203
+ "src_C_acc": 0.963276836158192,
204
+ "src_C_n": 1062,
205
+ "src_D_acc": 0.655367231638418,
206
+ "src_D_n": 177
207
+ },
208
+ {
209
+ "fold": 3,
210
+ "macro_f1": 0.7202694646002583,
211
+ "accuracy": 0.8763990267639903,
212
+ "balanced_acc": 0.8063627670856586,
213
+ "per_class_recall": {
214
+ "malignant": 0.8543263964950711,
215
+ "non_malignant": 0.66,
216
+ "non_roi": 0.9047619047619048
217
+ },
218
+ "confusion_matrix": [
219
+ [
220
+ 780,
221
+ 61,
222
+ 72
223
+ ],
224
+ [
225
+ 16,
226
+ 33,
227
+ 1
228
+ ],
229
+ [
230
+ 67,
231
+ 37,
232
+ 988
233
+ ]
234
+ ],
235
+ "classification_report": {
236
+ "malignant": {
237
+ "precision": 0.9038238702201622,
238
+ "recall": 0.8543263964950711,
239
+ "f1-score": 0.8783783783783784,
240
+ "support": 913.0
241
+ },
242
+ "non_malignant": {
243
+ "precision": 0.25190839694656486,
244
+ "recall": 0.66,
245
+ "f1-score": 0.36464088397790057,
246
+ "support": 50.0
247
+ },
248
+ "non_roi": {
249
+ "precision": 0.9311969839773798,
250
+ "recall": 0.9047619047619048,
251
+ "f1-score": 0.917789131444496,
252
+ "support": 1092.0
253
+ },
254
+ "accuracy": 0.8763990267639903,
255
+ "macro avg": {
256
+ "precision": 0.6956430837147023,
257
+ "recall": 0.8063627670856586,
258
+ "f1-score": 0.7202694646002583,
259
+ "support": 2055.0
260
+ },
261
+ "weighted avg": {
262
+ "precision": 0.9025078928767081,
263
+ "recall": 0.8763990267639903,
264
+ "f1-score": 0.886821039024693,
265
+ "support": 2055.0
266
+ }
267
+ },
268
+ "n": 2055,
269
+ "src_B_acc": 0.904424778761062,
270
+ "src_B_n": 565,
271
+ "src_C_acc": 0.8648180242634316,
272
+ "src_C_n": 1154,
273
+ "src_D_acc": 0.8690476190476191,
274
+ "src_D_n": 336
275
+ },
276
+ {
277
+ "fold": 4,
278
+ "macro_f1": 0.6522278118412633,
279
+ "accuracy": 0.8779389694847424,
280
+ "balanced_acc": 0.6741694412048463,
281
+ "per_class_recall": {
282
+ "malignant": 0.8751369112814896,
283
+ "non_malignant": 0.23529411764705882,
284
+ "non_roi": 0.9120772946859903
285
+ },
286
+ "confusion_matrix": [
287
+ [
288
+ 799,
289
+ 71,
290
+ 43
291
+ ],
292
+ [
293
+ 36,
294
+ 12,
295
+ 3
296
+ ],
297
+ [
298
+ 44,
299
+ 47,
300
+ 944
301
+ ]
302
+ ],
303
+ "classification_report": {
304
+ "malignant": {
305
+ "precision": 0.9089874857792947,
306
+ "recall": 0.8751369112814896,
307
+ "f1-score": 0.8917410714285714,
308
+ "support": 913.0
309
+ },
310
+ "non_malignant": {
311
+ "precision": 0.09230769230769231,
312
+ "recall": 0.23529411764705882,
313
+ "f1-score": 0.13259668508287292,
314
+ "support": 51.0
315
+ },
316
+ "non_roi": {
317
+ "precision": 0.9535353535353536,
318
+ "recall": 0.9120772946859903,
319
+ "f1-score": 0.9323456790123457,
320
+ "support": 1035.0
321
+ },
322
+ "accuracy": 0.8779389694847424,
323
+ "macro avg": {
324
+ "precision": 0.6516101772074469,
325
+ "recall": 0.6741694412048463,
326
+ "f1-score": 0.6522278118412633,
327
+ "support": 1999.0
328
+ },
329
+ "weighted avg": {
330
+ "precision": 0.9112167872602699,
331
+ "recall": 0.8779389694847424,
332
+ "f1-score": 0.8933966017665282,
333
+ "support": 1999.0
334
+ }
335
+ },
336
+ "n": 1999,
337
+ "src_B_acc": 0.9420289855072463,
338
+ "src_B_n": 690,
339
+ "src_C_acc": 0.8685612788632326,
340
+ "src_C_n": 1126,
341
+ "src_D_acc": 0.6939890710382514,
342
+ "src_D_n": 183
343
+ }
344
+ ],
345
+ "cv_macro_f1_mean": 0.7251577393673221,
346
+ "cv_macro_f1_std": 0.05093606567397821,
347
+ "cv_non_malignant_recall_mean": 0.4743241296518607,
348
+ "cv_non_malignant_recall_std": 0.19398558946816546,
349
+ "cv_balanced_acc_mean": 0.7674686598524998,
350
+ "cv_balanced_acc_std": 0.06897937533429141
351
+ }
stage1_final/results/resized/swin/crt_swin_final.json ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "swin",
3
+ "test_metrics": {
4
+ "macro_f1": 0.77633574568816,
5
+ "accuracy": 0.9354089219330854,
6
+ "balanced_acc": 0.8063037840405253,
7
+ "per_class_recall": {
8
+ "malignant": 0.9396728016359919,
9
+ "non_malignant": 0.5283018867924528,
10
+ "non_roi": 0.9509366636931311
11
+ },
12
+ "confusion_matrix": [
13
+ [
14
+ 919,
15
+ 35,
16
+ 24
17
+ ],
18
+ [
19
+ 15,
20
+ 28,
21
+ 10
22
+ ],
23
+ [
24
+ 40,
25
+ 15,
26
+ 1066
27
+ ]
28
+ ],
29
+ "classification_report": {
30
+ "malignant": {
31
+ "precision": 0.9435318275154004,
32
+ "recall": 0.9396728016359919,
33
+ "f1-score": 0.9415983606557377,
34
+ "support": 978.0
35
+ },
36
+ "non_malignant": {
37
+ "precision": 0.358974358974359,
38
+ "recall": 0.5283018867924528,
39
+ "f1-score": 0.42748091603053434,
40
+ "support": 53.0
41
+ },
42
+ "non_roi": {
43
+ "precision": 0.9690909090909091,
44
+ "recall": 0.9509366636931311,
45
+ "f1-score": 0.959927960378208,
46
+ "support": 1121.0
47
+ },
48
+ "accuracy": 0.9354089219330854,
49
+ "macro avg": {
50
+ "precision": 0.7571990318602229,
51
+ "recall": 0.8063037840405253,
52
+ "f1-score": 0.77633574568816,
53
+ "support": 2152.0
54
+ },
55
+ "weighted avg": {
56
+ "precision": 0.942449199547682,
57
+ "recall": 0.9354089219330854,
58
+ "f1-score": 0.938484632367519,
59
+ "support": 2152.0
60
+ }
61
+ },
62
+ "n": 2152,
63
+ "src_B_acc": 0.9759206798866855,
64
+ "src_B_n": 706,
65
+ "src_C_acc": 0.9276703111858705,
66
+ "src_C_n": 1189,
67
+ "src_D_acc": 0.8599221789883269,
68
+ "src_D_n": 257
69
+ }
70
+ }
stage1_final/results/resized/swin/emit_crt_swin_oof.json ADDED
@@ -0,0 +1,351 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "swin",
3
+ "folds": [
4
+ {
5
+ "fold": 0,
6
+ "macro_f1": 0.7660181830579172,
7
+ "accuracy": 0.9407370517928287,
8
+ "balanced_acc": 0.8225023219462217,
9
+ "per_class_recall": {
10
+ "malignant": 0.9199561403508771,
11
+ "non_malignant": 0.5714285714285714,
12
+ "non_roi": 0.9761222540592168
13
+ },
14
+ "confusion_matrix": [
15
+ [
16
+ 839,
17
+ 57,
18
+ 16
19
+ ],
20
+ [
21
+ 17,
22
+ 28,
23
+ 4
24
+ ],
25
+ [
26
+ 10,
27
+ 15,
28
+ 1022
29
+ ]
30
+ ],
31
+ "classification_report": {
32
+ "malignant": {
33
+ "precision": 0.9688221709006929,
34
+ "recall": 0.9199561403508771,
35
+ "f1-score": 0.9437570303712036,
36
+ "support": 912.0
37
+ },
38
+ "non_malignant": {
39
+ "precision": 0.28,
40
+ "recall": 0.5714285714285714,
41
+ "f1-score": 0.37583892617449666,
42
+ "support": 49.0
43
+ },
44
+ "non_roi": {
45
+ "precision": 0.980806142034549,
46
+ "recall": 0.9761222540592168,
47
+ "f1-score": 0.9784585926280517,
48
+ "support": 1047.0
49
+ },
50
+ "accuracy": 0.9407370517928287,
51
+ "macro avg": {
52
+ "precision": 0.7432094376450805,
53
+ "recall": 0.8225023219462217,
54
+ "f1-score": 0.7660181830579172,
55
+ "support": 2008.0
56
+ },
57
+ "weighted avg": {
58
+ "precision": 0.9582618777747035,
59
+ "recall": 0.9407370517928287,
60
+ "f1-score": 0.9479923633280171,
61
+ "support": 2008.0
62
+ }
63
+ },
64
+ "n": 2008,
65
+ "src_B_acc": 0.9835820895522388,
66
+ "src_B_n": 670,
67
+ "src_C_acc": 0.9279869067103109,
68
+ "src_C_n": 1222,
69
+ "src_D_acc": 0.8275862068965517,
70
+ "src_D_n": 116
71
+ },
72
+ {
73
+ "fold": 1,
74
+ "macro_f1": 0.7950040721460113,
75
+ "accuracy": 0.9236489836390679,
76
+ "balanced_acc": 0.8397642110806242,
77
+ "per_class_recall": {
78
+ "malignant": 0.9199561403508771,
79
+ "non_malignant": 0.66,
80
+ "non_roi": 0.9393364928909953
81
+ },
82
+ "confusion_matrix": [
83
+ [
84
+ 839,
85
+ 25,
86
+ 48
87
+ ],
88
+ [
89
+ 12,
90
+ 33,
91
+ 5
92
+ ],
93
+ [
94
+ 43,
95
+ 21,
96
+ 991
97
+ ]
98
+ ],
99
+ "classification_report": {
100
+ "malignant": {
101
+ "precision": 0.9384787472035794,
102
+ "recall": 0.9199561403508771,
103
+ "f1-score": 0.929125138427464,
104
+ "support": 912.0
105
+ },
106
+ "non_malignant": {
107
+ "precision": 0.4177215189873418,
108
+ "recall": 0.66,
109
+ "f1-score": 0.5116279069767442,
110
+ "support": 50.0
111
+ },
112
+ "non_roi": {
113
+ "precision": 0.9492337164750958,
114
+ "recall": 0.9393364928909953,
115
+ "f1-score": 0.9442591710338256,
116
+ "support": 1055.0
117
+ },
118
+ "accuracy": 0.9236489836390679,
119
+ "macro avg": {
120
+ "precision": 0.7684779942220056,
121
+ "recall": 0.8397642110806242,
122
+ "f1-score": 0.7950040721460113,
123
+ "support": 2017.0
124
+ },
125
+ "weighted avg": {
126
+ "precision": 0.9311949748538709,
127
+ "recall": 0.9236489836390679,
128
+ "f1-score": 0.9266915949605208,
129
+ "support": 2017.0
130
+ }
131
+ },
132
+ "n": 2017,
133
+ "src_B_acc": 0.929945054945055,
134
+ "src_B_n": 728,
135
+ "src_C_acc": 0.9339449541284404,
136
+ "src_C_n": 1090,
137
+ "src_D_acc": 0.8442211055276382,
138
+ "src_D_n": 199
139
+ },
140
+ {
141
+ "fold": 2,
142
+ "macro_f1": 0.69226916519116,
143
+ "accuracy": 0.9049295774647887,
144
+ "balanced_acc": 0.694544557945148,
145
+ "per_class_recall": {
146
+ "malignant": 0.881578947368421,
147
+ "non_malignant": 0.24489795918367346,
148
+ "non_roi": 0.9571567672833495
149
+ },
150
+ "confusion_matrix": [
151
+ [
152
+ 804,
153
+ 38,
154
+ 70
155
+ ],
156
+ [
157
+ 37,
158
+ 12,
159
+ 0
160
+ ],
161
+ [
162
+ 41,
163
+ 3,
164
+ 983
165
+ ]
166
+ ],
167
+ "classification_report": {
168
+ "malignant": {
169
+ "precision": 0.9115646258503401,
170
+ "recall": 0.881578947368421,
171
+ "f1-score": 0.8963210702341137,
172
+ "support": 912.0
173
+ },
174
+ "non_malignant": {
175
+ "precision": 0.22641509433962265,
176
+ "recall": 0.24489795918367346,
177
+ "f1-score": 0.23529411764705882,
178
+ "support": 49.0
179
+ },
180
+ "non_roi": {
181
+ "precision": 0.9335232668566001,
182
+ "recall": 0.9571567672833495,
183
+ "f1-score": 0.9451923076923077,
184
+ "support": 1027.0
185
+ },
186
+ "accuracy": 0.9049295774647887,
187
+ "macro avg": {
188
+ "precision": 0.6905009956821876,
189
+ "recall": 0.694544557945148,
190
+ "f1-score": 0.69226916519116,
191
+ "support": 1988.0
192
+ },
193
+ "weighted avg": {
194
+ "precision": 0.9060209625049698,
195
+ "recall": 0.9049295774647887,
196
+ "f1-score": 0.9052750139930672,
197
+ "support": 1988.0
198
+ }
199
+ },
200
+ "n": 1988,
201
+ "src_B_acc": 0.8811748998664887,
202
+ "src_B_n": 749,
203
+ "src_C_acc": 0.963276836158192,
204
+ "src_C_n": 1062,
205
+ "src_D_acc": 0.655367231638418,
206
+ "src_D_n": 177
207
+ },
208
+ {
209
+ "fold": 3,
210
+ "macro_f1": 0.7202694646002583,
211
+ "accuracy": 0.8763990267639903,
212
+ "balanced_acc": 0.8063627670856586,
213
+ "per_class_recall": {
214
+ "malignant": 0.8543263964950711,
215
+ "non_malignant": 0.66,
216
+ "non_roi": 0.9047619047619048
217
+ },
218
+ "confusion_matrix": [
219
+ [
220
+ 780,
221
+ 61,
222
+ 72
223
+ ],
224
+ [
225
+ 16,
226
+ 33,
227
+ 1
228
+ ],
229
+ [
230
+ 67,
231
+ 37,
232
+ 988
233
+ ]
234
+ ],
235
+ "classification_report": {
236
+ "malignant": {
237
+ "precision": 0.9038238702201622,
238
+ "recall": 0.8543263964950711,
239
+ "f1-score": 0.8783783783783784,
240
+ "support": 913.0
241
+ },
242
+ "non_malignant": {
243
+ "precision": 0.25190839694656486,
244
+ "recall": 0.66,
245
+ "f1-score": 0.36464088397790057,
246
+ "support": 50.0
247
+ },
248
+ "non_roi": {
249
+ "precision": 0.9311969839773798,
250
+ "recall": 0.9047619047619048,
251
+ "f1-score": 0.917789131444496,
252
+ "support": 1092.0
253
+ },
254
+ "accuracy": 0.8763990267639903,
255
+ "macro avg": {
256
+ "precision": 0.6956430837147023,
257
+ "recall": 0.8063627670856586,
258
+ "f1-score": 0.7202694646002583,
259
+ "support": 2055.0
260
+ },
261
+ "weighted avg": {
262
+ "precision": 0.9025078928767081,
263
+ "recall": 0.8763990267639903,
264
+ "f1-score": 0.886821039024693,
265
+ "support": 2055.0
266
+ }
267
+ },
268
+ "n": 2055,
269
+ "src_B_acc": 0.904424778761062,
270
+ "src_B_n": 565,
271
+ "src_C_acc": 0.8648180242634316,
272
+ "src_C_n": 1154,
273
+ "src_D_acc": 0.8690476190476191,
274
+ "src_D_n": 336
275
+ },
276
+ {
277
+ "fold": 4,
278
+ "macro_f1": 0.6522278118412633,
279
+ "accuracy": 0.8779389694847424,
280
+ "balanced_acc": 0.6741694412048463,
281
+ "per_class_recall": {
282
+ "malignant": 0.8751369112814896,
283
+ "non_malignant": 0.23529411764705882,
284
+ "non_roi": 0.9120772946859903
285
+ },
286
+ "confusion_matrix": [
287
+ [
288
+ 799,
289
+ 71,
290
+ 43
291
+ ],
292
+ [
293
+ 36,
294
+ 12,
295
+ 3
296
+ ],
297
+ [
298
+ 44,
299
+ 47,
300
+ 944
301
+ ]
302
+ ],
303
+ "classification_report": {
304
+ "malignant": {
305
+ "precision": 0.9089874857792947,
306
+ "recall": 0.8751369112814896,
307
+ "f1-score": 0.8917410714285714,
308
+ "support": 913.0
309
+ },
310
+ "non_malignant": {
311
+ "precision": 0.09230769230769231,
312
+ "recall": 0.23529411764705882,
313
+ "f1-score": 0.13259668508287292,
314
+ "support": 51.0
315
+ },
316
+ "non_roi": {
317
+ "precision": 0.9535353535353536,
318
+ "recall": 0.9120772946859903,
319
+ "f1-score": 0.9323456790123457,
320
+ "support": 1035.0
321
+ },
322
+ "accuracy": 0.8779389694847424,
323
+ "macro avg": {
324
+ "precision": 0.6516101772074469,
325
+ "recall": 0.6741694412048463,
326
+ "f1-score": 0.6522278118412633,
327
+ "support": 1999.0
328
+ },
329
+ "weighted avg": {
330
+ "precision": 0.9112167872602699,
331
+ "recall": 0.8779389694847424,
332
+ "f1-score": 0.8933966017665282,
333
+ "support": 1999.0
334
+ }
335
+ },
336
+ "n": 1999,
337
+ "src_B_acc": 0.9420289855072463,
338
+ "src_B_n": 690,
339
+ "src_C_acc": 0.8685612788632326,
340
+ "src_C_n": 1126,
341
+ "src_D_acc": 0.6939890710382514,
342
+ "src_D_n": 183
343
+ }
344
+ ],
345
+ "cv_macro_f1_mean": 0.7251577393673221,
346
+ "cv_macro_f1_std": 0.05093606567397821,
347
+ "cv_non_malignant_recall_mean": 0.4743241296518607,
348
+ "cv_non_malignant_recall_std": 0.19398558946816546,
349
+ "cv_balanced_acc_mean": 0.7674686598524998,
350
+ "cv_balanced_acc_std": 0.06897937533429141
351
+ }
stage1_final/results/resized/swin/emit_crt_swin_test.json ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "swin",
3
+ "test_metrics": {
4
+ "macro_f1": 0.77633574568816,
5
+ "accuracy": 0.9354089219330854,
6
+ "balanced_acc": 0.8063037840405253,
7
+ "per_class_recall": {
8
+ "malignant": 0.9396728016359919,
9
+ "non_malignant": 0.5283018867924528,
10
+ "non_roi": 0.9509366636931311
11
+ },
12
+ "confusion_matrix": [
13
+ [
14
+ 919,
15
+ 35,
16
+ 24
17
+ ],
18
+ [
19
+ 15,
20
+ 28,
21
+ 10
22
+ ],
23
+ [
24
+ 40,
25
+ 15,
26
+ 1066
27
+ ]
28
+ ],
29
+ "classification_report": {
30
+ "malignant": {
31
+ "precision": 0.9435318275154004,
32
+ "recall": 0.9396728016359919,
33
+ "f1-score": 0.9415983606557377,
34
+ "support": 978.0
35
+ },
36
+ "non_malignant": {
37
+ "precision": 0.358974358974359,
38
+ "recall": 0.5283018867924528,
39
+ "f1-score": 0.42748091603053434,
40
+ "support": 53.0
41
+ },
42
+ "non_roi": {
43
+ "precision": 0.9690909090909091,
44
+ "recall": 0.9509366636931311,
45
+ "f1-score": 0.959927960378208,
46
+ "support": 1121.0
47
+ },
48
+ "accuracy": 0.9354089219330854,
49
+ "macro avg": {
50
+ "precision": 0.7571990318602229,
51
+ "recall": 0.8063037840405253,
52
+ "f1-score": 0.77633574568816,
53
+ "support": 2152.0
54
+ },
55
+ "weighted avg": {
56
+ "precision": 0.942449199547682,
57
+ "recall": 0.9354089219330854,
58
+ "f1-score": 0.938484632367519,
59
+ "support": 2152.0
60
+ }
61
+ },
62
+ "n": 2152,
63
+ "src_B_acc": 0.9759206798866855,
64
+ "src_B_n": 706,
65
+ "src_C_acc": 0.9276703111858705,
66
+ "src_C_n": 1189,
67
+ "src_D_acc": 0.8599221789883269,
68
+ "src_D_n": 257
69
+ }
70
+ }
stage1_final/results/resized/swin/emit_plain_swin_oof.json ADDED
@@ -0,0 +1,352 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "swin",
3
+ "method": "plain",
4
+ "folds": [
5
+ {
6
+ "fold": 0,
7
+ "macro_f1": 0.7636328470380195,
8
+ "accuracy": 0.9586653386454184,
9
+ "balanced_acc": 0.7456333347695887,
10
+ "per_class_recall": {
11
+ "malignant": 0.9769736842105263,
12
+ "non_malignant": 0.2857142857142857,
13
+ "non_roi": 0.9742120343839542
14
+ },
15
+ "confusion_matrix": [
16
+ [
17
+ 891,
18
+ 13,
19
+ 8
20
+ ],
21
+ [
22
+ 30,
23
+ 14,
24
+ 5
25
+ ],
26
+ [
27
+ 23,
28
+ 4,
29
+ 1020
30
+ ]
31
+ ],
32
+ "classification_report": {
33
+ "malignant": {
34
+ "precision": 0.9438559322033898,
35
+ "recall": 0.9769736842105263,
36
+ "f1-score": 0.9601293103448276,
37
+ "support": 912.0
38
+ },
39
+ "non_malignant": {
40
+ "precision": 0.45161290322580644,
41
+ "recall": 0.2857142857142857,
42
+ "f1-score": 0.35,
43
+ "support": 49.0
44
+ },
45
+ "non_roi": {
46
+ "precision": 0.9874152952565344,
47
+ "recall": 0.9742120343839542,
48
+ "f1-score": 0.9807692307692307,
49
+ "support": 1047.0
50
+ },
51
+ "accuracy": 0.9586653386454184,
52
+ "macro avg": {
53
+ "precision": 0.7942947102285768,
54
+ "recall": 0.7456333347695887,
55
+ "f1-score": 0.7636328470380195,
56
+ "support": 2008.0
57
+ },
58
+ "weighted avg": {
59
+ "precision": 0.9545565022714877,
60
+ "recall": 0.9586653386454184,
61
+ "f1-score": 0.9560026472359896,
62
+ "support": 2008.0
63
+ }
64
+ },
65
+ "n": 2008,
66
+ "src_B_acc": 0.991044776119403,
67
+ "src_B_n": 670,
68
+ "src_C_acc": 0.9435351882160393,
69
+ "src_C_n": 1222,
70
+ "src_D_acc": 0.9310344827586207,
71
+ "src_D_n": 116
72
+ },
73
+ {
74
+ "fold": 1,
75
+ "macro_f1": 0.7857336829802138,
76
+ "accuracy": 0.9201784828953892,
77
+ "balanced_acc": 0.7932461683434494,
78
+ "per_class_recall": {
79
+ "malignant": 0.9232456140350878,
80
+ "non_malignant": 0.52,
81
+ "non_roi": 0.9364928909952607
82
+ },
83
+ "confusion_matrix": [
84
+ [
85
+ 842,
86
+ 17,
87
+ 53
88
+ ],
89
+ [
90
+ 15,
91
+ 26,
92
+ 9
93
+ ],
94
+ [
95
+ 55,
96
+ 12,
97
+ 988
98
+ ]
99
+ ],
100
+ "classification_report": {
101
+ "malignant": {
102
+ "precision": 0.9232456140350878,
103
+ "recall": 0.9232456140350878,
104
+ "f1-score": 0.9232456140350878,
105
+ "support": 912.0
106
+ },
107
+ "non_malignant": {
108
+ "precision": 0.4727272727272727,
109
+ "recall": 0.52,
110
+ "f1-score": 0.49523809523809526,
111
+ "support": 50.0
112
+ },
113
+ "non_roi": {
114
+ "precision": 0.940952380952381,
115
+ "recall": 0.9364928909952607,
116
+ "f1-score": 0.9387173396674584,
117
+ "support": 1055.0
118
+ },
119
+ "accuracy": 0.9201784828953892,
120
+ "macro avg": {
121
+ "precision": 0.7789750892382471,
122
+ "recall": 0.7932461683434494,
123
+ "f1-score": 0.7857336829802138,
124
+ "support": 2017.0
125
+ },
126
+ "weighted avg": {
127
+ "precision": 0.9213391797427495,
128
+ "recall": 0.9201784828953892,
129
+ "f1-score": 0.9207281596981028,
130
+ "support": 2017.0
131
+ }
132
+ },
133
+ "n": 2017,
134
+ "src_B_acc": 0.9162087912087912,
135
+ "src_B_n": 728,
136
+ "src_C_acc": 0.9293577981651376,
137
+ "src_C_n": 1090,
138
+ "src_D_acc": 0.8844221105527639,
139
+ "src_D_n": 199
140
+ },
141
+ {
142
+ "fold": 2,
143
+ "macro_f1": 0.7068246241742177,
144
+ "accuracy": 0.9215291750503019,
145
+ "balanced_acc": 0.7139435823527381,
146
+ "per_class_recall": {
147
+ "malignant": 0.9407894736842105,
148
+ "non_malignant": 0.2653061224489796,
149
+ "non_roi": 0.9357351509250244
150
+ },
151
+ "confusion_matrix": [
152
+ [
153
+ 858,
154
+ 40,
155
+ 14
156
+ ],
157
+ [
158
+ 31,
159
+ 13,
160
+ 5
161
+ ],
162
+ [
163
+ 60,
164
+ 6,
165
+ 961
166
+ ]
167
+ ],
168
+ "classification_report": {
169
+ "malignant": {
170
+ "precision": 0.9041095890410958,
171
+ "recall": 0.9407894736842105,
172
+ "f1-score": 0.9220849005910801,
173
+ "support": 912.0
174
+ },
175
+ "non_malignant": {
176
+ "precision": 0.22033898305084745,
177
+ "recall": 0.2653061224489796,
178
+ "f1-score": 0.24074074074074073,
179
+ "support": 49.0
180
+ },
181
+ "non_roi": {
182
+ "precision": 0.9806122448979592,
183
+ "recall": 0.9357351509250244,
184
+ "f1-score": 0.9576482311908321,
185
+ "support": 1027.0
186
+ },
187
+ "accuracy": 0.9215291750503019,
188
+ "macro avg": {
189
+ "precision": 0.7016869389966341,
190
+ "recall": 0.7139435823527381,
191
+ "f1-score": 0.7068246241742177,
192
+ "support": 1988.0
193
+ },
194
+ "weighted avg": {
195
+ "precision": 0.9267773294191022,
196
+ "recall": 0.9215291750503019,
197
+ "f1-score": 0.9236632087868943,
198
+ "support": 1988.0
199
+ }
200
+ },
201
+ "n": 1988,
202
+ "src_B_acc": 0.9372496662216289,
203
+ "src_B_n": 749,
204
+ "src_C_acc": 0.948210922787194,
205
+ "src_C_n": 1062,
206
+ "src_D_acc": 0.6949152542372882,
207
+ "src_D_n": 177
208
+ },
209
+ {
210
+ "fold": 3,
211
+ "macro_f1": 0.7313823143068534,
212
+ "accuracy": 0.9012165450121654,
213
+ "balanced_acc": 0.7527928029132848,
214
+ "per_class_recall": {
215
+ "malignant": 0.8696604600219058,
216
+ "non_malignant": 0.44,
217
+ "non_roi": 0.9487179487179487
218
+ },
219
+ "confusion_matrix": [
220
+ [
221
+ 794,
222
+ 34,
223
+ 85
224
+ ],
225
+ [
226
+ 27,
227
+ 22,
228
+ 1
229
+ ],
230
+ [
231
+ 41,
232
+ 15,
233
+ 1036
234
+ ]
235
+ ],
236
+ "classification_report": {
237
+ "malignant": {
238
+ "precision": 0.9211136890951276,
239
+ "recall": 0.8696604600219058,
240
+ "f1-score": 0.8946478873239436,
241
+ "support": 913.0
242
+ },
243
+ "non_malignant": {
244
+ "precision": 0.30985915492957744,
245
+ "recall": 0.44,
246
+ "f1-score": 0.36363636363636365,
247
+ "support": 50.0
248
+ },
249
+ "non_roi": {
250
+ "precision": 0.9233511586452763,
251
+ "recall": 0.9487179487179487,
252
+ "f1-score": 0.935862691960253,
253
+ "support": 1092.0
254
+ },
255
+ "accuracy": 0.9012165450121654,
256
+ "macro avg": {
257
+ "precision": 0.7181080008899938,
258
+ "recall": 0.7527928029132848,
259
+ "f1-score": 0.7313823143068534,
260
+ "support": 2055.0
261
+ },
262
+ "weighted avg": {
263
+ "precision": 0.9074302779226141,
264
+ "recall": 0.9012165450121654,
265
+ "f1-score": 0.9036289045884063,
266
+ "support": 2055.0
267
+ }
268
+ },
269
+ "n": 2055,
270
+ "src_B_acc": 0.9026548672566371,
271
+ "src_B_n": 565,
272
+ "src_C_acc": 0.9003466204506065,
273
+ "src_C_n": 1154,
274
+ "src_D_acc": 0.9017857142857143,
275
+ "src_D_n": 336
276
+ },
277
+ {
278
+ "fold": 4,
279
+ "macro_f1": 0.6521586763136252,
280
+ "accuracy": 0.9229614807403702,
281
+ "balanced_acc": 0.6498121033048466,
282
+ "per_class_recall": {
283
+ "malignant": 0.940854326396495,
284
+ "non_malignant": 0.058823529411764705,
285
+ "non_roi": 0.9497584541062802
286
+ },
287
+ "confusion_matrix": [
288
+ [
289
+ 859,
290
+ 18,
291
+ 36
292
+ ],
293
+ [
294
+ 44,
295
+ 3,
296
+ 4
297
+ ],
298
+ [
299
+ 49,
300
+ 3,
301
+ 983
302
+ ]
303
+ ],
304
+ "classification_report": {
305
+ "malignant": {
306
+ "precision": 0.9023109243697479,
307
+ "recall": 0.940854326396495,
308
+ "f1-score": 0.9211796246648793,
309
+ "support": 913.0
310
+ },
311
+ "non_malignant": {
312
+ "precision": 0.125,
313
+ "recall": 0.058823529411764705,
314
+ "f1-score": 0.08,
315
+ "support": 51.0
316
+ },
317
+ "non_roi": {
318
+ "precision": 0.9608993157380255,
319
+ "recall": 0.9497584541062802,
320
+ "f1-score": 0.9552964042759962,
321
+ "support": 1035.0
322
+ },
323
+ "accuracy": 0.9229614807403702,
324
+ "macro avg": {
325
+ "precision": 0.6627367467025911,
326
+ "recall": 0.6498121033048466,
327
+ "f1-score": 0.6521586763136252,
328
+ "support": 1999.0
329
+ },
330
+ "weighted avg": {
331
+ "precision": 0.9128142399892127,
332
+ "recall": 0.9229614807403702,
333
+ "f1-score": 0.9173830794120515,
334
+ "support": 1999.0
335
+ }
336
+ },
337
+ "n": 1999,
338
+ "src_B_acc": 0.9550724637681159,
339
+ "src_B_n": 690,
340
+ "src_C_acc": 0.9227353463587922,
341
+ "src_C_n": 1126,
342
+ "src_D_acc": 0.8032786885245902,
343
+ "src_D_n": 183
344
+ }
345
+ ],
346
+ "cv_macro_f1_mean": 0.7279464289625859,
347
+ "cv_macro_f1_std": 0.046507217846586825,
348
+ "cv_non_malignant_recall_mean": 0.313968787515006,
349
+ "cv_non_malignant_recall_std": 0.15912146405458896,
350
+ "cv_balanced_acc_mean": 0.7310855983367814,
351
+ "cv_balanced_acc_std": 0.04784559652904662
352
+ }
stage1_final/results/resized/swin/emit_plain_swin_test.json ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "swin",
3
+ "method": "plain",
4
+ "test_metrics": {
5
+ "macro_f1": 0.7703857191557216,
6
+ "accuracy": 0.9409851301115242,
7
+ "balanced_acc": 0.7393163915581238,
8
+ "per_class_recall": {
9
+ "malignant": 0.9713701431492843,
10
+ "non_malignant": 0.3018867924528302,
11
+ "non_roi": 0.944692239072257
12
+ },
13
+ "confusion_matrix": [
14
+ [
15
+ 950,
16
+ 4,
17
+ 24
18
+ ],
19
+ [
20
+ 29,
21
+ 16,
22
+ 8
23
+ ],
24
+ [
25
+ 57,
26
+ 5,
27
+ 1059
28
+ ]
29
+ ],
30
+ "classification_report": {
31
+ "malignant": {
32
+ "precision": 0.916988416988417,
33
+ "recall": 0.9713701431492843,
34
+ "f1-score": 0.9433962264150944,
35
+ "support": 978.0
36
+ },
37
+ "non_malignant": {
38
+ "precision": 0.64,
39
+ "recall": 0.3018867924528302,
40
+ "f1-score": 0.41025641025641024,
41
+ "support": 53.0
42
+ },
43
+ "non_roi": {
44
+ "precision": 0.9706691109074244,
45
+ "recall": 0.944692239072257,
46
+ "f1-score": 0.9575045207956601,
47
+ "support": 1121.0
48
+ },
49
+ "accuracy": 0.9409851301115242,
50
+ "macro avg": {
51
+ "precision": 0.8425525092986138,
52
+ "recall": 0.7393163915581238,
53
+ "f1-score": 0.7703857191557216,
54
+ "support": 2152.0
55
+ },
56
+ "weighted avg": {
57
+ "precision": 0.938129528411661,
58
+ "recall": 0.9409851301115242,
59
+ "f1-score": 0.9376150868910255,
60
+ "support": 2152.0
61
+ }
62
+ },
63
+ "n": 2152,
64
+ "src_B_acc": 0.9759206798866855,
65
+ "src_B_n": 706,
66
+ "src_C_acc": 0.928511354079058,
67
+ "src_C_n": 1189,
68
+ "src_D_acc": 0.9027237354085603,
69
+ "src_D_n": 257
70
+ }
71
+ }
stage1_final/results/resized/swin/seg_swin_cv_summary.json ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "swin",
3
+ "folds": [
4
+ {
5
+ "fold": 0,
6
+ "dice": 0.8497834205627441,
7
+ "iou": 0.750920573870341
8
+ },
9
+ {
10
+ "fold": 1,
11
+ "dice": 0.8143344720204672,
12
+ "iou": 0.7145377000172933
13
+ },
14
+ {
15
+ "fold": 2,
16
+ "dice": 0.870364228884379,
17
+ "iou": 0.7861392299334208
18
+ },
19
+ {
20
+ "fold": 3,
21
+ "dice": 0.7840816279252371,
22
+ "iou": 0.6590562065442404
23
+ },
24
+ {
25
+ "fold": 4,
26
+ "dice": 0.7999862551689148,
27
+ "iou": 0.6861057996749877
28
+ }
29
+ ],
30
+ "cv_dice_mean": 0.8237100009123484,
31
+ "cv_dice_std": 0.03186711408219781,
32
+ "cv_iou_mean": 0.7193519020080567
33
+ }
stage1_final/results/resized/swin/seg_swin_final.json ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "swin",
3
+ "val_metrics": {
4
+ "dice": 0.8232711468424115,
5
+ "iou": 0.719168884413583
6
+ },
7
+ "test_metrics": {
8
+ "dice": 0.7576003968715668,
9
+ "iou": 0.6430930495262146
10
+ },
11
+ "logs": [
12
+ {
13
+ "epoch": 0,
14
+ "train_loss": 0.5041272011068132,
15
+ "val_dice": 0.5733120015689305,
16
+ "val_iou": 0.42451895986284527
17
+ },
18
+ {
19
+ "epoch": 1,
20
+ "train_loss": 0.2929604666100608,
21
+ "val_dice": 0.48717818941388813,
22
+ "val_iou": 0.34948329840387615
23
+ },
24
+ {
25
+ "epoch": 2,
26
+ "train_loss": 0.2137722223997116,
27
+ "val_dice": 0.7287290096282959,
28
+ "val_iou": 0.5987959802150726
29
+ },
30
+ {
31
+ "epoch": 3,
32
+ "train_loss": 0.17334166169166565,
33
+ "val_dice": 0.6785597630909511,
34
+ "val_iou": 0.5466463736125401
35
+ },
36
+ {
37
+ "epoch": 4,
38
+ "train_loss": 0.16093644665347207,
39
+ "val_dice": 0.7864872472626823,
40
+ "val_iou": 0.6677127991403852
41
+ },
42
+ {
43
+ "epoch": 5,
44
+ "train_loss": 0.1485552622212304,
45
+ "val_dice": 0.6647315791675023,
46
+ "val_iou": 0.5335111149719783
47
+ },
48
+ {
49
+ "epoch": 6,
50
+ "train_loss": 0.13685336626238293,
51
+ "val_dice": 0.7837061882019043,
52
+ "val_iou": 0.667777955532074
53
+ },
54
+ {
55
+ "epoch": 7,
56
+ "train_loss": 0.13799234728018442,
57
+ "val_dice": 0.8011538812092373,
58
+ "val_iou": 0.6887794818196978
59
+ },
60
+ {
61
+ "epoch": 8,
62
+ "train_loss": 0.12846837358342278,
63
+ "val_dice": 0.8157168626785278,
64
+ "val_iou": 0.7084443143435887
65
+ },
66
+ {
67
+ "epoch": 9,
68
+ "train_loss": 0.11154297573698892,
69
+ "val_dice": 0.8232711468424115,
70
+ "val_iou": 0.719168884413583
71
+ },
72
+ {
73
+ "epoch": 10,
74
+ "train_loss": 0.10250899609592226,
75
+ "val_dice": 0.7914002111979893,
76
+ "val_iou": 0.6771222608430045
77
+ },
78
+ {
79
+ "epoch": 11,
80
+ "train_loss": 0.10175954964425829,
81
+ "val_dice": 0.7936619945934841,
82
+ "val_iou": 0.6799217547689166
83
+ },
84
+ {
85
+ "epoch": 12,
86
+ "train_loss": 0.0938145625922415,
87
+ "val_dice": 0.8060890351022992,
88
+ "val_iou": 0.6975072026252747
89
+ },
90
+ {
91
+ "epoch": 13,
92
+ "train_loss": 0.0874451638923751,
93
+ "val_dice": 0.7825919389724731,
94
+ "val_iou": 0.6678258436066764
95
+ },
96
+ {
97
+ "epoch": 14,
98
+ "train_loss": 0.08898295130994585,
99
+ "val_dice": 0.7922060574804034,
100
+ "val_iou": 0.679090142250061
101
+ },
102
+ {
103
+ "epoch": 15,
104
+ "train_loss": 0.08026469416088527,
105
+ "val_dice": 0.817523181438446,
106
+ "val_iou": 0.7122742278235299
107
+ },
108
+ {
109
+ "epoch": 16,
110
+ "train_loss": 0.08151406877570683,
111
+ "val_dice": 0.8044465780258179,
112
+ "val_iou": 0.6966900910649981
113
+ },
114
+ {
115
+ "epoch": 17,
116
+ "train_loss": 0.08078785157865948,
117
+ "val_dice": 0.8112387146268573,
118
+ "val_iou": 0.7043212354183197
119
+ },
120
+ {
121
+ "epoch": 18,
122
+ "train_loss": 0.07656831045945485,
123
+ "val_dice": 0.7927517209734235,
124
+ "val_iou": 0.6836007918630328
125
+ },
126
+ {
127
+ "epoch": 19,
128
+ "train_loss": 0.07466021759642495,
129
+ "val_dice": 0.7776960560253688,
130
+ "val_iou": 0.6658918602125985
131
+ }
132
+ ]
133
+ }
stage1_final/results/resized/swin/seg_swin_fold0_val.json ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 0,
3
+ "metrics": {
4
+ "dice": 0.8497834205627441,
5
+ "iou": 0.750920573870341
6
+ },
7
+ "logs": [
8
+ {
9
+ "epoch": 0,
10
+ "train_loss": 0.5446222594806126,
11
+ "val_dice": 0.7206581830978394,
12
+ "val_iou": 0.5787230928738912
13
+ },
14
+ {
15
+ "epoch": 1,
16
+ "train_loss": 0.37816611358097624,
17
+ "val_dice": 0.7209781010945638,
18
+ "val_iou": 0.5784826676050822
19
+ },
20
+ {
21
+ "epoch": 2,
22
+ "train_loss": 0.26935599957193646,
23
+ "val_dice": 0.7732507189114889,
24
+ "val_iou": 0.6599312225977579
25
+ },
26
+ {
27
+ "epoch": 3,
28
+ "train_loss": 0.22567540832928248,
29
+ "val_dice": 0.7967789173126221,
30
+ "val_iou": 0.6868872245152792
31
+ },
32
+ {
33
+ "epoch": 4,
34
+ "train_loss": 0.17818944369043624,
35
+ "val_dice": 0.772668202718099,
36
+ "val_iou": 0.6466610034306844
37
+ },
38
+ {
39
+ "epoch": 5,
40
+ "train_loss": 0.15530299714633397,
41
+ "val_dice": 0.7801168958346049,
42
+ "val_iou": 0.6557818452517191
43
+ },
44
+ {
45
+ "epoch": 6,
46
+ "train_loss": 0.142147638968059,
47
+ "val_dice": 0.82286270459493,
48
+ "val_iou": 0.7108900944391886
49
+ },
50
+ {
51
+ "epoch": 7,
52
+ "train_loss": 0.12273618685347694,
53
+ "val_dice": 0.796131432056427,
54
+ "val_iou": 0.6686402161916097
55
+ },
56
+ {
57
+ "epoch": 8,
58
+ "train_loss": 0.12490585659231458,
59
+ "val_dice": 0.8006837566693624,
60
+ "val_iou": 0.6782253583272299
61
+ },
62
+ {
63
+ "epoch": 9,
64
+ "train_loss": 0.13513559103012085,
65
+ "val_dice": 0.7948429981867472,
66
+ "val_iou": 0.669242262840271
67
+ },
68
+ {
69
+ "epoch": 10,
70
+ "train_loss": 0.10497683073793139,
71
+ "val_dice": 0.8245085875193278,
72
+ "val_iou": 0.7092998027801514
73
+ },
74
+ {
75
+ "epoch": 11,
76
+ "train_loss": 0.10102036276033946,
77
+ "val_dice": 0.8497834205627441,
78
+ "val_iou": 0.750920573870341
79
+ },
80
+ {
81
+ "epoch": 12,
82
+ "train_loss": 0.09532852896622249,
83
+ "val_dice": 0.8399245142936707,
84
+ "val_iou": 0.7346445719401041
85
+ },
86
+ {
87
+ "epoch": 13,
88
+ "train_loss": 0.1055756009050778,
89
+ "val_dice": 0.8378974000612894,
90
+ "val_iou": 0.7356659770011902
91
+ },
92
+ {
93
+ "epoch": 14,
94
+ "train_loss": 0.09359907784632274,
95
+ "val_dice": 0.8153773744901022,
96
+ "val_iou": 0.6967307527860006
97
+ },
98
+ {
99
+ "epoch": 15,
100
+ "train_loss": 0.08557715586253575,
101
+ "val_dice": 0.8385222355524699,
102
+ "val_iou": 0.7273297707239786
103
+ },
104
+ {
105
+ "epoch": 16,
106
+ "train_loss": 0.0905990291919027,
107
+ "val_dice": 0.8476954102516174,
108
+ "val_iou": 0.7416049639383951
109
+ },
110
+ {
111
+ "epoch": 17,
112
+ "train_loss": 0.08136174721377236,
113
+ "val_dice": 0.8452925483385721,
114
+ "val_iou": 0.7386023004849752
115
+ },
116
+ {
117
+ "epoch": 18,
118
+ "train_loss": 0.08534181118011475,
119
+ "val_dice": 0.8435579538345337,
120
+ "val_iou": 0.7369007269541422
121
+ },
122
+ {
123
+ "epoch": 19,
124
+ "train_loss": 0.08582359392728124,
125
+ "val_dice": 0.8428200880686442,
126
+ "val_iou": 0.7359472711881002
127
+ },
128
+ {
129
+ "epoch": 20,
130
+ "train_loss": 0.0721271490412099,
131
+ "val_dice": 0.8309236168861389,
132
+ "val_iou": 0.7175435225168864
133
+ },
134
+ {
135
+ "epoch": 21,
136
+ "train_loss": 0.07851969450712204,
137
+ "val_dice": 0.8389408191045126,
138
+ "val_iou": 0.732126514116923
139
+ }
140
+ ]
141
+ }
stage1_final/results/resized/swin/seg_swin_fold1_val.json ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 1,
3
+ "metrics": {
4
+ "dice": 0.8143344720204672,
5
+ "iou": 0.7145377000172933
6
+ },
7
+ "logs": [
8
+ {
9
+ "epoch": 0,
10
+ "train_loss": 0.535276540688106,
11
+ "val_dice": 0.29060043891270954,
12
+ "val_iou": 0.20033406962951025
13
+ },
14
+ {
15
+ "epoch": 1,
16
+ "train_loss": 0.37387113911764963,
17
+ "val_dice": 0.6118379433949789,
18
+ "val_iou": 0.49527523914972943
19
+ },
20
+ {
21
+ "epoch": 2,
22
+ "train_loss": 0.2482566088438034,
23
+ "val_dice": 0.6941904028256735,
24
+ "val_iou": 0.5593467156092325
25
+ },
26
+ {
27
+ "epoch": 3,
28
+ "train_loss": 0.20266000713620866,
29
+ "val_dice": 0.682613730430603,
30
+ "val_iou": 0.5549735128879547
31
+ },
32
+ {
33
+ "epoch": 4,
34
+ "train_loss": 0.17257224236215865,
35
+ "val_dice": 0.7515011032422384,
36
+ "val_iou": 0.6303549806276957
37
+ },
38
+ {
39
+ "epoch": 5,
40
+ "train_loss": 0.15749466632093703,
41
+ "val_dice": 0.7897831400235494,
42
+ "val_iou": 0.6777675747871399
43
+ },
44
+ {
45
+ "epoch": 6,
46
+ "train_loss": 0.14117851214749472,
47
+ "val_dice": 0.7954723437627157,
48
+ "val_iou": 0.6840346654256185
49
+ },
50
+ {
51
+ "epoch": 7,
52
+ "train_loss": 0.1374025589653424,
53
+ "val_dice": 0.7931330601374308,
54
+ "val_iou": 0.6834543347358704
55
+ },
56
+ {
57
+ "epoch": 8,
58
+ "train_loss": 0.12672439217567444,
59
+ "val_dice": 0.7929296890894572,
60
+ "val_iou": 0.6838778853416443
61
+ },
62
+ {
63
+ "epoch": 9,
64
+ "train_loss": 0.12151699300323214,
65
+ "val_dice": 0.7405277490615845,
66
+ "val_iou": 0.6267356077829996
67
+ },
68
+ {
69
+ "epoch": 10,
70
+ "train_loss": 0.11313744527953011,
71
+ "val_dice": 0.752645472685496,
72
+ "val_iou": 0.6389036575953165
73
+ },
74
+ {
75
+ "epoch": 11,
76
+ "train_loss": 0.10320863127708435,
77
+ "val_dice": 0.7658820549647013,
78
+ "val_iou": 0.6512094736099243
79
+ },
80
+ {
81
+ "epoch": 12,
82
+ "train_loss": 0.10260657008205142,
83
+ "val_dice": 0.6982779105504354,
84
+ "val_iou": 0.5825079878171285
85
+ },
86
+ {
87
+ "epoch": 13,
88
+ "train_loss": 0.10528536140918732,
89
+ "val_dice": 0.743449330329895,
90
+ "val_iou": 0.6305932998657227
91
+ },
92
+ {
93
+ "epoch": 14,
94
+ "train_loss": 0.10527797256197248,
95
+ "val_dice": 0.7981343070665995,
96
+ "val_iou": 0.6960783004760742
97
+ },
98
+ {
99
+ "epoch": 15,
100
+ "train_loss": 0.09031947276421956,
101
+ "val_dice": 0.8143344720204672,
102
+ "val_iou": 0.7145377000172933
103
+ },
104
+ {
105
+ "epoch": 16,
106
+ "train_loss": 0.08666814650808062,
107
+ "val_dice": 0.7869327863057455,
108
+ "val_iou": 0.6815213362375895
109
+ },
110
+ {
111
+ "epoch": 17,
112
+ "train_loss": 0.08073316514492035,
113
+ "val_dice": 0.793034295241038,
114
+ "val_iou": 0.6853775580724081
115
+ },
116
+ {
117
+ "epoch": 18,
118
+ "train_loss": 0.07688464330775398,
119
+ "val_dice": 0.7858634193738302,
120
+ "val_iou": 0.6822575132052103
121
+ },
122
+ {
123
+ "epoch": 19,
124
+ "train_loss": 0.08044026898486274,
125
+ "val_dice": 0.7575587431589762,
126
+ "val_iou": 0.648397167523702
127
+ },
128
+ {
129
+ "epoch": 20,
130
+ "train_loss": 0.07632634895188468,
131
+ "val_dice": 0.7679100235303243,
132
+ "val_iou": 0.6613891323407491
133
+ },
134
+ {
135
+ "epoch": 21,
136
+ "train_loss": 0.07183206028171948,
137
+ "val_dice": 0.7846653064092001,
138
+ "val_iou": 0.6825363834698995
139
+ },
140
+ {
141
+ "epoch": 22,
142
+ "train_loss": 0.08173616230487823,
143
+ "val_dice": 0.7929137150446574,
144
+ "val_iou": 0.6903482675552368
145
+ },
146
+ {
147
+ "epoch": 23,
148
+ "train_loss": 0.08034277175154005,
149
+ "val_dice": 0.7910922368367513,
150
+ "val_iou": 0.6874399383862814
151
+ },
152
+ {
153
+ "epoch": 24,
154
+ "train_loss": 0.0718587977545602,
155
+ "val_dice": 0.7958235740661621,
156
+ "val_iou": 0.6935882369677225
157
+ },
158
+ {
159
+ "epoch": 25,
160
+ "train_loss": 0.07105837443045207,
161
+ "val_dice": 0.7958802580833435,
162
+ "val_iou": 0.6947604815165201
163
+ }
164
+ ]
165
+ }
stage1_final/results/resized/swin/seg_swin_fold2_val.json ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 2,
3
+ "metrics": {
4
+ "dice": 0.870364228884379,
5
+ "iou": 0.7861392299334208
6
+ },
7
+ "logs": [
8
+ {
9
+ "epoch": 0,
10
+ "train_loss": 0.53319223012243,
11
+ "val_dice": 0.519702305396398,
12
+ "val_iou": 0.3928756018479665
13
+ },
14
+ {
15
+ "epoch": 1,
16
+ "train_loss": 0.3800590378897531,
17
+ "val_dice": 0.47135504086812335,
18
+ "val_iou": 0.34356869260470074
19
+ },
20
+ {
21
+ "epoch": 2,
22
+ "train_loss": 0.2604604959487915,
23
+ "val_dice": 0.6210690339406332,
24
+ "val_iou": 0.4804910520712535
25
+ },
26
+ {
27
+ "epoch": 3,
28
+ "train_loss": 0.19222563292298997,
29
+ "val_dice": 0.7420301834742228,
30
+ "val_iou": 0.6080972154935201
31
+ },
32
+ {
33
+ "epoch": 4,
34
+ "train_loss": 0.16777987565313066,
35
+ "val_dice": 0.7563832799593607,
36
+ "val_iou": 0.631482720375061
37
+ },
38
+ {
39
+ "epoch": 5,
40
+ "train_loss": 0.15371495272432054,
41
+ "val_dice": 0.7738933563232422,
42
+ "val_iou": 0.6555328369140625
43
+ },
44
+ {
45
+ "epoch": 6,
46
+ "train_loss": 0.15673209726810455,
47
+ "val_dice": 0.792340616385142,
48
+ "val_iou": 0.6745807528495789
49
+ },
50
+ {
51
+ "epoch": 7,
52
+ "train_loss": 0.13151479193142482,
53
+ "val_dice": 0.77471790711085,
54
+ "val_iou": 0.656468669573466
55
+ },
56
+ {
57
+ "epoch": 8,
58
+ "train_loss": 0.13548390567302704,
59
+ "val_dice": 0.7774608333905538,
60
+ "val_iou": 0.6597265601158142
61
+ },
62
+ {
63
+ "epoch": 9,
64
+ "train_loss": 0.12735326055969512,
65
+ "val_dice": 0.8119258483250936,
66
+ "val_iou": 0.7031693855921427
67
+ },
68
+ {
69
+ "epoch": 10,
70
+ "train_loss": 0.11096934548446111,
71
+ "val_dice": 0.8318393429120382,
72
+ "val_iou": 0.7345219453175863
73
+ },
74
+ {
75
+ "epoch": 11,
76
+ "train_loss": 0.10046488578830447,
77
+ "val_dice": 0.8118160565694174,
78
+ "val_iou": 0.7067838907241821
79
+ },
80
+ {
81
+ "epoch": 12,
82
+ "train_loss": 0.09609509472336088,
83
+ "val_dice": 0.8457108736038208,
84
+ "val_iou": 0.7523373166720072
85
+ },
86
+ {
87
+ "epoch": 13,
88
+ "train_loss": 0.10163260783467974,
89
+ "val_dice": 0.8250532547632853,
90
+ "val_iou": 0.7260107199350992
91
+ },
92
+ {
93
+ "epoch": 14,
94
+ "train_loss": 0.10233733377286366,
95
+ "val_dice": 0.8178443908691406,
96
+ "val_iou": 0.7140642404556274
97
+ },
98
+ {
99
+ "epoch": 15,
100
+ "train_loss": 0.09752363818032402,
101
+ "val_dice": 0.807724674542745,
102
+ "val_iou": 0.6998606324195862
103
+ },
104
+ {
105
+ "epoch": 16,
106
+ "train_loss": 0.09503490264926638,
107
+ "val_dice": 0.8519294659296671,
108
+ "val_iou": 0.7595157623291016
109
+ },
110
+ {
111
+ "epoch": 17,
112
+ "train_loss": 0.09380674575056348,
113
+ "val_dice": 0.8439086675643921,
114
+ "val_iou": 0.7489290634791056
115
+ },
116
+ {
117
+ "epoch": 18,
118
+ "train_loss": 0.08262731347765241,
119
+ "val_dice": 0.8531518777211508,
120
+ "val_iou": 0.7592015663782755
121
+ },
122
+ {
123
+ "epoch": 19,
124
+ "train_loss": 0.0771312979715211,
125
+ "val_dice": 0.8449994921684265,
126
+ "val_iou": 0.754411538441976
127
+ },
128
+ {
129
+ "epoch": 20,
130
+ "train_loss": 0.07806175415005003,
131
+ "val_dice": 0.850978155930837,
132
+ "val_iou": 0.7582797805468241
133
+ },
134
+ {
135
+ "epoch": 21,
136
+ "train_loss": 0.07763289500560079,
137
+ "val_dice": 0.8605126341183981,
138
+ "val_iou": 0.7719221909840902
139
+ },
140
+ {
141
+ "epoch": 22,
142
+ "train_loss": 0.08082778538976397,
143
+ "val_dice": 0.8595162431399027,
144
+ "val_iou": 0.772172212600708
145
+ },
146
+ {
147
+ "epoch": 23,
148
+ "train_loss": 0.07791782543063164,
149
+ "val_dice": 0.857081929842631,
150
+ "val_iou": 0.7683384815851847
151
+ },
152
+ {
153
+ "epoch": 24,
154
+ "train_loss": 0.07477812894753047,
155
+ "val_dice": 0.8592477242151896,
156
+ "val_iou": 0.7725915114084879
157
+ },
158
+ {
159
+ "epoch": 25,
160
+ "train_loss": 0.07309406037841525,
161
+ "val_dice": 0.8607770999272665,
162
+ "val_iou": 0.7726543148358663
163
+ },
164
+ {
165
+ "epoch": 26,
166
+ "train_loss": 0.07613320755107063,
167
+ "val_dice": 0.8577540715535482,
168
+ "val_iou": 0.7680959105491638
169
+ },
170
+ {
171
+ "epoch": 27,
172
+ "train_loss": 0.06654731929302216,
173
+ "val_dice": 0.870364228884379,
174
+ "val_iou": 0.7861392299334208
175
+ },
176
+ {
177
+ "epoch": 28,
178
+ "train_loss": 0.06811949397836413,
179
+ "val_dice": 0.8636316855748495,
180
+ "val_iou": 0.7788914640744528
181
+ },
182
+ {
183
+ "epoch": 29,
184
+ "train_loss": 0.07041303919894355,
185
+ "val_dice": 0.8642295996348063,
186
+ "val_iou": 0.7798237601915995
187
+ },
188
+ {
189
+ "epoch": 30,
190
+ "train_loss": 0.06776665044682366,
191
+ "val_dice": 0.8670064210891724,
192
+ "val_iou": 0.7810513973236084
193
+ },
194
+ {
195
+ "epoch": 31,
196
+ "train_loss": 0.06373958183186394,
197
+ "val_dice": 0.8679453134536743,
198
+ "val_iou": 0.7817506790161133
199
+ },
200
+ {
201
+ "epoch": 32,
202
+ "train_loss": 0.07210531192166465,
203
+ "val_dice": 0.8679536779721578,
204
+ "val_iou": 0.781925638516744
205
+ },
206
+ {
207
+ "epoch": 33,
208
+ "train_loss": 0.06882151748452868,
209
+ "val_dice": 0.8639173706372579,
210
+ "val_iou": 0.7780290444691976
211
+ },
212
+ {
213
+ "epoch": 34,
214
+ "train_loss": 0.06686396790402276,
215
+ "val_dice": 0.8677294452985128,
216
+ "val_iou": 0.783530573050181
217
+ },
218
+ {
219
+ "epoch": 35,
220
+ "train_loss": 0.06399784077491079,
221
+ "val_dice": 0.8680197795232137,
222
+ "val_iou": 0.7845798134803772
223
+ },
224
+ {
225
+ "epoch": 36,
226
+ "train_loss": 0.0634835809469223,
227
+ "val_dice": 0.8655549883842468,
228
+ "val_iou": 0.7809713284174601
229
+ },
230
+ {
231
+ "epoch": 37,
232
+ "train_loss": 0.06508150537099157,
233
+ "val_dice": 0.8679866592089335,
234
+ "val_iou": 0.7832340796788534
235
+ }
236
+ ]
237
+ }
stage1_final/results/resized/swin/seg_swin_fold3_val.json ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 3,
3
+ "metrics": {
4
+ "dice": 0.7840816279252371,
5
+ "iou": 0.6590562065442404
6
+ },
7
+ "logs": [
8
+ {
9
+ "epoch": 0,
10
+ "train_loss": 0.5644943316777548,
11
+ "val_dice": 0.5566210548082987,
12
+ "val_iou": 0.4075055966774623
13
+ },
14
+ {
15
+ "epoch": 1,
16
+ "train_loss": 0.3536250591278076,
17
+ "val_dice": 0.6980775396029154,
18
+ "val_iou": 0.5499440828959147
19
+ },
20
+ {
21
+ "epoch": 2,
22
+ "train_loss": 0.26847007622321445,
23
+ "val_dice": 0.7076854805151621,
24
+ "val_iou": 0.5615279873212179
25
+ },
26
+ {
27
+ "epoch": 3,
28
+ "train_loss": 0.23729953418175379,
29
+ "val_dice": 0.7343017260233561,
30
+ "val_iou": 0.5934970676898956
31
+ },
32
+ {
33
+ "epoch": 4,
34
+ "train_loss": 0.1935630589723587,
35
+ "val_dice": 0.6923068364461263,
36
+ "val_iou": 0.5507424126068751
37
+ },
38
+ {
39
+ "epoch": 5,
40
+ "train_loss": 0.1675262525677681,
41
+ "val_dice": 0.697974423567454,
42
+ "val_iou": 0.5549695442120234
43
+ },
44
+ {
45
+ "epoch": 6,
46
+ "train_loss": 0.156974991162618,
47
+ "val_dice": 0.7563099761803945,
48
+ "val_iou": 0.6220822830994924
49
+ },
50
+ {
51
+ "epoch": 7,
52
+ "train_loss": 0.1494820031026999,
53
+ "val_dice": 0.7565544247627258,
54
+ "val_iou": 0.6235723694165548
55
+ },
56
+ {
57
+ "epoch": 8,
58
+ "train_loss": 0.1440793884297212,
59
+ "val_dice": 0.7245964507261912,
60
+ "val_iou": 0.5822750926017761
61
+ },
62
+ {
63
+ "epoch": 9,
64
+ "train_loss": 0.11159508923689525,
65
+ "val_dice": 0.7540792326132456,
66
+ "val_iou": 0.6187540143728256
67
+ },
68
+ {
69
+ "epoch": 10,
70
+ "train_loss": 0.10060851400097211,
71
+ "val_dice": 0.759496142466863,
72
+ "val_iou": 0.6260019739468893
73
+ },
74
+ {
75
+ "epoch": 11,
76
+ "train_loss": 0.10757989684740703,
77
+ "val_dice": 0.7685292263825735,
78
+ "val_iou": 0.6376429001490275
79
+ },
80
+ {
81
+ "epoch": 12,
82
+ "train_loss": 0.11214115470647812,
83
+ "val_dice": 0.7541829248269399,
84
+ "val_iou": 0.6189784159262975
85
+ },
86
+ {
87
+ "epoch": 13,
88
+ "train_loss": 0.09366800139347713,
89
+ "val_dice": 0.7661648492018381,
90
+ "val_iou": 0.6341928243637085
91
+ },
92
+ {
93
+ "epoch": 14,
94
+ "train_loss": 0.09134461854894955,
95
+ "val_dice": 0.7717945476373037,
96
+ "val_iou": 0.6431201895078024
97
+ },
98
+ {
99
+ "epoch": 15,
100
+ "train_loss": 0.08385386814673741,
101
+ "val_dice": 0.7678973774115244,
102
+ "val_iou": 0.6365595062573751
103
+ },
104
+ {
105
+ "epoch": 16,
106
+ "train_loss": 0.07986822972695033,
107
+ "val_dice": 0.771437386671702,
108
+ "val_iou": 0.6408586800098419
109
+ },
110
+ {
111
+ "epoch": 17,
112
+ "train_loss": 0.08193644384543101,
113
+ "val_dice": 0.7825932502746582,
114
+ "val_iou": 0.6567094226678213
115
+ },
116
+ {
117
+ "epoch": 18,
118
+ "train_loss": 0.0809371384481589,
119
+ "val_dice": 0.7778016626834869,
120
+ "val_iou": 0.6486816704273224
121
+ },
122
+ {
123
+ "epoch": 19,
124
+ "train_loss": 0.08391191065311432,
125
+ "val_dice": 0.7840816279252371,
126
+ "val_iou": 0.6590562065442404
127
+ },
128
+ {
129
+ "epoch": 20,
130
+ "train_loss": 0.07560893148183823,
131
+ "val_dice": 0.7670804262161255,
132
+ "val_iou": 0.6369365453720093
133
+ },
134
+ {
135
+ "epoch": 21,
136
+ "train_loss": 0.06714590142170589,
137
+ "val_dice": 0.7829350034395853,
138
+ "val_iou": 0.6581146319707235
139
+ },
140
+ {
141
+ "epoch": 22,
142
+ "train_loss": 0.07043128584822018,
143
+ "val_dice": 0.7667618989944458,
144
+ "val_iou": 0.6370510856310526
145
+ },
146
+ {
147
+ "epoch": 23,
148
+ "train_loss": 0.07188508162895839,
149
+ "val_dice": 0.7699766357739767,
150
+ "val_iou": 0.6399556398391724
151
+ },
152
+ {
153
+ "epoch": 24,
154
+ "train_loss": 0.06978859628240268,
155
+ "val_dice": 0.7827901442845663,
156
+ "val_iou": 0.6584077080090841
157
+ },
158
+ {
159
+ "epoch": 25,
160
+ "train_loss": 0.06804146369298299,
161
+ "val_dice": 0.7609393199284872,
162
+ "val_iou": 0.6303514738877615
163
+ },
164
+ {
165
+ "epoch": 26,
166
+ "train_loss": 0.06350756188233693,
167
+ "val_dice": 0.7756331861019135,
168
+ "val_iou": 0.6493221521377563
169
+ },
170
+ {
171
+ "epoch": 27,
172
+ "train_loss": 0.06875551616152127,
173
+ "val_dice": 0.7680461506048838,
174
+ "val_iou": 0.6379187901814779
175
+ },
176
+ {
177
+ "epoch": 28,
178
+ "train_loss": 0.060310092444221176,
179
+ "val_dice": 0.7805092136065165,
180
+ "val_iou": 0.6552097996075948
181
+ },
182
+ {
183
+ "epoch": 29,
184
+ "train_loss": 0.06423936411738396,
185
+ "val_dice": 0.7775281270345052,
186
+ "val_iou": 0.6491693357626597
187
+ }
188
+ ]
189
+ }
stage1_final/results/resized/swin/seg_swin_fold4_val.json ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 4,
3
+ "metrics": {
4
+ "dice": 0.7999862551689148,
5
+ "iou": 0.6861057996749877
6
+ },
7
+ "logs": [
8
+ {
9
+ "epoch": 0,
10
+ "train_loss": 0.5524809261163076,
11
+ "val_dice": 0.5453098535537719,
12
+ "val_iou": 0.40681121349334715
13
+ },
14
+ {
15
+ "epoch": 1,
16
+ "train_loss": 0.3338383138179779,
17
+ "val_dice": 0.5516802728176117,
18
+ "val_iou": 0.4054519832134247
19
+ },
20
+ {
21
+ "epoch": 2,
22
+ "train_loss": 0.28559809923171997,
23
+ "val_dice": 0.6782130837440491,
24
+ "val_iou": 0.5418269336223602
25
+ },
26
+ {
27
+ "epoch": 3,
28
+ "train_loss": 0.1975168983141581,
29
+ "val_dice": 0.7255425453186035,
30
+ "val_iou": 0.5953320026397705
31
+ },
32
+ {
33
+ "epoch": 4,
34
+ "train_loss": 0.17140237738688788,
35
+ "val_dice": 0.7415789842605591,
36
+ "val_iou": 0.6130733847618103
37
+ },
38
+ {
39
+ "epoch": 5,
40
+ "train_loss": 0.1679044415553411,
41
+ "val_dice": 0.7423642992973327,
42
+ "val_iou": 0.6120051264762878
43
+ },
44
+ {
45
+ "epoch": 6,
46
+ "train_loss": 0.14681103080511093,
47
+ "val_dice": 0.7062652826309204,
48
+ "val_iou": 0.5742332339286804
49
+ },
50
+ {
51
+ "epoch": 7,
52
+ "train_loss": 0.14608486741781235,
53
+ "val_dice": 0.7175218343734742,
54
+ "val_iou": 0.5849982023239135
55
+ },
56
+ {
57
+ "epoch": 8,
58
+ "train_loss": 0.12946644922097525,
59
+ "val_dice": 0.7795461416244507,
60
+ "val_iou": 0.6575414896011352
61
+ },
62
+ {
63
+ "epoch": 9,
64
+ "train_loss": 0.13823421547810236,
65
+ "val_dice": 0.731498634815216,
66
+ "val_iou": 0.5991742253303528
67
+ },
68
+ {
69
+ "epoch": 10,
70
+ "train_loss": 0.1273034488161405,
71
+ "val_dice": 0.7890825629234314,
72
+ "val_iou": 0.6713623523712158
73
+ },
74
+ {
75
+ "epoch": 11,
76
+ "train_loss": 0.10279356688261032,
77
+ "val_dice": 0.7564040422439575,
78
+ "val_iou": 0.6317517638206482
79
+ },
80
+ {
81
+ "epoch": 12,
82
+ "train_loss": 0.10121280575791995,
83
+ "val_dice": 0.7652543067932129,
84
+ "val_iou": 0.6448354601860047
85
+ },
86
+ {
87
+ "epoch": 13,
88
+ "train_loss": 0.09717905148863792,
89
+ "val_dice": 0.7860966563224793,
90
+ "val_iou": 0.6720147967338562
91
+ },
92
+ {
93
+ "epoch": 14,
94
+ "train_loss": 0.08978632961710294,
95
+ "val_dice": 0.7725675821304321,
96
+ "val_iou": 0.6541133642196655
97
+ },
98
+ {
99
+ "epoch": 15,
100
+ "train_loss": 0.09365986163417499,
101
+ "val_dice": 0.7926210999488831,
102
+ "val_iou": 0.6750026941299438
103
+ },
104
+ {
105
+ "epoch": 16,
106
+ "train_loss": 0.08689056957761447,
107
+ "val_dice": 0.7841871857643128,
108
+ "val_iou": 0.6643844962120056
109
+ },
110
+ {
111
+ "epoch": 17,
112
+ "train_loss": 0.08391456430157025,
113
+ "val_dice": 0.7878318190574646,
114
+ "val_iou": 0.6712075352668763
115
+ },
116
+ {
117
+ "epoch": 18,
118
+ "train_loss": 0.08205627277493477,
119
+ "val_dice": 0.7999862551689148,
120
+ "val_iou": 0.6861057996749877
121
+ },
122
+ {
123
+ "epoch": 19,
124
+ "train_loss": 0.07828355456391971,
125
+ "val_dice": 0.7857508063316345,
126
+ "val_iou": 0.6690579652786255
127
+ },
128
+ {
129
+ "epoch": 20,
130
+ "train_loss": 0.07488626365860303,
131
+ "val_dice": 0.7917183995246887,
132
+ "val_iou": 0.6778489828109742
133
+ },
134
+ {
135
+ "epoch": 21,
136
+ "train_loss": 0.07460324217875798,
137
+ "val_dice": 0.7858131170272827,
138
+ "val_iou": 0.6699602246284485
139
+ },
140
+ {
141
+ "epoch": 22,
142
+ "train_loss": 0.07993476837873459,
143
+ "val_dice": 0.7686075568199158,
144
+ "val_iou": 0.6466731190681457
145
+ },
146
+ {
147
+ "epoch": 23,
148
+ "train_loss": 0.0696497509876887,
149
+ "val_dice": 0.7871398091316223,
150
+ "val_iou": 0.6704781413078308
151
+ },
152
+ {
153
+ "epoch": 24,
154
+ "train_loss": 0.07370993494987488,
155
+ "val_dice": 0.7812661409378052,
156
+ "val_iou": 0.6637521266937256
157
+ },
158
+ {
159
+ "epoch": 25,
160
+ "train_loss": 0.06288281579812367,
161
+ "val_dice": 0.7807499289512634,
162
+ "val_iou": 0.6636662960052491
163
+ },
164
+ {
165
+ "epoch": 26,
166
+ "train_loss": 0.07129944860935211,
167
+ "val_dice": 0.780695641040802,
168
+ "val_iou": 0.6638973116874695
169
+ },
170
+ {
171
+ "epoch": 27,
172
+ "train_loss": 0.07376938437422116,
173
+ "val_dice": 0.7922195315361023,
174
+ "val_iou": 0.6767239928245544
175
+ },
176
+ {
177
+ "epoch": 28,
178
+ "train_loss": 0.06869624803463618,
179
+ "val_dice": 0.7866302132606506,
180
+ "val_iou": 0.6683720469474792
181
+ }
182
+ ]
183
+ }
stage1_final/results/resized/swin/target3_swin_cv_summary.json ADDED
@@ -0,0 +1,349 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "swin",
3
+ "folds": [
4
+ {
5
+ "fold": 0,
6
+ "macro_f1": 0.7636328470380195,
7
+ "accuracy": 0.9586653386454184,
8
+ "balanced_acc": 0.7456333347695887,
9
+ "per_class_recall": {
10
+ "malignant": 0.9769736842105263,
11
+ "non_malignant": 0.2857142857142857,
12
+ "non_roi": 0.9742120343839542
13
+ },
14
+ "confusion_matrix": [
15
+ [
16
+ 891,
17
+ 13,
18
+ 8
19
+ ],
20
+ [
21
+ 30,
22
+ 14,
23
+ 5
24
+ ],
25
+ [
26
+ 23,
27
+ 4,
28
+ 1020
29
+ ]
30
+ ],
31
+ "classification_report": {
32
+ "malignant": {
33
+ "precision": 0.9438559322033898,
34
+ "recall": 0.9769736842105263,
35
+ "f1-score": 0.9601293103448276,
36
+ "support": 912.0
37
+ },
38
+ "non_malignant": {
39
+ "precision": 0.45161290322580644,
40
+ "recall": 0.2857142857142857,
41
+ "f1-score": 0.35,
42
+ "support": 49.0
43
+ },
44
+ "non_roi": {
45
+ "precision": 0.9874152952565344,
46
+ "recall": 0.9742120343839542,
47
+ "f1-score": 0.9807692307692307,
48
+ "support": 1047.0
49
+ },
50
+ "accuracy": 0.9586653386454184,
51
+ "macro avg": {
52
+ "precision": 0.7942947102285768,
53
+ "recall": 0.7456333347695887,
54
+ "f1-score": 0.7636328470380195,
55
+ "support": 2008.0
56
+ },
57
+ "weighted avg": {
58
+ "precision": 0.9545565022714877,
59
+ "recall": 0.9586653386454184,
60
+ "f1-score": 0.9560026472359896,
61
+ "support": 2008.0
62
+ }
63
+ },
64
+ "n": 2008,
65
+ "src_B_acc": 0.991044776119403,
66
+ "src_B_n": 670,
67
+ "src_C_acc": 0.9435351882160393,
68
+ "src_C_n": 1222,
69
+ "src_D_acc": 0.9310344827586207,
70
+ "src_D_n": 116
71
+ },
72
+ {
73
+ "fold": 1,
74
+ "macro_f1": 0.7857336829802138,
75
+ "accuracy": 0.9201784828953892,
76
+ "balanced_acc": 0.7932461683434494,
77
+ "per_class_recall": {
78
+ "malignant": 0.9232456140350878,
79
+ "non_malignant": 0.52,
80
+ "non_roi": 0.9364928909952607
81
+ },
82
+ "confusion_matrix": [
83
+ [
84
+ 842,
85
+ 17,
86
+ 53
87
+ ],
88
+ [
89
+ 15,
90
+ 26,
91
+ 9
92
+ ],
93
+ [
94
+ 55,
95
+ 12,
96
+ 988
97
+ ]
98
+ ],
99
+ "classification_report": {
100
+ "malignant": {
101
+ "precision": 0.9232456140350878,
102
+ "recall": 0.9232456140350878,
103
+ "f1-score": 0.9232456140350878,
104
+ "support": 912.0
105
+ },
106
+ "non_malignant": {
107
+ "precision": 0.4727272727272727,
108
+ "recall": 0.52,
109
+ "f1-score": 0.49523809523809526,
110
+ "support": 50.0
111
+ },
112
+ "non_roi": {
113
+ "precision": 0.940952380952381,
114
+ "recall": 0.9364928909952607,
115
+ "f1-score": 0.9387173396674584,
116
+ "support": 1055.0
117
+ },
118
+ "accuracy": 0.9201784828953892,
119
+ "macro avg": {
120
+ "precision": 0.7789750892382471,
121
+ "recall": 0.7932461683434494,
122
+ "f1-score": 0.7857336829802138,
123
+ "support": 2017.0
124
+ },
125
+ "weighted avg": {
126
+ "precision": 0.9213391797427495,
127
+ "recall": 0.9201784828953892,
128
+ "f1-score": 0.9207281596981028,
129
+ "support": 2017.0
130
+ }
131
+ },
132
+ "n": 2017,
133
+ "src_B_acc": 0.9162087912087912,
134
+ "src_B_n": 728,
135
+ "src_C_acc": 0.9293577981651376,
136
+ "src_C_n": 1090,
137
+ "src_D_acc": 0.8844221105527639,
138
+ "src_D_n": 199
139
+ },
140
+ {
141
+ "fold": 2,
142
+ "macro_f1": 0.7068246241742177,
143
+ "accuracy": 0.9215291750503019,
144
+ "balanced_acc": 0.7139435823527381,
145
+ "per_class_recall": {
146
+ "malignant": 0.9407894736842105,
147
+ "non_malignant": 0.2653061224489796,
148
+ "non_roi": 0.9357351509250244
149
+ },
150
+ "confusion_matrix": [
151
+ [
152
+ 858,
153
+ 40,
154
+ 14
155
+ ],
156
+ [
157
+ 31,
158
+ 13,
159
+ 5
160
+ ],
161
+ [
162
+ 60,
163
+ 6,
164
+ 961
165
+ ]
166
+ ],
167
+ "classification_report": {
168
+ "malignant": {
169
+ "precision": 0.9041095890410958,
170
+ "recall": 0.9407894736842105,
171
+ "f1-score": 0.9220849005910801,
172
+ "support": 912.0
173
+ },
174
+ "non_malignant": {
175
+ "precision": 0.22033898305084745,
176
+ "recall": 0.2653061224489796,
177
+ "f1-score": 0.24074074074074073,
178
+ "support": 49.0
179
+ },
180
+ "non_roi": {
181
+ "precision": 0.9806122448979592,
182
+ "recall": 0.9357351509250244,
183
+ "f1-score": 0.9576482311908321,
184
+ "support": 1027.0
185
+ },
186
+ "accuracy": 0.9215291750503019,
187
+ "macro avg": {
188
+ "precision": 0.7016869389966341,
189
+ "recall": 0.7139435823527381,
190
+ "f1-score": 0.7068246241742177,
191
+ "support": 1988.0
192
+ },
193
+ "weighted avg": {
194
+ "precision": 0.9267773294191022,
195
+ "recall": 0.9215291750503019,
196
+ "f1-score": 0.9236632087868943,
197
+ "support": 1988.0
198
+ }
199
+ },
200
+ "n": 1988,
201
+ "src_B_acc": 0.9372496662216289,
202
+ "src_B_n": 749,
203
+ "src_C_acc": 0.948210922787194,
204
+ "src_C_n": 1062,
205
+ "src_D_acc": 0.6949152542372882,
206
+ "src_D_n": 177
207
+ },
208
+ {
209
+ "fold": 3,
210
+ "macro_f1": 0.7313823143068534,
211
+ "accuracy": 0.9012165450121654,
212
+ "balanced_acc": 0.7527928029132848,
213
+ "per_class_recall": {
214
+ "malignant": 0.8696604600219058,
215
+ "non_malignant": 0.44,
216
+ "non_roi": 0.9487179487179487
217
+ },
218
+ "confusion_matrix": [
219
+ [
220
+ 794,
221
+ 34,
222
+ 85
223
+ ],
224
+ [
225
+ 27,
226
+ 22,
227
+ 1
228
+ ],
229
+ [
230
+ 41,
231
+ 15,
232
+ 1036
233
+ ]
234
+ ],
235
+ "classification_report": {
236
+ "malignant": {
237
+ "precision": 0.9211136890951276,
238
+ "recall": 0.8696604600219058,
239
+ "f1-score": 0.8946478873239436,
240
+ "support": 913.0
241
+ },
242
+ "non_malignant": {
243
+ "precision": 0.30985915492957744,
244
+ "recall": 0.44,
245
+ "f1-score": 0.36363636363636365,
246
+ "support": 50.0
247
+ },
248
+ "non_roi": {
249
+ "precision": 0.9233511586452763,
250
+ "recall": 0.9487179487179487,
251
+ "f1-score": 0.935862691960253,
252
+ "support": 1092.0
253
+ },
254
+ "accuracy": 0.9012165450121654,
255
+ "macro avg": {
256
+ "precision": 0.7181080008899938,
257
+ "recall": 0.7527928029132848,
258
+ "f1-score": 0.7313823143068534,
259
+ "support": 2055.0
260
+ },
261
+ "weighted avg": {
262
+ "precision": 0.9074302779226141,
263
+ "recall": 0.9012165450121654,
264
+ "f1-score": 0.9036289045884063,
265
+ "support": 2055.0
266
+ }
267
+ },
268
+ "n": 2055,
269
+ "src_B_acc": 0.9026548672566371,
270
+ "src_B_n": 565,
271
+ "src_C_acc": 0.9003466204506065,
272
+ "src_C_n": 1154,
273
+ "src_D_acc": 0.9017857142857143,
274
+ "src_D_n": 336
275
+ },
276
+ {
277
+ "fold": 4,
278
+ "macro_f1": 0.6521586763136252,
279
+ "accuracy": 0.9229614807403702,
280
+ "balanced_acc": 0.6498121033048466,
281
+ "per_class_recall": {
282
+ "malignant": 0.940854326396495,
283
+ "non_malignant": 0.058823529411764705,
284
+ "non_roi": 0.9497584541062802
285
+ },
286
+ "confusion_matrix": [
287
+ [
288
+ 859,
289
+ 18,
290
+ 36
291
+ ],
292
+ [
293
+ 44,
294
+ 3,
295
+ 4
296
+ ],
297
+ [
298
+ 49,
299
+ 3,
300
+ 983
301
+ ]
302
+ ],
303
+ "classification_report": {
304
+ "malignant": {
305
+ "precision": 0.9023109243697479,
306
+ "recall": 0.940854326396495,
307
+ "f1-score": 0.9211796246648793,
308
+ "support": 913.0
309
+ },
310
+ "non_malignant": {
311
+ "precision": 0.125,
312
+ "recall": 0.058823529411764705,
313
+ "f1-score": 0.08,
314
+ "support": 51.0
315
+ },
316
+ "non_roi": {
317
+ "precision": 0.9608993157380255,
318
+ "recall": 0.9497584541062802,
319
+ "f1-score": 0.9552964042759962,
320
+ "support": 1035.0
321
+ },
322
+ "accuracy": 0.9229614807403702,
323
+ "macro avg": {
324
+ "precision": 0.6627367467025911,
325
+ "recall": 0.6498121033048466,
326
+ "f1-score": 0.6521586763136252,
327
+ "support": 1999.0
328
+ },
329
+ "weighted avg": {
330
+ "precision": 0.9128142399892127,
331
+ "recall": 0.9229614807403702,
332
+ "f1-score": 0.9173830794120515,
333
+ "support": 1999.0
334
+ }
335
+ },
336
+ "n": 1999,
337
+ "src_B_acc": 0.9550724637681159,
338
+ "src_B_n": 690,
339
+ "src_C_acc": 0.9227353463587922,
340
+ "src_C_n": 1126,
341
+ "src_D_acc": 0.8032786885245902,
342
+ "src_D_n": 183
343
+ }
344
+ ],
345
+ "cv_macro_f1_mean": 0.7279464289625859,
346
+ "cv_macro_f1_std": 0.046507217846586825,
347
+ "cv_non_malignant_recall_mean": 0.313968787515006,
348
+ "cv_non_malignant_recall_std": 0.15912146405458896
349
+ }
stage1_final/results/resized/swin/target3_swin_final.json ADDED
@@ -0,0 +1,4517 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backbone": "swin",
3
+ "val_metrics": {
4
+ "macro_f1": 0.7502886506230896,
5
+ "accuracy": 0.9197960129809921,
6
+ "balanced_acc": 0.7604949457422009,
7
+ "per_class_recall": {
8
+ "malignant": 0.9425641025641026,
9
+ "non_malignant": 0.41509433962264153,
10
+ "non_roi": 0.9238263950398583
11
+ },
12
+ "confusion_matrix": [
13
+ [
14
+ 919,
15
+ 17,
16
+ 39
17
+ ],
18
+ [
19
+ 25,
20
+ 22,
21
+ 6
22
+ ],
23
+ [
24
+ 63,
25
+ 23,
26
+ 1043
27
+ ]
28
+ ],
29
+ "classification_report": {
30
+ "malignant": {
31
+ "precision": 0.9126117179741807,
32
+ "recall": 0.9425641025641026,
33
+ "f1-score": 0.9273461150353178,
34
+ "support": 975.0
35
+ },
36
+ "non_malignant": {
37
+ "precision": 0.3548387096774194,
38
+ "recall": 0.41509433962264153,
39
+ "f1-score": 0.3826086956521739,
40
+ "support": 53.0
41
+ },
42
+ "non_roi": {
43
+ "precision": 0.9586397058823529,
44
+ "recall": 0.9238263950398583,
45
+ "f1-score": 0.9409111411817772,
46
+ "support": 1129.0
47
+ },
48
+ "accuracy": 0.9197960129809921,
49
+ "macro avg": {
50
+ "precision": 0.7420300445113176,
51
+ "recall": 0.7604949457422009,
52
+ "f1-score": 0.7502886506230896,
53
+ "support": 2157.0
54
+ },
55
+ "weighted avg": {
56
+ "precision": 0.9229981940560528,
57
+ "recall": 0.9197960129809921,
58
+ "f1-score": 0.9210613822082645,
59
+ "support": 2157.0
60
+ }
61
+ },
62
+ "n": 2157,
63
+ "src_B_acc": 0.970917225950783,
64
+ "src_B_n": 447,
65
+ "src_C_acc": 0.8880718954248366,
66
+ "src_C_n": 1224,
67
+ "src_D_acc": 0.9526748971193416,
68
+ "src_D_n": 486
69
+ },
70
+ "test_metrics": {
71
+ "macro_f1": 0.7703857191557216,
72
+ "accuracy": 0.9409851301115242,
73
+ "balanced_acc": 0.7393163915581238,
74
+ "per_class_recall": {
75
+ "malignant": 0.9713701431492843,
76
+ "non_malignant": 0.3018867924528302,
77
+ "non_roi": 0.944692239072257
78
+ },
79
+ "confusion_matrix": [
80
+ [
81
+ 950,
82
+ 4,
83
+ 24
84
+ ],
85
+ [
86
+ 29,
87
+ 16,
88
+ 8
89
+ ],
90
+ [
91
+ 57,
92
+ 5,
93
+ 1059
94
+ ]
95
+ ],
96
+ "classification_report": {
97
+ "malignant": {
98
+ "precision": 0.916988416988417,
99
+ "recall": 0.9713701431492843,
100
+ "f1-score": 0.9433962264150944,
101
+ "support": 978.0
102
+ },
103
+ "non_malignant": {
104
+ "precision": 0.64,
105
+ "recall": 0.3018867924528302,
106
+ "f1-score": 0.41025641025641024,
107
+ "support": 53.0
108
+ },
109
+ "non_roi": {
110
+ "precision": 0.9706691109074244,
111
+ "recall": 0.944692239072257,
112
+ "f1-score": 0.9575045207956601,
113
+ "support": 1121.0
114
+ },
115
+ "accuracy": 0.9409851301115242,
116
+ "macro avg": {
117
+ "precision": 0.8425525092986138,
118
+ "recall": 0.7393163915581238,
119
+ "f1-score": 0.7703857191557216,
120
+ "support": 2152.0
121
+ },
122
+ "weighted avg": {
123
+ "precision": 0.938129528411661,
124
+ "recall": 0.9409851301115242,
125
+ "f1-score": 0.9376150868910255,
126
+ "support": 2152.0
127
+ }
128
+ },
129
+ "n": 2152,
130
+ "src_B_acc": 0.9759206798866855,
131
+ "src_B_n": 706,
132
+ "src_C_acc": 0.928511354079058,
133
+ "src_C_n": 1189,
134
+ "src_D_acc": 0.9027237354085603,
135
+ "src_D_n": 257
136
+ },
137
+ "test_predictions": [
138
+ 0,
139
+ 0,
140
+ 0,
141
+ 0,
142
+ 0,
143
+ 0,
144
+ 0,
145
+ 0,
146
+ 0,
147
+ 0,
148
+ 0,
149
+ 0,
150
+ 0,
151
+ 0,
152
+ 0,
153
+ 0,
154
+ 0,
155
+ 0,
156
+ 0,
157
+ 0,
158
+ 0,
159
+ 0,
160
+ 0,
161
+ 0,
162
+ 0,
163
+ 0,
164
+ 0,
165
+ 0,
166
+ 0,
167
+ 0,
168
+ 0,
169
+ 0,
170
+ 0,
171
+ 0,
172
+ 0,
173
+ 0,
174
+ 0,
175
+ 0,
176
+ 0,
177
+ 0,
178
+ 0,
179
+ 0,
180
+ 0,
181
+ 0,
182
+ 0,
183
+ 0,
184
+ 0,
185
+ 0,
186
+ 0,
187
+ 0,
188
+ 0,
189
+ 0,
190
+ 0,
191
+ 0,
192
+ 0,
193
+ 0,
194
+ 0,
195
+ 0,
196
+ 0,
197
+ 0,
198
+ 0,
199
+ 0,
200
+ 0,
201
+ 0,
202
+ 0,
203
+ 0,
204
+ 0,
205
+ 0,
206
+ 0,
207
+ 0,
208
+ 0,
209
+ 0,
210
+ 0,
211
+ 0,
212
+ 0,
213
+ 0,
214
+ 0,
215
+ 2,
216
+ 0,
217
+ 0,
218
+ 0,
219
+ 0,
220
+ 0,
221
+ 0,
222
+ 0,
223
+ 0,
224
+ 0,
225
+ 0,
226
+ 0,
227
+ 0,
228
+ 0,
229
+ 0,
230
+ 0,
231
+ 0,
232
+ 0,
233
+ 0,
234
+ 0,
235
+ 0,
236
+ 0,
237
+ 0,
238
+ 0,
239
+ 0,
240
+ 0,
241
+ 0,
242
+ 0,
243
+ 0,
244
+ 0,
245
+ 0,
246
+ 0,
247
+ 0,
248
+ 0,
249
+ 0,
250
+ 0,
251
+ 0,
252
+ 0,
253
+ 0,
254
+ 0,
255
+ 0,
256
+ 0,
257
+ 0,
258
+ 0,
259
+ 0,
260
+ 0,
261
+ 0,
262
+ 0,
263
+ 0,
264
+ 0,
265
+ 0,
266
+ 0,
267
+ 0,
268
+ 0,
269
+ 0,
270
+ 0,
271
+ 0,
272
+ 0,
273
+ 0,
274
+ 2,
275
+ 2,
276
+ 2,
277
+ 2,
278
+ 2,
279
+ 2,
280
+ 2,
281
+ 0,
282
+ 2,
283
+ 2,
284
+ 2,
285
+ 2,
286
+ 2,
287
+ 2,
288
+ 2,
289
+ 2,
290
+ 2,
291
+ 2,
292
+ 2,
293
+ 2,
294
+ 2,
295
+ 2,
296
+ 2,
297
+ 2,
298
+ 2,
299
+ 2,
300
+ 2,
301
+ 2,
302
+ 2,
303
+ 2,
304
+ 2,
305
+ 2,
306
+ 2,
307
+ 2,
308
+ 2,
309
+ 2,
310
+ 2,
311
+ 2,
312
+ 2,
313
+ 2,
314
+ 2,
315
+ 2,
316
+ 2,
317
+ 2,
318
+ 2,
319
+ 2,
320
+ 2,
321
+ 2,
322
+ 2,
323
+ 2,
324
+ 2,
325
+ 2,
326
+ 2,
327
+ 2,
328
+ 2,
329
+ 2,
330
+ 2,
331
+ 2,
332
+ 2,
333
+ 2,
334
+ 2,
335
+ 2,
336
+ 2,
337
+ 2,
338
+ 2,
339
+ 2,
340
+ 2,
341
+ 2,
342
+ 2,
343
+ 2,
344
+ 2,
345
+ 2,
346
+ 2,
347
+ 2,
348
+ 2,
349
+ 2,
350
+ 2,
351
+ 2,
352
+ 2,
353
+ 2,
354
+ 2,
355
+ 0,
356
+ 0,
357
+ 0,
358
+ 2,
359
+ 0,
360
+ 0,
361
+ 2,
362
+ 2,
363
+ 0,
364
+ 2,
365
+ 2,
366
+ 2,
367
+ 2,
368
+ 2,
369
+ 2,
370
+ 2,
371
+ 2,
372
+ 0,
373
+ 2,
374
+ 0,
375
+ 0,
376
+ 2,
377
+ 0,
378
+ 0,
379
+ 2,
380
+ 0,
381
+ 2,
382
+ 0,
383
+ 0,
384
+ 0,
385
+ 0,
386
+ 0,
387
+ 2,
388
+ 2,
389
+ 2,
390
+ 2,
391
+ 2,
392
+ 2,
393
+ 2,
394
+ 2,
395
+ 2,
396
+ 2,
397
+ 2,
398
+ 2,
399
+ 2,
400
+ 2,
401
+ 2,
402
+ 2,
403
+ 2,
404
+ 2,
405
+ 2,
406
+ 2,
407
+ 2,
408
+ 2,
409
+ 2,
410
+ 2,
411
+ 2,
412
+ 2,
413
+ 1,
414
+ 2,
415
+ 2,
416
+ 2,
417
+ 2,
418
+ 2,
419
+ 2,
420
+ 2,
421
+ 2,
422
+ 2,
423
+ 2,
424
+ 2,
425
+ 0,
426
+ 2,
427
+ 2,
428
+ 2,
429
+ 2,
430
+ 2,
431
+ 2,
432
+ 2,
433
+ 2,
434
+ 2,
435
+ 2,
436
+ 2,
437
+ 2,
438
+ 2,
439
+ 2,
440
+ 2,
441
+ 2,
442
+ 2,
443
+ 2,
444
+ 2,
445
+ 2,
446
+ 2,
447
+ 2,
448
+ 2,
449
+ 2,
450
+ 2,
451
+ 2,
452
+ 2,
453
+ 2,
454
+ 2,
455
+ 2,
456
+ 2,
457
+ 2,
458
+ 2,
459
+ 2,
460
+ 2,
461
+ 2,
462
+ 2,
463
+ 2,
464
+ 2,
465
+ 2,
466
+ 2,
467
+ 2,
468
+ 2,
469
+ 2,
470
+ 2,
471
+ 2,
472
+ 2,
473
+ 2,
474
+ 2,
475
+ 2,
476
+ 2,
477
+ 2,
478
+ 2,
479
+ 2,
480
+ 2,
481
+ 2,
482
+ 2,
483
+ 2,
484
+ 2,
485
+ 2,
486
+ 2,
487
+ 2,
488
+ 2,
489
+ 2,
490
+ 2,
491
+ 2,
492
+ 2,
493
+ 2,
494
+ 2,
495
+ 2,
496
+ 2,
497
+ 2,
498
+ 2,
499
+ 2,
500
+ 2,
501
+ 2,
502
+ 2,
503
+ 2,
504
+ 2,
505
+ 2,
506
+ 2,
507
+ 2,
508
+ 2,
509
+ 2,
510
+ 2,
511
+ 2,
512
+ 2,
513
+ 2,
514
+ 2,
515
+ 2,
516
+ 2,
517
+ 2,
518
+ 2,
519
+ 2,
520
+ 2,
521
+ 2,
522
+ 2,
523
+ 2,
524
+ 2,
525
+ 0,
526
+ 0,
527
+ 0,
528
+ 0,
529
+ 0,
530
+ 0,
531
+ 0,
532
+ 0,
533
+ 0,
534
+ 0,
535
+ 0,
536
+ 0,
537
+ 2,
538
+ 2,
539
+ 2,
540
+ 0,
541
+ 2,
542
+ 2,
543
+ 0,
544
+ 0,
545
+ 2,
546
+ 2,
547
+ 2,
548
+ 2,
549
+ 2,
550
+ 2,
551
+ 2,
552
+ 2,
553
+ 2,
554
+ 2,
555
+ 2,
556
+ 2,
557
+ 2,
558
+ 2,
559
+ 2,
560
+ 2,
561
+ 2,
562
+ 2,
563
+ 2,
564
+ 2,
565
+ 2,
566
+ 2,
567
+ 2,
568
+ 2,
569
+ 2,
570
+ 2,
571
+ 2,
572
+ 2,
573
+ 2,
574
+ 2,
575
+ 2,
576
+ 2,
577
+ 2,
578
+ 2,
579
+ 2,
580
+ 2,
581
+ 2,
582
+ 2,
583
+ 2,
584
+ 2,
585
+ 2,
586
+ 2,
587
+ 2,
588
+ 2,
589
+ 2,
590
+ 2,
591
+ 2,
592
+ 2,
593
+ 2,
594
+ 2,
595
+ 2,
596
+ 2,
597
+ 2,
598
+ 2,
599
+ 2,
600
+ 2,
601
+ 2,
602
+ 2,
603
+ 2,
604
+ 2,
605
+ 2,
606
+ 2,
607
+ 2,
608
+ 2,
609
+ 2,
610
+ 2,
611
+ 2,
612
+ 2,
613
+ 2,
614
+ 2,
615
+ 2,
616
+ 2,
617
+ 2,
618
+ 2,
619
+ 2,
620
+ 2,
621
+ 2,
622
+ 2,
623
+ 2,
624
+ 2,
625
+ 2,
626
+ 2,
627
+ 2,
628
+ 0,
629
+ 2,
630
+ 2,
631
+ 2,
632
+ 2,
633
+ 2,
634
+ 2,
635
+ 2,
636
+ 2,
637
+ 2,
638
+ 2,
639
+ 2,
640
+ 2,
641
+ 2,
642
+ 2,
643
+ 2,
644
+ 2,
645
+ 2,
646
+ 2,
647
+ 2,
648
+ 2,
649
+ 2,
650
+ 2,
651
+ 2,
652
+ 2,
653
+ 2,
654
+ 2,
655
+ 2,
656
+ 0,
657
+ 2,
658
+ 2,
659
+ 2,
660
+ 2,
661
+ 2,
662
+ 2,
663
+ 2,
664
+ 2,
665
+ 2,
666
+ 2,
667
+ 2,
668
+ 2,
669
+ 2,
670
+ 2,
671
+ 2,
672
+ 2,
673
+ 2,
674
+ 2,
675
+ 2,
676
+ 2,
677
+ 2,
678
+ 2,
679
+ 2,
680
+ 2,
681
+ 2,
682
+ 2,
683
+ 2,
684
+ 2,
685
+ 2,
686
+ 2,
687
+ 2,
688
+ 2,
689
+ 2,
690
+ 2,
691
+ 2,
692
+ 2,
693
+ 2,
694
+ 2,
695
+ 2,
696
+ 2,
697
+ 2,
698
+ 2,
699
+ 2,
700
+ 2,
701
+ 2,
702
+ 2,
703
+ 2,
704
+ 2,
705
+ 2,
706
+ 2,
707
+ 2,
708
+ 2,
709
+ 2,
710
+ 2,
711
+ 2,
712
+ 2,
713
+ 2,
714
+ 2,
715
+ 2,
716
+ 2,
717
+ 2,
718
+ 2,
719
+ 2,
720
+ 2,
721
+ 2,
722
+ 2,
723
+ 2,
724
+ 2,
725
+ 2,
726
+ 2,
727
+ 2,
728
+ 2,
729
+ 2,
730
+ 2,
731
+ 2,
732
+ 2,
733
+ 2,
734
+ 2,
735
+ 2,
736
+ 2,
737
+ 2,
738
+ 2,
739
+ 2,
740
+ 2,
741
+ 2,
742
+ 2,
743
+ 2,
744
+ 2,
745
+ 2,
746
+ 2,
747
+ 2,
748
+ 2,
749
+ 2,
750
+ 2,
751
+ 2,
752
+ 2,
753
+ 2,
754
+ 2,
755
+ 2,
756
+ 2,
757
+ 2,
758
+ 2,
759
+ 2,
760
+ 2,
761
+ 2,
762
+ 2,
763
+ 2,
764
+ 2,
765
+ 2,
766
+ 2,
767
+ 2,
768
+ 2,
769
+ 2,
770
+ 2,
771
+ 2,
772
+ 2,
773
+ 2,
774
+ 2,
775
+ 2,
776
+ 2,
777
+ 2,
778
+ 2,
779
+ 2,
780
+ 2,
781
+ 2,
782
+ 2,
783
+ 2,
784
+ 2,
785
+ 2,
786
+ 2,
787
+ 2,
788
+ 2,
789
+ 2,
790
+ 2,
791
+ 2,
792
+ 2,
793
+ 2,
794
+ 2,
795
+ 2,
796
+ 2,
797
+ 2,
798
+ 0,
799
+ 0,
800
+ 0,
801
+ 2,
802
+ 2,
803
+ 2,
804
+ 0,
805
+ 0,
806
+ 2,
807
+ 2,
808
+ 2,
809
+ 2,
810
+ 2,
811
+ 2,
812
+ 2,
813
+ 2,
814
+ 2,
815
+ 0,
816
+ 2,
817
+ 2,
818
+ 2,
819
+ 2,
820
+ 2,
821
+ 2,
822
+ 2,
823
+ 2,
824
+ 2,
825
+ 2,
826
+ 2,
827
+ 2,
828
+ 2,
829
+ 2,
830
+ 2,
831
+ 2,
832
+ 2,
833
+ 2,
834
+ 2,
835
+ 2,
836
+ 2,
837
+ 2,
838
+ 2,
839
+ 2,
840
+ 2,
841
+ 2,
842
+ 2,
843
+ 2,
844
+ 2,
845
+ 2,
846
+ 2,
847
+ 2,
848
+ 2,
849
+ 2,
850
+ 2,
851
+ 2,
852
+ 2,
853
+ 2,
854
+ 2,
855
+ 2,
856
+ 2,
857
+ 2,
858
+ 2,
859
+ 2,
860
+ 2,
861
+ 2,
862
+ 2,
863
+ 2,
864
+ 2,
865
+ 2,
866
+ 2,
867
+ 2,
868
+ 2,
869
+ 2,
870
+ 2,
871
+ 2,
872
+ 2,
873
+ 2,
874
+ 2,
875
+ 2,
876
+ 2,
877
+ 2,
878
+ 2,
879
+ 2,
880
+ 2,
881
+ 2,
882
+ 2,
883
+ 2,
884
+ 2,
885
+ 2,
886
+ 2,
887
+ 2,
888
+ 2,
889
+ 2,
890
+ 2,
891
+ 2,
892
+ 2,
893
+ 2,
894
+ 2,
895
+ 2,
896
+ 2,
897
+ 2,
898
+ 2,
899
+ 2,
900
+ 2,
901
+ 2,
902
+ 2,
903
+ 2,
904
+ 2,
905
+ 2,
906
+ 2,
907
+ 2,
908
+ 2,
909
+ 2,
910
+ 2,
911
+ 0,
912
+ 2,
913
+ 2,
914
+ 2,
915
+ 2,
916
+ 2,
917
+ 2,
918
+ 2,
919
+ 2,
920
+ 0,
921
+ 2,
922
+ 2,
923
+ 2,
924
+ 2,
925
+ 2,
926
+ 2,
927
+ 0,
928
+ 2,
929
+ 2,
930
+ 2,
931
+ 2,
932
+ 2,
933
+ 2,
934
+ 2,
935
+ 2,
936
+ 2,
937
+ 2,
938
+ 2,
939
+ 2,
940
+ 2,
941
+ 2,
942
+ 2,
943
+ 2,
944
+ 2,
945
+ 2,
946
+ 2,
947
+ 2,
948
+ 2,
949
+ 2,
950
+ 2,
951
+ 2,
952
+ 2,
953
+ 2,
954
+ 2,
955
+ 2,
956
+ 2,
957
+ 2,
958
+ 2,
959
+ 2,
960
+ 2,
961
+ 2,
962
+ 2,
963
+ 2,
964
+ 2,
965
+ 2,
966
+ 2,
967
+ 2,
968
+ 2,
969
+ 2,
970
+ 2,
971
+ 2,
972
+ 2,
973
+ 2,
974
+ 2,
975
+ 2,
976
+ 2,
977
+ 2,
978
+ 2,
979
+ 2,
980
+ 2,
981
+ 2,
982
+ 2,
983
+ 2,
984
+ 2,
985
+ 2,
986
+ 2,
987
+ 2,
988
+ 2,
989
+ 2,
990
+ 2,
991
+ 2,
992
+ 2,
993
+ 2,
994
+ 0,
995
+ 2,
996
+ 2,
997
+ 2,
998
+ 2,
999
+ 2,
1000
+ 2,
1001
+ 2,
1002
+ 2,
1003
+ 2,
1004
+ 2,
1005
+ 2,
1006
+ 2,
1007
+ 2,
1008
+ 2,
1009
+ 2,
1010
+ 2,
1011
+ 2,
1012
+ 2,
1013
+ 2,
1014
+ 2,
1015
+ 0,
1016
+ 0,
1017
+ 0,
1018
+ 2,
1019
+ 2,
1020
+ 2,
1021
+ 2,
1022
+ 2,
1023
+ 2,
1024
+ 2,
1025
+ 2,
1026
+ 2,
1027
+ 2,
1028
+ 2,
1029
+ 2,
1030
+ 2,
1031
+ 2,
1032
+ 2,
1033
+ 2,
1034
+ 2,
1035
+ 2,
1036
+ 2,
1037
+ 2,
1038
+ 2,
1039
+ 2,
1040
+ 2,
1041
+ 2,
1042
+ 2,
1043
+ 2,
1044
+ 2,
1045
+ 2,
1046
+ 2,
1047
+ 2,
1048
+ 2,
1049
+ 2,
1050
+ 2,
1051
+ 2,
1052
+ 2,
1053
+ 2,
1054
+ 2,
1055
+ 0,
1056
+ 0,
1057
+ 0,
1058
+ 0,
1059
+ 0,
1060
+ 2,
1061
+ 2,
1062
+ 2,
1063
+ 2,
1064
+ 2,
1065
+ 2,
1066
+ 2,
1067
+ 2,
1068
+ 2,
1069
+ 2,
1070
+ 2,
1071
+ 2,
1072
+ 2,
1073
+ 2,
1074
+ 2,
1075
+ 2,
1076
+ 2,
1077
+ 2,
1078
+ 2,
1079
+ 2,
1080
+ 2,
1081
+ 2,
1082
+ 2,
1083
+ 0,
1084
+ 0,
1085
+ 2,
1086
+ 0,
1087
+ 0,
1088
+ 0,
1089
+ 0,
1090
+ 0,
1091
+ 0,
1092
+ 0,
1093
+ 0,
1094
+ 1,
1095
+ 2,
1096
+ 0,
1097
+ 0,
1098
+ 0,
1099
+ 0,
1100
+ 1,
1101
+ 0,
1102
+ 0,
1103
+ 0,
1104
+ 1,
1105
+ 0,
1106
+ 0,
1107
+ 0,
1108
+ 1,
1109
+ 0,
1110
+ 0,
1111
+ 0,
1112
+ 0,
1113
+ 0,
1114
+ 0,
1115
+ 0,
1116
+ 0,
1117
+ 1,
1118
+ 0,
1119
+ 0,
1120
+ 0,
1121
+ 0,
1122
+ 2,
1123
+ 1,
1124
+ 1,
1125
+ 1,
1126
+ 0,
1127
+ 0,
1128
+ 0,
1129
+ 0,
1130
+ 0,
1131
+ 0,
1132
+ 0,
1133
+ 0,
1134
+ 0,
1135
+ 0,
1136
+ 0,
1137
+ 1,
1138
+ 0,
1139
+ 0,
1140
+ 0,
1141
+ 0,
1142
+ 0,
1143
+ 0,
1144
+ 1,
1145
+ 0,
1146
+ 0,
1147
+ 0,
1148
+ 0,
1149
+ 0,
1150
+ 1,
1151
+ 2,
1152
+ 0,
1153
+ 0,
1154
+ 0,
1155
+ 1,
1156
+ 2,
1157
+ 2,
1158
+ 2,
1159
+ 2,
1160
+ 2,
1161
+ 2,
1162
+ 2,
1163
+ 2,
1164
+ 2,
1165
+ 2,
1166
+ 2,
1167
+ 2,
1168
+ 0,
1169
+ 0,
1170
+ 0,
1171
+ 0,
1172
+ 0,
1173
+ 0,
1174
+ 0,
1175
+ 0,
1176
+ 0,
1177
+ 0,
1178
+ 0,
1179
+ 0,
1180
+ 0,
1181
+ 0,
1182
+ 0,
1183
+ 0,
1184
+ 0,
1185
+ 0,
1186
+ 0,
1187
+ 0,
1188
+ 0,
1189
+ 0,
1190
+ 0,
1191
+ 0,
1192
+ 0,
1193
+ 0,
1194
+ 0,
1195
+ 0,
1196
+ 0,
1197
+ 0,
1198
+ 0,
1199
+ 0,
1200
+ 0,
1201
+ 0,
1202
+ 0,
1203
+ 0,
1204
+ 0,
1205
+ 0,
1206
+ 0,
1207
+ 0,
1208
+ 0,
1209
+ 0,
1210
+ 0,
1211
+ 0,
1212
+ 0,
1213
+ 0,
1214
+ 0,
1215
+ 0,
1216
+ 0,
1217
+ 0,
1218
+ 0,
1219
+ 0,
1220
+ 0,
1221
+ 0,
1222
+ 0,
1223
+ 0,
1224
+ 0,
1225
+ 0,
1226
+ 0,
1227
+ 0,
1228
+ 0,
1229
+ 0,
1230
+ 0,
1231
+ 0,
1232
+ 0,
1233
+ 0,
1234
+ 0,
1235
+ 0,
1236
+ 0,
1237
+ 0,
1238
+ 0,
1239
+ 0,
1240
+ 0,
1241
+ 0,
1242
+ 0,
1243
+ 0,
1244
+ 0,
1245
+ 0,
1246
+ 0,
1247
+ 0,
1248
+ 0,
1249
+ 0,
1250
+ 0,
1251
+ 0,
1252
+ 0,
1253
+ 0,
1254
+ 0,
1255
+ 0,
1256
+ 0,
1257
+ 0,
1258
+ 0,
1259
+ 0,
1260
+ 0,
1261
+ 0,
1262
+ 0,
1263
+ 0,
1264
+ 0,
1265
+ 0,
1266
+ 0,
1267
+ 0,
1268
+ 0,
1269
+ 0,
1270
+ 0,
1271
+ 0,
1272
+ 0,
1273
+ 0,
1274
+ 0,
1275
+ 0,
1276
+ 0,
1277
+ 0,
1278
+ 0,
1279
+ 0,
1280
+ 0,
1281
+ 0,
1282
+ 0,
1283
+ 0,
1284
+ 0,
1285
+ 0,
1286
+ 0,
1287
+ 0,
1288
+ 0,
1289
+ 0,
1290
+ 0,
1291
+ 0,
1292
+ 0,
1293
+ 0,
1294
+ 0,
1295
+ 0,
1296
+ 0,
1297
+ 0,
1298
+ 0,
1299
+ 0,
1300
+ 0,
1301
+ 0,
1302
+ 0,
1303
+ 0,
1304
+ 0,
1305
+ 0,
1306
+ 0,
1307
+ 0,
1308
+ 0,
1309
+ 0,
1310
+ 0,
1311
+ 0,
1312
+ 0,
1313
+ 0,
1314
+ 0,
1315
+ 0,
1316
+ 0,
1317
+ 0,
1318
+ 0,
1319
+ 0,
1320
+ 0,
1321
+ 0,
1322
+ 0,
1323
+ 0,
1324
+ 0,
1325
+ 0,
1326
+ 0,
1327
+ 0,
1328
+ 0,
1329
+ 0,
1330
+ 0,
1331
+ 0,
1332
+ 0,
1333
+ 0,
1334
+ 0,
1335
+ 0,
1336
+ 0,
1337
+ 0,
1338
+ 0,
1339
+ 0,
1340
+ 0,
1341
+ 0,
1342
+ 0,
1343
+ 0,
1344
+ 0,
1345
+ 0,
1346
+ 0,
1347
+ 0,
1348
+ 0,
1349
+ 0,
1350
+ 0,
1351
+ 0,
1352
+ 0,
1353
+ 0,
1354
+ 0,
1355
+ 0,
1356
+ 0,
1357
+ 0,
1358
+ 0,
1359
+ 0,
1360
+ 0,
1361
+ 0,
1362
+ 0,
1363
+ 0,
1364
+ 0,
1365
+ 0,
1366
+ 0,
1367
+ 0,
1368
+ 0,
1369
+ 0,
1370
+ 0,
1371
+ 0,
1372
+ 0,
1373
+ 0,
1374
+ 0,
1375
+ 0,
1376
+ 0,
1377
+ 0,
1378
+ 0,
1379
+ 0,
1380
+ 0,
1381
+ 0,
1382
+ 0,
1383
+ 0,
1384
+ 0,
1385
+ 0,
1386
+ 0,
1387
+ 0,
1388
+ 0,
1389
+ 0,
1390
+ 0,
1391
+ 0,
1392
+ 0,
1393
+ 0,
1394
+ 0,
1395
+ 0,
1396
+ 0,
1397
+ 0,
1398
+ 0,
1399
+ 0,
1400
+ 0,
1401
+ 0,
1402
+ 0,
1403
+ 0,
1404
+ 0,
1405
+ 0,
1406
+ 0,
1407
+ 0,
1408
+ 0,
1409
+ 0,
1410
+ 0,
1411
+ 0,
1412
+ 0,
1413
+ 0,
1414
+ 0,
1415
+ 0,
1416
+ 0,
1417
+ 0,
1418
+ 0,
1419
+ 0,
1420
+ 0,
1421
+ 0,
1422
+ 0,
1423
+ 0,
1424
+ 0,
1425
+ 0,
1426
+ 0,
1427
+ 0,
1428
+ 0,
1429
+ 0,
1430
+ 0,
1431
+ 0,
1432
+ 0,
1433
+ 0,
1434
+ 0,
1435
+ 0,
1436
+ 0,
1437
+ 0,
1438
+ 0,
1439
+ 0,
1440
+ 0,
1441
+ 0,
1442
+ 0,
1443
+ 0,
1444
+ 0,
1445
+ 0,
1446
+ 0,
1447
+ 0,
1448
+ 0,
1449
+ 0,
1450
+ 0,
1451
+ 0,
1452
+ 0,
1453
+ 0,
1454
+ 0,
1455
+ 0,
1456
+ 0,
1457
+ 0,
1458
+ 0,
1459
+ 0,
1460
+ 0,
1461
+ 0,
1462
+ 0,
1463
+ 0,
1464
+ 0,
1465
+ 0,
1466
+ 0,
1467
+ 0,
1468
+ 0,
1469
+ 0,
1470
+ 0,
1471
+ 0,
1472
+ 0,
1473
+ 0,
1474
+ 0,
1475
+ 0,
1476
+ 0,
1477
+ 0,
1478
+ 0,
1479
+ 0,
1480
+ 0,
1481
+ 0,
1482
+ 0,
1483
+ 0,
1484
+ 0,
1485
+ 0,
1486
+ 0,
1487
+ 0,
1488
+ 0,
1489
+ 0,
1490
+ 0,
1491
+ 0,
1492
+ 0,
1493
+ 0,
1494
+ 0,
1495
+ 0,
1496
+ 0,
1497
+ 2,
1498
+ 0,
1499
+ 0,
1500
+ 0,
1501
+ 0,
1502
+ 0,
1503
+ 0,
1504
+ 0,
1505
+ 0,
1506
+ 0,
1507
+ 0,
1508
+ 0,
1509
+ 0,
1510
+ 0,
1511
+ 0,
1512
+ 0,
1513
+ 0,
1514
+ 0,
1515
+ 0,
1516
+ 0,
1517
+ 0,
1518
+ 0,
1519
+ 0,
1520
+ 0,
1521
+ 0,
1522
+ 0,
1523
+ 0,
1524
+ 0,
1525
+ 0,
1526
+ 0,
1527
+ 0,
1528
+ 0,
1529
+ 0,
1530
+ 0,
1531
+ 0,
1532
+ 0,
1533
+ 0,
1534
+ 0,
1535
+ 0,
1536
+ 0,
1537
+ 0,
1538
+ 0,
1539
+ 0,
1540
+ 0,
1541
+ 0,
1542
+ 0,
1543
+ 0,
1544
+ 0,
1545
+ 0,
1546
+ 0,
1547
+ 2,
1548
+ 0,
1549
+ 0,
1550
+ 0,
1551
+ 0,
1552
+ 0,
1553
+ 0,
1554
+ 2,
1555
+ 0,
1556
+ 0,
1557
+ 0,
1558
+ 0,
1559
+ 0,
1560
+ 0,
1561
+ 0,
1562
+ 0,
1563
+ 0,
1564
+ 0,
1565
+ 0,
1566
+ 0,
1567
+ 0,
1568
+ 0,
1569
+ 0,
1570
+ 0,
1571
+ 0,
1572
+ 0,
1573
+ 0,
1574
+ 0,
1575
+ 0,
1576
+ 0,
1577
+ 0,
1578
+ 0,
1579
+ 0,
1580
+ 0,
1581
+ 0,
1582
+ 0,
1583
+ 0,
1584
+ 0,
1585
+ 0,
1586
+ 0,
1587
+ 0,
1588
+ 0,
1589
+ 0,
1590
+ 0,
1591
+ 2,
1592
+ 0,
1593
+ 0,
1594
+ 0,
1595
+ 0,
1596
+ 0,
1597
+ 0,
1598
+ 0,
1599
+ 0,
1600
+ 0,
1601
+ 0,
1602
+ 0,
1603
+ 0,
1604
+ 0,
1605
+ 0,
1606
+ 0,
1607
+ 0,
1608
+ 0,
1609
+ 2,
1610
+ 2,
1611
+ 2,
1612
+ 0,
1613
+ 2,
1614
+ 0,
1615
+ 0,
1616
+ 0,
1617
+ 0,
1618
+ 0,
1619
+ 0,
1620
+ 0,
1621
+ 0,
1622
+ 0,
1623
+ 0,
1624
+ 0,
1625
+ 0,
1626
+ 0,
1627
+ 0,
1628
+ 0,
1629
+ 0,
1630
+ 0,
1631
+ 0,
1632
+ 0,
1633
+ 0,
1634
+ 0,
1635
+ 0,
1636
+ 0,
1637
+ 0,
1638
+ 0,
1639
+ 0,
1640
+ 0,
1641
+ 0,
1642
+ 0,
1643
+ 2,
1644
+ 0,
1645
+ 0,
1646
+ 0,
1647
+ 0,
1648
+ 0,
1649
+ 0,
1650
+ 0,
1651
+ 0,
1652
+ 0,
1653
+ 0,
1654
+ 0,
1655
+ 0,
1656
+ 0,
1657
+ 0,
1658
+ 0,
1659
+ 0,
1660
+ 0,
1661
+ 0,
1662
+ 0,
1663
+ 0,
1664
+ 0,
1665
+ 0,
1666
+ 0,
1667
+ 0,
1668
+ 0,
1669
+ 0,
1670
+ 0,
1671
+ 0,
1672
+ 0,
1673
+ 0,
1674
+ 0,
1675
+ 0,
1676
+ 0,
1677
+ 0,
1678
+ 0,
1679
+ 0,
1680
+ 0,
1681
+ 0,
1682
+ 0,
1683
+ 0,
1684
+ 0,
1685
+ 0,
1686
+ 0,
1687
+ 0,
1688
+ 0,
1689
+ 0,
1690
+ 0,
1691
+ 0,
1692
+ 0,
1693
+ 0,
1694
+ 0,
1695
+ 0,
1696
+ 0,
1697
+ 0,
1698
+ 0,
1699
+ 0,
1700
+ 0,
1701
+ 0,
1702
+ 0,
1703
+ 0,
1704
+ 0,
1705
+ 0,
1706
+ 0,
1707
+ 0,
1708
+ 0,
1709
+ 0,
1710
+ 0,
1711
+ 0,
1712
+ 0,
1713
+ 0,
1714
+ 0,
1715
+ 0,
1716
+ 0,
1717
+ 0,
1718
+ 0,
1719
+ 0,
1720
+ 0,
1721
+ 0,
1722
+ 0,
1723
+ 0,
1724
+ 0,
1725
+ 0,
1726
+ 0,
1727
+ 0,
1728
+ 0,
1729
+ 0,
1730
+ 0,
1731
+ 0,
1732
+ 0,
1733
+ 0,
1734
+ 0,
1735
+ 0,
1736
+ 0,
1737
+ 0,
1738
+ 0,
1739
+ 0,
1740
+ 0,
1741
+ 0,
1742
+ 0,
1743
+ 0,
1744
+ 0,
1745
+ 0,
1746
+ 0,
1747
+ 0,
1748
+ 0,
1749
+ 0,
1750
+ 0,
1751
+ 0,
1752
+ 0,
1753
+ 0,
1754
+ 0,
1755
+ 0,
1756
+ 0,
1757
+ 0,
1758
+ 0,
1759
+ 0,
1760
+ 0,
1761
+ 0,
1762
+ 0,
1763
+ 0,
1764
+ 0,
1765
+ 0,
1766
+ 0,
1767
+ 0,
1768
+ 0,
1769
+ 0,
1770
+ 0,
1771
+ 0,
1772
+ 0,
1773
+ 0,
1774
+ 0,
1775
+ 0,
1776
+ 0,
1777
+ 0,
1778
+ 0,
1779
+ 0,
1780
+ 0,
1781
+ 0,
1782
+ 0,
1783
+ 0,
1784
+ 0,
1785
+ 0,
1786
+ 0,
1787
+ 0,
1788
+ 0,
1789
+ 0,
1790
+ 0,
1791
+ 0,
1792
+ 0,
1793
+ 0,
1794
+ 0,
1795
+ 0,
1796
+ 0,
1797
+ 0,
1798
+ 0,
1799
+ 0,
1800
+ 0,
1801
+ 0,
1802
+ 0,
1803
+ 0,
1804
+ 0,
1805
+ 0,
1806
+ 0,
1807
+ 0,
1808
+ 0,
1809
+ 0,
1810
+ 0,
1811
+ 0,
1812
+ 0,
1813
+ 0,
1814
+ 0,
1815
+ 0,
1816
+ 0,
1817
+ 0,
1818
+ 0,
1819
+ 0,
1820
+ 0,
1821
+ 0,
1822
+ 0,
1823
+ 0,
1824
+ 0,
1825
+ 0,
1826
+ 0,
1827
+ 0,
1828
+ 0,
1829
+ 0,
1830
+ 0,
1831
+ 0,
1832
+ 0,
1833
+ 0,
1834
+ 0,
1835
+ 0,
1836
+ 0,
1837
+ 0,
1838
+ 0,
1839
+ 0,
1840
+ 0,
1841
+ 0,
1842
+ 0,
1843
+ 0,
1844
+ 0,
1845
+ 0,
1846
+ 0,
1847
+ 0,
1848
+ 0,
1849
+ 0,
1850
+ 0,
1851
+ 0,
1852
+ 0,
1853
+ 0,
1854
+ 0,
1855
+ 0,
1856
+ 0,
1857
+ 0,
1858
+ 0,
1859
+ 0,
1860
+ 0,
1861
+ 0,
1862
+ 0,
1863
+ 0,
1864
+ 2,
1865
+ 0,
1866
+ 0,
1867
+ 0,
1868
+ 0,
1869
+ 0,
1870
+ 0,
1871
+ 0,
1872
+ 0,
1873
+ 0,
1874
+ 0,
1875
+ 0,
1876
+ 0,
1877
+ 0,
1878
+ 0,
1879
+ 0,
1880
+ 0,
1881
+ 0,
1882
+ 0,
1883
+ 0,
1884
+ 0,
1885
+ 0,
1886
+ 0,
1887
+ 0,
1888
+ 0,
1889
+ 0,
1890
+ 0,
1891
+ 0,
1892
+ 0,
1893
+ 0,
1894
+ 0,
1895
+ 0,
1896
+ 0,
1897
+ 0,
1898
+ 0,
1899
+ 0,
1900
+ 0,
1901
+ 0,
1902
+ 0,
1903
+ 0,
1904
+ 0,
1905
+ 0,
1906
+ 0,
1907
+ 0,
1908
+ 0,
1909
+ 0,
1910
+ 0,
1911
+ 0,
1912
+ 0,
1913
+ 0,
1914
+ 0,
1915
+ 0,
1916
+ 2,
1917
+ 2,
1918
+ 2,
1919
+ 2,
1920
+ 2,
1921
+ 2,
1922
+ 2,
1923
+ 0,
1924
+ 2,
1925
+ 2,
1926
+ 2,
1927
+ 2,
1928
+ 2,
1929
+ 2,
1930
+ 2,
1931
+ 2,
1932
+ 2,
1933
+ 2,
1934
+ 2,
1935
+ 2,
1936
+ 0,
1937
+ 0,
1938
+ 2,
1939
+ 2,
1940
+ 2,
1941
+ 2,
1942
+ 2,
1943
+ 2,
1944
+ 2,
1945
+ 2,
1946
+ 2,
1947
+ 2,
1948
+ 2,
1949
+ 1,
1950
+ 0,
1951
+ 0,
1952
+ 0,
1953
+ 0,
1954
+ 1,
1955
+ 0,
1956
+ 1,
1957
+ 1,
1958
+ 1,
1959
+ 1,
1960
+ 1,
1961
+ 2,
1962
+ 2,
1963
+ 0,
1964
+ 2,
1965
+ 0,
1966
+ 0,
1967
+ 0,
1968
+ 0,
1969
+ 0,
1970
+ 0,
1971
+ 0,
1972
+ 0,
1973
+ 0,
1974
+ 0,
1975
+ 0,
1976
+ 0,
1977
+ 0,
1978
+ 0,
1979
+ 0,
1980
+ 0,
1981
+ 2,
1982
+ 2,
1983
+ 2,
1984
+ 2,
1985
+ 2,
1986
+ 0,
1987
+ 0,
1988
+ 1,
1989
+ 1,
1990
+ 2,
1991
+ 2,
1992
+ 2,
1993
+ 2,
1994
+ 2,
1995
+ 2,
1996
+ 2,
1997
+ 2,
1998
+ 2,
1999
+ 2,
2000
+ 2,
2001
+ 2,
2002
+ 2,
2003
+ 2,
2004
+ 2,
2005
+ 2,
2006
+ 2,
2007
+ 2,
2008
+ 2,
2009
+ 2,
2010
+ 2,
2011
+ 2,
2012
+ 2,
2013
+ 2,
2014
+ 2,
2015
+ 2,
2016
+ 2,
2017
+ 2,
2018
+ 2,
2019
+ 2,
2020
+ 2,
2021
+ 2,
2022
+ 2,
2023
+ 2,
2024
+ 2,
2025
+ 2,
2026
+ 2,
2027
+ 2,
2028
+ 2,
2029
+ 2,
2030
+ 2,
2031
+ 2,
2032
+ 2,
2033
+ 2,
2034
+ 2,
2035
+ 2,
2036
+ 2,
2037
+ 2,
2038
+ 2,
2039
+ 2,
2040
+ 2,
2041
+ 2,
2042
+ 2,
2043
+ 2,
2044
+ 2,
2045
+ 2,
2046
+ 2,
2047
+ 2,
2048
+ 2,
2049
+ 2,
2050
+ 2,
2051
+ 2,
2052
+ 2,
2053
+ 2,
2054
+ 2,
2055
+ 2,
2056
+ 2,
2057
+ 2,
2058
+ 2,
2059
+ 2,
2060
+ 2,
2061
+ 2,
2062
+ 2,
2063
+ 2,
2064
+ 2,
2065
+ 2,
2066
+ 2,
2067
+ 2,
2068
+ 2,
2069
+ 2,
2070
+ 2,
2071
+ 2,
2072
+ 2,
2073
+ 2,
2074
+ 2,
2075
+ 2,
2076
+ 2,
2077
+ 2,
2078
+ 2,
2079
+ 2,
2080
+ 2,
2081
+ 2,
2082
+ 2,
2083
+ 2,
2084
+ 2,
2085
+ 2,
2086
+ 2,
2087
+ 2,
2088
+ 2,
2089
+ 2,
2090
+ 2,
2091
+ 2,
2092
+ 2,
2093
+ 2,
2094
+ 2,
2095
+ 2,
2096
+ 2,
2097
+ 2,
2098
+ 2,
2099
+ 2,
2100
+ 2,
2101
+ 2,
2102
+ 2,
2103
+ 2,
2104
+ 2,
2105
+ 2,
2106
+ 2,
2107
+ 2,
2108
+ 2,
2109
+ 2,
2110
+ 2,
2111
+ 2,
2112
+ 2,
2113
+ 2,
2114
+ 2,
2115
+ 2,
2116
+ 2,
2117
+ 2,
2118
+ 2,
2119
+ 2,
2120
+ 2,
2121
+ 2,
2122
+ 2,
2123
+ 2,
2124
+ 2,
2125
+ 2,
2126
+ 2,
2127
+ 2,
2128
+ 2,
2129
+ 2,
2130
+ 2,
2131
+ 2,
2132
+ 2,
2133
+ 2,
2134
+ 2,
2135
+ 2,
2136
+ 2,
2137
+ 2,
2138
+ 2,
2139
+ 2,
2140
+ 2,
2141
+ 2,
2142
+ 2,
2143
+ 2,
2144
+ 2,
2145
+ 2,
2146
+ 2,
2147
+ 2,
2148
+ 2,
2149
+ 2,
2150
+ 2,
2151
+ 2,
2152
+ 2,
2153
+ 2,
2154
+ 2,
2155
+ 2,
2156
+ 2,
2157
+ 2,
2158
+ 2,
2159
+ 2,
2160
+ 2,
2161
+ 2,
2162
+ 2,
2163
+ 2,
2164
+ 2,
2165
+ 2,
2166
+ 2,
2167
+ 2,
2168
+ 2,
2169
+ 2,
2170
+ 2,
2171
+ 2,
2172
+ 2,
2173
+ 2,
2174
+ 2,
2175
+ 2,
2176
+ 2,
2177
+ 2,
2178
+ 2,
2179
+ 2,
2180
+ 2,
2181
+ 2,
2182
+ 2,
2183
+ 2,
2184
+ 2,
2185
+ 2,
2186
+ 2,
2187
+ 2,
2188
+ 2,
2189
+ 2,
2190
+ 2,
2191
+ 2,
2192
+ 2,
2193
+ 2,
2194
+ 2,
2195
+ 2,
2196
+ 2,
2197
+ 2,
2198
+ 2,
2199
+ 2,
2200
+ 2,
2201
+ 2,
2202
+ 2,
2203
+ 2,
2204
+ 2,
2205
+ 2,
2206
+ 2,
2207
+ 2,
2208
+ 2,
2209
+ 2,
2210
+ 2,
2211
+ 2,
2212
+ 2,
2213
+ 2,
2214
+ 2,
2215
+ 2,
2216
+ 2,
2217
+ 2,
2218
+ 2,
2219
+ 2,
2220
+ 2,
2221
+ 2,
2222
+ 2,
2223
+ 2,
2224
+ 2,
2225
+ 2,
2226
+ 2,
2227
+ 2,
2228
+ 2,
2229
+ 2,
2230
+ 2,
2231
+ 2,
2232
+ 2,
2233
+ 2,
2234
+ 2,
2235
+ 2,
2236
+ 2,
2237
+ 2,
2238
+ 2,
2239
+ 2,
2240
+ 2,
2241
+ 2,
2242
+ 2,
2243
+ 2,
2244
+ 2,
2245
+ 2,
2246
+ 2,
2247
+ 2,
2248
+ 2,
2249
+ 2,
2250
+ 2,
2251
+ 2,
2252
+ 2,
2253
+ 2,
2254
+ 2,
2255
+ 2,
2256
+ 2,
2257
+ 2,
2258
+ 0,
2259
+ 0,
2260
+ 0,
2261
+ 0,
2262
+ 0,
2263
+ 0,
2264
+ 2,
2265
+ 0,
2266
+ 0,
2267
+ 0,
2268
+ 0,
2269
+ 0,
2270
+ 0,
2271
+ 0,
2272
+ 0,
2273
+ 0,
2274
+ 0,
2275
+ 1,
2276
+ 0,
2277
+ 2,
2278
+ 1,
2279
+ 0,
2280
+ 0,
2281
+ 0,
2282
+ 1,
2283
+ 0,
2284
+ 2,
2285
+ 0,
2286
+ 2,
2287
+ 0,
2288
+ 0,
2289
+ 0
2290
+ ],
2291
+ "test_true": [
2292
+ 0,
2293
+ 0,
2294
+ 0,
2295
+ 0,
2296
+ 0,
2297
+ 0,
2298
+ 0,
2299
+ 0,
2300
+ 0,
2301
+ 0,
2302
+ 0,
2303
+ 0,
2304
+ 0,
2305
+ 0,
2306
+ 0,
2307
+ 0,
2308
+ 0,
2309
+ 0,
2310
+ 0,
2311
+ 0,
2312
+ 0,
2313
+ 0,
2314
+ 0,
2315
+ 0,
2316
+ 0,
2317
+ 0,
2318
+ 0,
2319
+ 0,
2320
+ 0,
2321
+ 0,
2322
+ 0,
2323
+ 0,
2324
+ 0,
2325
+ 0,
2326
+ 0,
2327
+ 0,
2328
+ 0,
2329
+ 0,
2330
+ 0,
2331
+ 0,
2332
+ 0,
2333
+ 0,
2334
+ 0,
2335
+ 0,
2336
+ 0,
2337
+ 0,
2338
+ 0,
2339
+ 0,
2340
+ 0,
2341
+ 0,
2342
+ 0,
2343
+ 0,
2344
+ 0,
2345
+ 0,
2346
+ 0,
2347
+ 0,
2348
+ 0,
2349
+ 0,
2350
+ 0,
2351
+ 0,
2352
+ 0,
2353
+ 0,
2354
+ 0,
2355
+ 0,
2356
+ 0,
2357
+ 0,
2358
+ 0,
2359
+ 0,
2360
+ 0,
2361
+ 0,
2362
+ 0,
2363
+ 0,
2364
+ 0,
2365
+ 0,
2366
+ 0,
2367
+ 2,
2368
+ 2,
2369
+ 2,
2370
+ 2,
2371
+ 0,
2372
+ 0,
2373
+ 0,
2374
+ 0,
2375
+ 0,
2376
+ 0,
2377
+ 0,
2378
+ 0,
2379
+ 0,
2380
+ 0,
2381
+ 0,
2382
+ 0,
2383
+ 0,
2384
+ 0,
2385
+ 0,
2386
+ 0,
2387
+ 0,
2388
+ 0,
2389
+ 0,
2390
+ 0,
2391
+ 0,
2392
+ 0,
2393
+ 0,
2394
+ 0,
2395
+ 0,
2396
+ 0,
2397
+ 0,
2398
+ 0,
2399
+ 0,
2400
+ 0,
2401
+ 0,
2402
+ 0,
2403
+ 0,
2404
+ 0,
2405
+ 0,
2406
+ 0,
2407
+ 0,
2408
+ 0,
2409
+ 0,
2410
+ 0,
2411
+ 0,
2412
+ 0,
2413
+ 0,
2414
+ 0,
2415
+ 0,
2416
+ 0,
2417
+ 0,
2418
+ 0,
2419
+ 2,
2420
+ 2,
2421
+ 0,
2422
+ 0,
2423
+ 0,
2424
+ 0,
2425
+ 0,
2426
+ 0,
2427
+ 0,
2428
+ 2,
2429
+ 2,
2430
+ 2,
2431
+ 2,
2432
+ 2,
2433
+ 2,
2434
+ 2,
2435
+ 0,
2436
+ 2,
2437
+ 2,
2438
+ 2,
2439
+ 2,
2440
+ 2,
2441
+ 2,
2442
+ 2,
2443
+ 2,
2444
+ 2,
2445
+ 2,
2446
+ 2,
2447
+ 2,
2448
+ 2,
2449
+ 2,
2450
+ 2,
2451
+ 2,
2452
+ 2,
2453
+ 2,
2454
+ 2,
2455
+ 2,
2456
+ 2,
2457
+ 2,
2458
+ 2,
2459
+ 2,
2460
+ 2,
2461
+ 2,
2462
+ 2,
2463
+ 2,
2464
+ 2,
2465
+ 2,
2466
+ 2,
2467
+ 2,
2468
+ 2,
2469
+ 2,
2470
+ 2,
2471
+ 2,
2472
+ 2,
2473
+ 2,
2474
+ 2,
2475
+ 2,
2476
+ 2,
2477
+ 2,
2478
+ 2,
2479
+ 2,
2480
+ 2,
2481
+ 2,
2482
+ 2,
2483
+ 2,
2484
+ 2,
2485
+ 2,
2486
+ 2,
2487
+ 2,
2488
+ 2,
2489
+ 2,
2490
+ 2,
2491
+ 2,
2492
+ 2,
2493
+ 2,
2494
+ 2,
2495
+ 2,
2496
+ 2,
2497
+ 2,
2498
+ 2,
2499
+ 2,
2500
+ 2,
2501
+ 2,
2502
+ 2,
2503
+ 2,
2504
+ 2,
2505
+ 2,
2506
+ 2,
2507
+ 2,
2508
+ 0,
2509
+ 2,
2510
+ 2,
2511
+ 2,
2512
+ 2,
2513
+ 2,
2514
+ 2,
2515
+ 2,
2516
+ 2,
2517
+ 2,
2518
+ 2,
2519
+ 2,
2520
+ 2,
2521
+ 2,
2522
+ 2,
2523
+ 2,
2524
+ 2,
2525
+ 2,
2526
+ 2,
2527
+ 2,
2528
+ 2,
2529
+ 2,
2530
+ 2,
2531
+ 2,
2532
+ 2,
2533
+ 2,
2534
+ 2,
2535
+ 2,
2536
+ 2,
2537
+ 2,
2538
+ 2,
2539
+ 2,
2540
+ 2,
2541
+ 2,
2542
+ 2,
2543
+ 2,
2544
+ 2,
2545
+ 2,
2546
+ 2,
2547
+ 2,
2548
+ 2,
2549
+ 2,
2550
+ 2,
2551
+ 2,
2552
+ 2,
2553
+ 2,
2554
+ 2,
2555
+ 2,
2556
+ 2,
2557
+ 2,
2558
+ 2,
2559
+ 2,
2560
+ 2,
2561
+ 2,
2562
+ 2,
2563
+ 2,
2564
+ 2,
2565
+ 2,
2566
+ 2,
2567
+ 2,
2568
+ 2,
2569
+ 2,
2570
+ 2,
2571
+ 2,
2572
+ 2,
2573
+ 2,
2574
+ 2,
2575
+ 2,
2576
+ 2,
2577
+ 2,
2578
+ 2,
2579
+ 2,
2580
+ 2,
2581
+ 2,
2582
+ 2,
2583
+ 2,
2584
+ 2,
2585
+ 2,
2586
+ 2,
2587
+ 2,
2588
+ 2,
2589
+ 2,
2590
+ 2,
2591
+ 2,
2592
+ 2,
2593
+ 2,
2594
+ 2,
2595
+ 2,
2596
+ 2,
2597
+ 2,
2598
+ 2,
2599
+ 2,
2600
+ 2,
2601
+ 2,
2602
+ 2,
2603
+ 2,
2604
+ 2,
2605
+ 2,
2606
+ 2,
2607
+ 2,
2608
+ 2,
2609
+ 2,
2610
+ 2,
2611
+ 2,
2612
+ 2,
2613
+ 2,
2614
+ 2,
2615
+ 2,
2616
+ 2,
2617
+ 2,
2618
+ 2,
2619
+ 2,
2620
+ 2,
2621
+ 2,
2622
+ 2,
2623
+ 2,
2624
+ 2,
2625
+ 2,
2626
+ 2,
2627
+ 2,
2628
+ 2,
2629
+ 2,
2630
+ 2,
2631
+ 2,
2632
+ 2,
2633
+ 2,
2634
+ 2,
2635
+ 2,
2636
+ 2,
2637
+ 2,
2638
+ 2,
2639
+ 2,
2640
+ 2,
2641
+ 2,
2642
+ 2,
2643
+ 2,
2644
+ 2,
2645
+ 2,
2646
+ 2,
2647
+ 2,
2648
+ 2,
2649
+ 2,
2650
+ 2,
2651
+ 2,
2652
+ 2,
2653
+ 2,
2654
+ 2,
2655
+ 2,
2656
+ 2,
2657
+ 2,
2658
+ 2,
2659
+ 2,
2660
+ 2,
2661
+ 2,
2662
+ 2,
2663
+ 2,
2664
+ 2,
2665
+ 2,
2666
+ 2,
2667
+ 2,
2668
+ 2,
2669
+ 2,
2670
+ 2,
2671
+ 2,
2672
+ 2,
2673
+ 2,
2674
+ 2,
2675
+ 2,
2676
+ 2,
2677
+ 2,
2678
+ 2,
2679
+ 2,
2680
+ 2,
2681
+ 2,
2682
+ 2,
2683
+ 2,
2684
+ 2,
2685
+ 2,
2686
+ 2,
2687
+ 2,
2688
+ 2,
2689
+ 2,
2690
+ 2,
2691
+ 2,
2692
+ 2,
2693
+ 2,
2694
+ 0,
2695
+ 2,
2696
+ 2,
2697
+ 0,
2698
+ 0,
2699
+ 2,
2700
+ 2,
2701
+ 2,
2702
+ 2,
2703
+ 2,
2704
+ 2,
2705
+ 2,
2706
+ 2,
2707
+ 2,
2708
+ 2,
2709
+ 2,
2710
+ 2,
2711
+ 2,
2712
+ 2,
2713
+ 2,
2714
+ 2,
2715
+ 2,
2716
+ 2,
2717
+ 2,
2718
+ 2,
2719
+ 2,
2720
+ 2,
2721
+ 2,
2722
+ 2,
2723
+ 2,
2724
+ 2,
2725
+ 2,
2726
+ 2,
2727
+ 2,
2728
+ 2,
2729
+ 2,
2730
+ 2,
2731
+ 2,
2732
+ 2,
2733
+ 2,
2734
+ 2,
2735
+ 2,
2736
+ 2,
2737
+ 2,
2738
+ 2,
2739
+ 2,
2740
+ 2,
2741
+ 2,
2742
+ 2,
2743
+ 2,
2744
+ 2,
2745
+ 2,
2746
+ 2,
2747
+ 2,
2748
+ 2,
2749
+ 2,
2750
+ 2,
2751
+ 2,
2752
+ 2,
2753
+ 2,
2754
+ 2,
2755
+ 2,
2756
+ 2,
2757
+ 2,
2758
+ 2,
2759
+ 2,
2760
+ 2,
2761
+ 2,
2762
+ 2,
2763
+ 2,
2764
+ 2,
2765
+ 2,
2766
+ 2,
2767
+ 2,
2768
+ 2,
2769
+ 2,
2770
+ 2,
2771
+ 2,
2772
+ 2,
2773
+ 2,
2774
+ 2,
2775
+ 2,
2776
+ 2,
2777
+ 2,
2778
+ 2,
2779
+ 2,
2780
+ 2,
2781
+ 2,
2782
+ 2,
2783
+ 2,
2784
+ 2,
2785
+ 2,
2786
+ 2,
2787
+ 2,
2788
+ 2,
2789
+ 2,
2790
+ 2,
2791
+ 2,
2792
+ 2,
2793
+ 2,
2794
+ 2,
2795
+ 2,
2796
+ 2,
2797
+ 2,
2798
+ 2,
2799
+ 2,
2800
+ 2,
2801
+ 2,
2802
+ 2,
2803
+ 2,
2804
+ 2,
2805
+ 2,
2806
+ 2,
2807
+ 2,
2808
+ 2,
2809
+ 2,
2810
+ 2,
2811
+ 2,
2812
+ 2,
2813
+ 2,
2814
+ 2,
2815
+ 2,
2816
+ 2,
2817
+ 2,
2818
+ 2,
2819
+ 2,
2820
+ 2,
2821
+ 2,
2822
+ 2,
2823
+ 2,
2824
+ 2,
2825
+ 2,
2826
+ 2,
2827
+ 2,
2828
+ 2,
2829
+ 2,
2830
+ 2,
2831
+ 2,
2832
+ 2,
2833
+ 2,
2834
+ 2,
2835
+ 2,
2836
+ 2,
2837
+ 2,
2838
+ 2,
2839
+ 2,
2840
+ 2,
2841
+ 2,
2842
+ 2,
2843
+ 2,
2844
+ 2,
2845
+ 2,
2846
+ 2,
2847
+ 2,
2848
+ 2,
2849
+ 2,
2850
+ 2,
2851
+ 2,
2852
+ 2,
2853
+ 2,
2854
+ 2,
2855
+ 2,
2856
+ 2,
2857
+ 2,
2858
+ 2,
2859
+ 2,
2860
+ 2,
2861
+ 2,
2862
+ 2,
2863
+ 2,
2864
+ 2,
2865
+ 2,
2866
+ 2,
2867
+ 2,
2868
+ 2,
2869
+ 2,
2870
+ 2,
2871
+ 2,
2872
+ 2,
2873
+ 2,
2874
+ 2,
2875
+ 2,
2876
+ 2,
2877
+ 2,
2878
+ 2,
2879
+ 2,
2880
+ 2,
2881
+ 2,
2882
+ 2,
2883
+ 2,
2884
+ 2,
2885
+ 2,
2886
+ 2,
2887
+ 2,
2888
+ 2,
2889
+ 2,
2890
+ 2,
2891
+ 2,
2892
+ 2,
2893
+ 2,
2894
+ 2,
2895
+ 2,
2896
+ 2,
2897
+ 2,
2898
+ 2,
2899
+ 2,
2900
+ 2,
2901
+ 2,
2902
+ 2,
2903
+ 2,
2904
+ 2,
2905
+ 2,
2906
+ 2,
2907
+ 2,
2908
+ 2,
2909
+ 2,
2910
+ 2,
2911
+ 2,
2912
+ 2,
2913
+ 2,
2914
+ 2,
2915
+ 2,
2916
+ 2,
2917
+ 2,
2918
+ 2,
2919
+ 2,
2920
+ 2,
2921
+ 2,
2922
+ 2,
2923
+ 2,
2924
+ 2,
2925
+ 2,
2926
+ 2,
2927
+ 2,
2928
+ 2,
2929
+ 2,
2930
+ 2,
2931
+ 2,
2932
+ 2,
2933
+ 2,
2934
+ 2,
2935
+ 2,
2936
+ 2,
2937
+ 2,
2938
+ 2,
2939
+ 2,
2940
+ 2,
2941
+ 2,
2942
+ 2,
2943
+ 2,
2944
+ 2,
2945
+ 2,
2946
+ 2,
2947
+ 2,
2948
+ 2,
2949
+ 2,
2950
+ 2,
2951
+ 2,
2952
+ 0,
2953
+ 0,
2954
+ 0,
2955
+ 2,
2956
+ 2,
2957
+ 2,
2958
+ 0,
2959
+ 0,
2960
+ 2,
2961
+ 2,
2962
+ 2,
2963
+ 2,
2964
+ 2,
2965
+ 2,
2966
+ 2,
2967
+ 2,
2968
+ 2,
2969
+ 2,
2970
+ 2,
2971
+ 2,
2972
+ 2,
2973
+ 2,
2974
+ 2,
2975
+ 2,
2976
+ 2,
2977
+ 2,
2978
+ 2,
2979
+ 2,
2980
+ 2,
2981
+ 2,
2982
+ 2,
2983
+ 2,
2984
+ 2,
2985
+ 2,
2986
+ 2,
2987
+ 2,
2988
+ 2,
2989
+ 2,
2990
+ 2,
2991
+ 2,
2992
+ 2,
2993
+ 2,
2994
+ 2,
2995
+ 2,
2996
+ 2,
2997
+ 2,
2998
+ 2,
2999
+ 2,
3000
+ 2,
3001
+ 2,
3002
+ 2,
3003
+ 2,
3004
+ 2,
3005
+ 2,
3006
+ 2,
3007
+ 2,
3008
+ 2,
3009
+ 2,
3010
+ 2,
3011
+ 2,
3012
+ 2,
3013
+ 2,
3014
+ 2,
3015
+ 2,
3016
+ 2,
3017
+ 2,
3018
+ 2,
3019
+ 2,
3020
+ 2,
3021
+ 2,
3022
+ 2,
3023
+ 2,
3024
+ 2,
3025
+ 2,
3026
+ 2,
3027
+ 2,
3028
+ 2,
3029
+ 2,
3030
+ 2,
3031
+ 2,
3032
+ 2,
3033
+ 2,
3034
+ 2,
3035
+ 2,
3036
+ 2,
3037
+ 2,
3038
+ 2,
3039
+ 2,
3040
+ 2,
3041
+ 2,
3042
+ 2,
3043
+ 2,
3044
+ 2,
3045
+ 2,
3046
+ 2,
3047
+ 2,
3048
+ 2,
3049
+ 2,
3050
+ 2,
3051
+ 2,
3052
+ 2,
3053
+ 2,
3054
+ 2,
3055
+ 2,
3056
+ 2,
3057
+ 2,
3058
+ 2,
3059
+ 2,
3060
+ 2,
3061
+ 2,
3062
+ 2,
3063
+ 2,
3064
+ 2,
3065
+ 2,
3066
+ 2,
3067
+ 2,
3068
+ 2,
3069
+ 2,
3070
+ 2,
3071
+ 2,
3072
+ 2,
3073
+ 2,
3074
+ 2,
3075
+ 2,
3076
+ 2,
3077
+ 2,
3078
+ 2,
3079
+ 2,
3080
+ 2,
3081
+ 2,
3082
+ 2,
3083
+ 2,
3084
+ 2,
3085
+ 2,
3086
+ 2,
3087
+ 2,
3088
+ 2,
3089
+ 2,
3090
+ 2,
3091
+ 2,
3092
+ 2,
3093
+ 2,
3094
+ 2,
3095
+ 2,
3096
+ 2,
3097
+ 2,
3098
+ 2,
3099
+ 2,
3100
+ 2,
3101
+ 2,
3102
+ 2,
3103
+ 2,
3104
+ 2,
3105
+ 2,
3106
+ 2,
3107
+ 2,
3108
+ 2,
3109
+ 2,
3110
+ 2,
3111
+ 2,
3112
+ 2,
3113
+ 2,
3114
+ 2,
3115
+ 2,
3116
+ 2,
3117
+ 2,
3118
+ 2,
3119
+ 2,
3120
+ 2,
3121
+ 2,
3122
+ 2,
3123
+ 2,
3124
+ 2,
3125
+ 2,
3126
+ 2,
3127
+ 2,
3128
+ 2,
3129
+ 2,
3130
+ 2,
3131
+ 2,
3132
+ 2,
3133
+ 2,
3134
+ 2,
3135
+ 2,
3136
+ 2,
3137
+ 2,
3138
+ 2,
3139
+ 2,
3140
+ 2,
3141
+ 2,
3142
+ 2,
3143
+ 2,
3144
+ 2,
3145
+ 2,
3146
+ 2,
3147
+ 2,
3148
+ 0,
3149
+ 2,
3150
+ 2,
3151
+ 2,
3152
+ 2,
3153
+ 2,
3154
+ 2,
3155
+ 2,
3156
+ 2,
3157
+ 2,
3158
+ 2,
3159
+ 2,
3160
+ 2,
3161
+ 2,
3162
+ 2,
3163
+ 2,
3164
+ 2,
3165
+ 2,
3166
+ 2,
3167
+ 2,
3168
+ 2,
3169
+ 0,
3170
+ 0,
3171
+ 0,
3172
+ 2,
3173
+ 2,
3174
+ 2,
3175
+ 2,
3176
+ 2,
3177
+ 2,
3178
+ 2,
3179
+ 2,
3180
+ 2,
3181
+ 2,
3182
+ 2,
3183
+ 2,
3184
+ 2,
3185
+ 2,
3186
+ 2,
3187
+ 2,
3188
+ 2,
3189
+ 2,
3190
+ 2,
3191
+ 2,
3192
+ 2,
3193
+ 2,
3194
+ 2,
3195
+ 2,
3196
+ 2,
3197
+ 2,
3198
+ 2,
3199
+ 2,
3200
+ 2,
3201
+ 2,
3202
+ 2,
3203
+ 2,
3204
+ 2,
3205
+ 2,
3206
+ 2,
3207
+ 2,
3208
+ 2,
3209
+ 0,
3210
+ 0,
3211
+ 0,
3212
+ 0,
3213
+ 0,
3214
+ 2,
3215
+ 2,
3216
+ 2,
3217
+ 2,
3218
+ 2,
3219
+ 2,
3220
+ 2,
3221
+ 2,
3222
+ 2,
3223
+ 2,
3224
+ 2,
3225
+ 2,
3226
+ 2,
3227
+ 2,
3228
+ 2,
3229
+ 0,
3230
+ 0,
3231
+ 0,
3232
+ 0,
3233
+ 0,
3234
+ 0,
3235
+ 0,
3236
+ 0,
3237
+ 0,
3238
+ 0,
3239
+ 0,
3240
+ 0,
3241
+ 0,
3242
+ 1,
3243
+ 1,
3244
+ 1,
3245
+ 1,
3246
+ 0,
3247
+ 0,
3248
+ 0,
3249
+ 0,
3250
+ 0,
3251
+ 0,
3252
+ 0,
3253
+ 0,
3254
+ 1,
3255
+ 1,
3256
+ 0,
3257
+ 0,
3258
+ 2,
3259
+ 2,
3260
+ 1,
3261
+ 1,
3262
+ 1,
3263
+ 0,
3264
+ 0,
3265
+ 0,
3266
+ 2,
3267
+ 2,
3268
+ 0,
3269
+ 0,
3270
+ 1,
3271
+ 1,
3272
+ 1,
3273
+ 0,
3274
+ 0,
3275
+ 1,
3276
+ 1,
3277
+ 1,
3278
+ 1,
3279
+ 2,
3280
+ 0,
3281
+ 0,
3282
+ 0,
3283
+ 0,
3284
+ 0,
3285
+ 0,
3286
+ 0,
3287
+ 2,
3288
+ 0,
3289
+ 0,
3290
+ 0,
3291
+ 0,
3292
+ 1,
3293
+ 1,
3294
+ 0,
3295
+ 0,
3296
+ 0,
3297
+ 0,
3298
+ 1,
3299
+ 1,
3300
+ 0,
3301
+ 0,
3302
+ 0,
3303
+ 0,
3304
+ 2,
3305
+ 2,
3306
+ 0,
3307
+ 0,
3308
+ 1,
3309
+ 1,
3310
+ 2,
3311
+ 2,
3312
+ 2,
3313
+ 2,
3314
+ 2,
3315
+ 2,
3316
+ 2,
3317
+ 2,
3318
+ 2,
3319
+ 2,
3320
+ 2,
3321
+ 2,
3322
+ 0,
3323
+ 0,
3324
+ 0,
3325
+ 0,
3326
+ 0,
3327
+ 0,
3328
+ 0,
3329
+ 0,
3330
+ 0,
3331
+ 0,
3332
+ 0,
3333
+ 0,
3334
+ 0,
3335
+ 0,
3336
+ 0,
3337
+ 0,
3338
+ 0,
3339
+ 0,
3340
+ 0,
3341
+ 0,
3342
+ 0,
3343
+ 0,
3344
+ 0,
3345
+ 0,
3346
+ 0,
3347
+ 0,
3348
+ 0,
3349
+ 0,
3350
+ 0,
3351
+ 0,
3352
+ 0,
3353
+ 0,
3354
+ 0,
3355
+ 0,
3356
+ 0,
3357
+ 0,
3358
+ 0,
3359
+ 0,
3360
+ 0,
3361
+ 0,
3362
+ 0,
3363
+ 0,
3364
+ 0,
3365
+ 0,
3366
+ 0,
3367
+ 0,
3368
+ 0,
3369
+ 0,
3370
+ 0,
3371
+ 0,
3372
+ 0,
3373
+ 0,
3374
+ 0,
3375
+ 0,
3376
+ 0,
3377
+ 0,
3378
+ 0,
3379
+ 0,
3380
+ 0,
3381
+ 0,
3382
+ 0,
3383
+ 0,
3384
+ 0,
3385
+ 0,
3386
+ 0,
3387
+ 0,
3388
+ 0,
3389
+ 0,
3390
+ 0,
3391
+ 0,
3392
+ 0,
3393
+ 0,
3394
+ 0,
3395
+ 0,
3396
+ 0,
3397
+ 0,
3398
+ 0,
3399
+ 0,
3400
+ 0,
3401
+ 0,
3402
+ 0,
3403
+ 0,
3404
+ 0,
3405
+ 0,
3406
+ 0,
3407
+ 0,
3408
+ 0,
3409
+ 0,
3410
+ 0,
3411
+ 0,
3412
+ 0,
3413
+ 0,
3414
+ 0,
3415
+ 0,
3416
+ 0,
3417
+ 0,
3418
+ 0,
3419
+ 0,
3420
+ 0,
3421
+ 0,
3422
+ 0,
3423
+ 0,
3424
+ 0,
3425
+ 0,
3426
+ 0,
3427
+ 0,
3428
+ 0,
3429
+ 0,
3430
+ 0,
3431
+ 0,
3432
+ 0,
3433
+ 0,
3434
+ 0,
3435
+ 0,
3436
+ 0,
3437
+ 0,
3438
+ 0,
3439
+ 0,
3440
+ 0,
3441
+ 0,
3442
+ 0,
3443
+ 0,
3444
+ 0,
3445
+ 0,
3446
+ 0,
3447
+ 0,
3448
+ 0,
3449
+ 0,
3450
+ 0,
3451
+ 0,
3452
+ 0,
3453
+ 0,
3454
+ 0,
3455
+ 0,
3456
+ 0,
3457
+ 0,
3458
+ 0,
3459
+ 0,
3460
+ 0,
3461
+ 0,
3462
+ 0,
3463
+ 0,
3464
+ 0,
3465
+ 0,
3466
+ 0,
3467
+ 0,
3468
+ 0,
3469
+ 0,
3470
+ 0,
3471
+ 0,
3472
+ 0,
3473
+ 0,
3474
+ 0,
3475
+ 0,
3476
+ 0,
3477
+ 0,
3478
+ 0,
3479
+ 0,
3480
+ 0,
3481
+ 0,
3482
+ 0,
3483
+ 0,
3484
+ 0,
3485
+ 0,
3486
+ 0,
3487
+ 0,
3488
+ 0,
3489
+ 2,
3490
+ 2,
3491
+ 2,
3492
+ 0,
3493
+ 0,
3494
+ 0,
3495
+ 0,
3496
+ 0,
3497
+ 0,
3498
+ 0,
3499
+ 0,
3500
+ 0,
3501
+ 0,
3502
+ 0,
3503
+ 0,
3504
+ 0,
3505
+ 0,
3506
+ 0,
3507
+ 0,
3508
+ 0,
3509
+ 0,
3510
+ 0,
3511
+ 0,
3512
+ 0,
3513
+ 0,
3514
+ 0,
3515
+ 0,
3516
+ 0,
3517
+ 0,
3518
+ 0,
3519
+ 0,
3520
+ 0,
3521
+ 0,
3522
+ 0,
3523
+ 0,
3524
+ 0,
3525
+ 0,
3526
+ 0,
3527
+ 0,
3528
+ 0,
3529
+ 0,
3530
+ 0,
3531
+ 0,
3532
+ 0,
3533
+ 0,
3534
+ 0,
3535
+ 0,
3536
+ 0,
3537
+ 0,
3538
+ 0,
3539
+ 0,
3540
+ 0,
3541
+ 0,
3542
+ 0,
3543
+ 0,
3544
+ 0,
3545
+ 0,
3546
+ 0,
3547
+ 0,
3548
+ 0,
3549
+ 0,
3550
+ 0,
3551
+ 0,
3552
+ 0,
3553
+ 0,
3554
+ 0,
3555
+ 0,
3556
+ 0,
3557
+ 0,
3558
+ 0,
3559
+ 0,
3560
+ 0,
3561
+ 0,
3562
+ 0,
3563
+ 0,
3564
+ 0,
3565
+ 0,
3566
+ 0,
3567
+ 0,
3568
+ 0,
3569
+ 0,
3570
+ 0,
3571
+ 0,
3572
+ 0,
3573
+ 0,
3574
+ 0,
3575
+ 0,
3576
+ 0,
3577
+ 0,
3578
+ 0,
3579
+ 0,
3580
+ 0,
3581
+ 0,
3582
+ 0,
3583
+ 0,
3584
+ 0,
3585
+ 0,
3586
+ 0,
3587
+ 0,
3588
+ 0,
3589
+ 0,
3590
+ 0,
3591
+ 0,
3592
+ 0,
3593
+ 0,
3594
+ 0,
3595
+ 0,
3596
+ 0,
3597
+ 0,
3598
+ 0,
3599
+ 0,
3600
+ 0,
3601
+ 0,
3602
+ 0,
3603
+ 0,
3604
+ 0,
3605
+ 0,
3606
+ 0,
3607
+ 0,
3608
+ 0,
3609
+ 0,
3610
+ 0,
3611
+ 0,
3612
+ 0,
3613
+ 0,
3614
+ 0,
3615
+ 0,
3616
+ 0,
3617
+ 0,
3618
+ 0,
3619
+ 0,
3620
+ 0,
3621
+ 0,
3622
+ 0,
3623
+ 0,
3624
+ 0,
3625
+ 0,
3626
+ 0,
3627
+ 0,
3628
+ 0,
3629
+ 0,
3630
+ 0,
3631
+ 0,
3632
+ 0,
3633
+ 0,
3634
+ 0,
3635
+ 0,
3636
+ 0,
3637
+ 0,
3638
+ 0,
3639
+ 0,
3640
+ 0,
3641
+ 0,
3642
+ 0,
3643
+ 0,
3644
+ 0,
3645
+ 0,
3646
+ 0,
3647
+ 0,
3648
+ 0,
3649
+ 0,
3650
+ 0,
3651
+ 0,
3652
+ 0,
3653
+ 0,
3654
+ 0,
3655
+ 0,
3656
+ 0,
3657
+ 0,
3658
+ 0,
3659
+ 0,
3660
+ 0,
3661
+ 0,
3662
+ 0,
3663
+ 0,
3664
+ 0,
3665
+ 0,
3666
+ 0,
3667
+ 0,
3668
+ 0,
3669
+ 0,
3670
+ 0,
3671
+ 0,
3672
+ 0,
3673
+ 0,
3674
+ 0,
3675
+ 0,
3676
+ 0,
3677
+ 0,
3678
+ 0,
3679
+ 0,
3680
+ 0,
3681
+ 0,
3682
+ 0,
3683
+ 0,
3684
+ 0,
3685
+ 0,
3686
+ 0,
3687
+ 0,
3688
+ 0,
3689
+ 0,
3690
+ 0,
3691
+ 0,
3692
+ 0,
3693
+ 0,
3694
+ 0,
3695
+ 0,
3696
+ 0,
3697
+ 0,
3698
+ 0,
3699
+ 0,
3700
+ 0,
3701
+ 0,
3702
+ 0,
3703
+ 0,
3704
+ 0,
3705
+ 0,
3706
+ 0,
3707
+ 0,
3708
+ 0,
3709
+ 0,
3710
+ 0,
3711
+ 0,
3712
+ 0,
3713
+ 0,
3714
+ 0,
3715
+ 0,
3716
+ 0,
3717
+ 0,
3718
+ 0,
3719
+ 0,
3720
+ 0,
3721
+ 0,
3722
+ 0,
3723
+ 0,
3724
+ 0,
3725
+ 0,
3726
+ 0,
3727
+ 0,
3728
+ 0,
3729
+ 0,
3730
+ 0,
3731
+ 0,
3732
+ 0,
3733
+ 0,
3734
+ 0,
3735
+ 0,
3736
+ 0,
3737
+ 0,
3738
+ 0,
3739
+ 0,
3740
+ 0,
3741
+ 0,
3742
+ 0,
3743
+ 0,
3744
+ 0,
3745
+ 0,
3746
+ 0,
3747
+ 0,
3748
+ 0,
3749
+ 0,
3750
+ 0,
3751
+ 0,
3752
+ 0,
3753
+ 0,
3754
+ 0,
3755
+ 0,
3756
+ 0,
3757
+ 0,
3758
+ 0,
3759
+ 0,
3760
+ 0,
3761
+ 0,
3762
+ 0,
3763
+ 0,
3764
+ 0,
3765
+ 0,
3766
+ 0,
3767
+ 0,
3768
+ 0,
3769
+ 0,
3770
+ 0,
3771
+ 0,
3772
+ 0,
3773
+ 0,
3774
+ 0,
3775
+ 0,
3776
+ 0,
3777
+ 0,
3778
+ 0,
3779
+ 0,
3780
+ 0,
3781
+ 0,
3782
+ 0,
3783
+ 0,
3784
+ 0,
3785
+ 0,
3786
+ 0,
3787
+ 0,
3788
+ 0,
3789
+ 0,
3790
+ 0,
3791
+ 0,
3792
+ 0,
3793
+ 0,
3794
+ 0,
3795
+ 0,
3796
+ 0,
3797
+ 2,
3798
+ 0,
3799
+ 0,
3800
+ 0,
3801
+ 0,
3802
+ 0,
3803
+ 0,
3804
+ 0,
3805
+ 0,
3806
+ 0,
3807
+ 0,
3808
+ 0,
3809
+ 0,
3810
+ 0,
3811
+ 0,
3812
+ 0,
3813
+ 0,
3814
+ 0,
3815
+ 0,
3816
+ 0,
3817
+ 0,
3818
+ 0,
3819
+ 0,
3820
+ 0,
3821
+ 0,
3822
+ 0,
3823
+ 0,
3824
+ 0,
3825
+ 0,
3826
+ 0,
3827
+ 0,
3828
+ 0,
3829
+ 0,
3830
+ 0,
3831
+ 0,
3832
+ 0,
3833
+ 0,
3834
+ 0,
3835
+ 0,
3836
+ 0,
3837
+ 0,
3838
+ 0,
3839
+ 0,
3840
+ 0,
3841
+ 0,
3842
+ 2,
3843
+ 0,
3844
+ 0,
3845
+ 0,
3846
+ 0,
3847
+ 0,
3848
+ 0,
3849
+ 0,
3850
+ 0,
3851
+ 0,
3852
+ 0,
3853
+ 0,
3854
+ 0,
3855
+ 0,
3856
+ 0,
3857
+ 0,
3858
+ 0,
3859
+ 0,
3860
+ 0,
3861
+ 0,
3862
+ 0,
3863
+ 2,
3864
+ 2,
3865
+ 2,
3866
+ 0,
3867
+ 0,
3868
+ 0,
3869
+ 0,
3870
+ 0,
3871
+ 0,
3872
+ 0,
3873
+ 0,
3874
+ 0,
3875
+ 0,
3876
+ 0,
3877
+ 0,
3878
+ 0,
3879
+ 0,
3880
+ 0,
3881
+ 0,
3882
+ 0,
3883
+ 0,
3884
+ 0,
3885
+ 0,
3886
+ 0,
3887
+ 0,
3888
+ 0,
3889
+ 0,
3890
+ 0,
3891
+ 0,
3892
+ 0,
3893
+ 0,
3894
+ 0,
3895
+ 0,
3896
+ 0,
3897
+ 0,
3898
+ 0,
3899
+ 0,
3900
+ 0,
3901
+ 0,
3902
+ 2,
3903
+ 0,
3904
+ 0,
3905
+ 0,
3906
+ 0,
3907
+ 0,
3908
+ 0,
3909
+ 0,
3910
+ 0,
3911
+ 0,
3912
+ 0,
3913
+ 0,
3914
+ 0,
3915
+ 0,
3916
+ 0,
3917
+ 0,
3918
+ 0,
3919
+ 0,
3920
+ 0,
3921
+ 0,
3922
+ 0,
3923
+ 0,
3924
+ 0,
3925
+ 0,
3926
+ 0,
3927
+ 0,
3928
+ 0,
3929
+ 0,
3930
+ 0,
3931
+ 0,
3932
+ 0,
3933
+ 0,
3934
+ 0,
3935
+ 0,
3936
+ 0,
3937
+ 0,
3938
+ 0,
3939
+ 0,
3940
+ 0,
3941
+ 0,
3942
+ 0,
3943
+ 0,
3944
+ 0,
3945
+ 0,
3946
+ 0,
3947
+ 0,
3948
+ 0,
3949
+ 0,
3950
+ 0,
3951
+ 0,
3952
+ 0,
3953
+ 0,
3954
+ 0,
3955
+ 0,
3956
+ 0,
3957
+ 0,
3958
+ 0,
3959
+ 0,
3960
+ 0,
3961
+ 0,
3962
+ 0,
3963
+ 0,
3964
+ 0,
3965
+ 0,
3966
+ 0,
3967
+ 0,
3968
+ 0,
3969
+ 0,
3970
+ 0,
3971
+ 0,
3972
+ 0,
3973
+ 0,
3974
+ 0,
3975
+ 0,
3976
+ 0,
3977
+ 0,
3978
+ 0,
3979
+ 0,
3980
+ 0,
3981
+ 0,
3982
+ 0,
3983
+ 0,
3984
+ 0,
3985
+ 0,
3986
+ 0,
3987
+ 0,
3988
+ 0,
3989
+ 0,
3990
+ 0,
3991
+ 0,
3992
+ 0,
3993
+ 0,
3994
+ 0,
3995
+ 0,
3996
+ 0,
3997
+ 0,
3998
+ 0,
3999
+ 0,
4000
+ 0,
4001
+ 0,
4002
+ 0,
4003
+ 0,
4004
+ 0,
4005
+ 0,
4006
+ 0,
4007
+ 0,
4008
+ 0,
4009
+ 0,
4010
+ 0,
4011
+ 0,
4012
+ 0,
4013
+ 0,
4014
+ 0,
4015
+ 0,
4016
+ 0,
4017
+ 0,
4018
+ 0,
4019
+ 0,
4020
+ 0,
4021
+ 0,
4022
+ 0,
4023
+ 0,
4024
+ 0,
4025
+ 0,
4026
+ 0,
4027
+ 0,
4028
+ 0,
4029
+ 0,
4030
+ 0,
4031
+ 0,
4032
+ 0,
4033
+ 0,
4034
+ 0,
4035
+ 0,
4036
+ 0,
4037
+ 0,
4038
+ 0,
4039
+ 0,
4040
+ 0,
4041
+ 0,
4042
+ 0,
4043
+ 0,
4044
+ 0,
4045
+ 0,
4046
+ 0,
4047
+ 0,
4048
+ 0,
4049
+ 0,
4050
+ 0,
4051
+ 0,
4052
+ 0,
4053
+ 0,
4054
+ 0,
4055
+ 0,
4056
+ 0,
4057
+ 0,
4058
+ 0,
4059
+ 0,
4060
+ 0,
4061
+ 0,
4062
+ 0,
4063
+ 0,
4064
+ 0,
4065
+ 0,
4066
+ 0,
4067
+ 0,
4068
+ 0,
4069
+ 0,
4070
+ 2,
4071
+ 2,
4072
+ 2,
4073
+ 2,
4074
+ 2,
4075
+ 2,
4076
+ 2,
4077
+ 2,
4078
+ 2,
4079
+ 2,
4080
+ 2,
4081
+ 2,
4082
+ 2,
4083
+ 2,
4084
+ 2,
4085
+ 2,
4086
+ 2,
4087
+ 2,
4088
+ 2,
4089
+ 2,
4090
+ 2,
4091
+ 2,
4092
+ 2,
4093
+ 2,
4094
+ 2,
4095
+ 2,
4096
+ 2,
4097
+ 2,
4098
+ 2,
4099
+ 2,
4100
+ 2,
4101
+ 2,
4102
+ 2,
4103
+ 1,
4104
+ 1,
4105
+ 1,
4106
+ 1,
4107
+ 1,
4108
+ 1,
4109
+ 1,
4110
+ 1,
4111
+ 1,
4112
+ 1,
4113
+ 1,
4114
+ 1,
4115
+ 1,
4116
+ 1,
4117
+ 1,
4118
+ 1,
4119
+ 1,
4120
+ 0,
4121
+ 0,
4122
+ 0,
4123
+ 0,
4124
+ 0,
4125
+ 0,
4126
+ 0,
4127
+ 0,
4128
+ 0,
4129
+ 0,
4130
+ 0,
4131
+ 0,
4132
+ 0,
4133
+ 0,
4134
+ 0,
4135
+ 2,
4136
+ 2,
4137
+ 2,
4138
+ 2,
4139
+ 2,
4140
+ 1,
4141
+ 1,
4142
+ 1,
4143
+ 1,
4144
+ 1,
4145
+ 1,
4146
+ 2,
4147
+ 2,
4148
+ 2,
4149
+ 2,
4150
+ 2,
4151
+ 2,
4152
+ 2,
4153
+ 2,
4154
+ 2,
4155
+ 2,
4156
+ 2,
4157
+ 2,
4158
+ 2,
4159
+ 2,
4160
+ 2,
4161
+ 2,
4162
+ 2,
4163
+ 2,
4164
+ 2,
4165
+ 2,
4166
+ 2,
4167
+ 2,
4168
+ 0,
4169
+ 2,
4170
+ 2,
4171
+ 0,
4172
+ 2,
4173
+ 0,
4174
+ 2,
4175
+ 2,
4176
+ 2,
4177
+ 2,
4178
+ 2,
4179
+ 2,
4180
+ 2,
4181
+ 2,
4182
+ 2,
4183
+ 2,
4184
+ 2,
4185
+ 2,
4186
+ 2,
4187
+ 2,
4188
+ 2,
4189
+ 2,
4190
+ 2,
4191
+ 2,
4192
+ 2,
4193
+ 2,
4194
+ 2,
4195
+ 2,
4196
+ 2,
4197
+ 2,
4198
+ 2,
4199
+ 2,
4200
+ 2,
4201
+ 2,
4202
+ 2,
4203
+ 2,
4204
+ 2,
4205
+ 2,
4206
+ 2,
4207
+ 2,
4208
+ 2,
4209
+ 2,
4210
+ 2,
4211
+ 2,
4212
+ 2,
4213
+ 2,
4214
+ 2,
4215
+ 2,
4216
+ 2,
4217
+ 2,
4218
+ 2,
4219
+ 2,
4220
+ 2,
4221
+ 2,
4222
+ 2,
4223
+ 2,
4224
+ 2,
4225
+ 2,
4226
+ 2,
4227
+ 2,
4228
+ 2,
4229
+ 2,
4230
+ 2,
4231
+ 2,
4232
+ 2,
4233
+ 2,
4234
+ 2,
4235
+ 2,
4236
+ 2,
4237
+ 2,
4238
+ 2,
4239
+ 2,
4240
+ 2,
4241
+ 2,
4242
+ 2,
4243
+ 2,
4244
+ 2,
4245
+ 2,
4246
+ 2,
4247
+ 2,
4248
+ 2,
4249
+ 2,
4250
+ 2,
4251
+ 2,
4252
+ 2,
4253
+ 2,
4254
+ 2,
4255
+ 2,
4256
+ 2,
4257
+ 2,
4258
+ 2,
4259
+ 2,
4260
+ 2,
4261
+ 2,
4262
+ 2,
4263
+ 2,
4264
+ 2,
4265
+ 2,
4266
+ 2,
4267
+ 2,
4268
+ 2,
4269
+ 2,
4270
+ 2,
4271
+ 2,
4272
+ 2,
4273
+ 2,
4274
+ 2,
4275
+ 2,
4276
+ 2,
4277
+ 2,
4278
+ 2,
4279
+ 2,
4280
+ 2,
4281
+ 2,
4282
+ 2,
4283
+ 2,
4284
+ 2,
4285
+ 2,
4286
+ 2,
4287
+ 2,
4288
+ 2,
4289
+ 2,
4290
+ 2,
4291
+ 2,
4292
+ 2,
4293
+ 2,
4294
+ 2,
4295
+ 2,
4296
+ 2,
4297
+ 2,
4298
+ 2,
4299
+ 2,
4300
+ 2,
4301
+ 2,
4302
+ 2,
4303
+ 2,
4304
+ 2,
4305
+ 2,
4306
+ 2,
4307
+ 2,
4308
+ 2,
4309
+ 2,
4310
+ 2,
4311
+ 2,
4312
+ 2,
4313
+ 2,
4314
+ 2,
4315
+ 2,
4316
+ 2,
4317
+ 2,
4318
+ 2,
4319
+ 2,
4320
+ 2,
4321
+ 2,
4322
+ 2,
4323
+ 2,
4324
+ 2,
4325
+ 2,
4326
+ 2,
4327
+ 2,
4328
+ 2,
4329
+ 2,
4330
+ 2,
4331
+ 2,
4332
+ 2,
4333
+ 2,
4334
+ 2,
4335
+ 2,
4336
+ 2,
4337
+ 2,
4338
+ 2,
4339
+ 2,
4340
+ 2,
4341
+ 2,
4342
+ 2,
4343
+ 2,
4344
+ 2,
4345
+ 2,
4346
+ 2,
4347
+ 2,
4348
+ 2,
4349
+ 2,
4350
+ 2,
4351
+ 2,
4352
+ 2,
4353
+ 2,
4354
+ 2,
4355
+ 2,
4356
+ 2,
4357
+ 2,
4358
+ 2,
4359
+ 2,
4360
+ 2,
4361
+ 2,
4362
+ 2,
4363
+ 2,
4364
+ 2,
4365
+ 2,
4366
+ 2,
4367
+ 2,
4368
+ 2,
4369
+ 2,
4370
+ 2,
4371
+ 2,
4372
+ 2,
4373
+ 2,
4374
+ 2,
4375
+ 2,
4376
+ 2,
4377
+ 2,
4378
+ 2,
4379
+ 2,
4380
+ 2,
4381
+ 2,
4382
+ 2,
4383
+ 2,
4384
+ 2,
4385
+ 2,
4386
+ 2,
4387
+ 2,
4388
+ 2,
4389
+ 2,
4390
+ 2,
4391
+ 2,
4392
+ 2,
4393
+ 2,
4394
+ 2,
4395
+ 2,
4396
+ 2,
4397
+ 2,
4398
+ 2,
4399
+ 2,
4400
+ 2,
4401
+ 2,
4402
+ 2,
4403
+ 2,
4404
+ 2,
4405
+ 2,
4406
+ 2,
4407
+ 2,
4408
+ 2,
4409
+ 2,
4410
+ 2,
4411
+ 2,
4412
+ 0,
4413
+ 0,
4414
+ 0,
4415
+ 0,
4416
+ 0,
4417
+ 0,
4418
+ 0,
4419
+ 0,
4420
+ 0,
4421
+ 0,
4422
+ 0,
4423
+ 0,
4424
+ 0,
4425
+ 0,
4426
+ 0,
4427
+ 0,
4428
+ 0,
4429
+ 0,
4430
+ 0,
4431
+ 2,
4432
+ 2,
4433
+ 1,
4434
+ 1,
4435
+ 1,
4436
+ 0,
4437
+ 0,
4438
+ 1,
4439
+ 1,
4440
+ 1,
4441
+ 1,
4442
+ 1,
4443
+ 2
4444
+ ],
4445
+ "logs": [
4446
+ {
4447
+ "epoch": 0,
4448
+ "train_loss": 0.4570459028717819,
4449
+ "val_macro_f1": 0.6337642132654476
4450
+ },
4451
+ {
4452
+ "epoch": 1,
4453
+ "train_loss": 0.394895793526036,
4454
+ "val_macro_f1": 0.7020904660503801
4455
+ },
4456
+ {
4457
+ "epoch": 2,
4458
+ "train_loss": 0.38058333943603906,
4459
+ "val_macro_f1": 0.7249753884750095
4460
+ },
4461
+ {
4462
+ "epoch": 3,
4463
+ "train_loss": 0.3687762923681053,
4464
+ "val_macro_f1": 0.7494575587517662
4465
+ },
4466
+ {
4467
+ "epoch": 4,
4468
+ "train_loss": 0.3539580987517241,
4469
+ "val_macro_f1": 0.6797495442880495
4470
+ },
4471
+ {
4472
+ "epoch": 5,
4473
+ "train_loss": 0.3458636137330608,
4474
+ "val_macro_f1": 0.726350601133813
4475
+ },
4476
+ {
4477
+ "epoch": 6,
4478
+ "train_loss": 0.33684928383037543,
4479
+ "val_macro_f1": 0.7273006201719072
4480
+ },
4481
+ {
4482
+ "epoch": 7,
4483
+ "train_loss": 0.33266169781897476,
4484
+ "val_macro_f1": 0.7317964748355741
4485
+ },
4486
+ {
4487
+ "epoch": 8,
4488
+ "train_loss": 0.32801037552250417,
4489
+ "val_macro_f1": 0.7502886506230896
4490
+ },
4491
+ {
4492
+ "epoch": 9,
4493
+ "train_loss": 0.3233905104315205,
4494
+ "val_macro_f1": 0.6926381806745477
4495
+ },
4496
+ {
4497
+ "epoch": 10,
4498
+ "train_loss": 0.3195636650179602,
4499
+ "val_macro_f1": 0.6759914796162486
4500
+ },
4501
+ {
4502
+ "epoch": 11,
4503
+ "train_loss": 0.3156510266908415,
4504
+ "val_macro_f1": 0.7273068699516476
4505
+ },
4506
+ {
4507
+ "epoch": 12,
4508
+ "train_loss": 0.31479699064971534,
4509
+ "val_macro_f1": 0.724267219270521
4510
+ },
4511
+ {
4512
+ "epoch": 13,
4513
+ "train_loss": 0.3067380816313871,
4514
+ "val_macro_f1": 0.7105670236473708
4515
+ }
4516
+ ]
4517
+ }
stage1_final/results/resized/swin/target3_swin_fold0_val.json ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 0,
3
+ "metrics": {
4
+ "macro_f1": 0.7636328470380195,
5
+ "accuracy": 0.9586653386454184,
6
+ "balanced_acc": 0.7456333347695887,
7
+ "per_class_recall": {
8
+ "malignant": 0.9769736842105263,
9
+ "non_malignant": 0.2857142857142857,
10
+ "non_roi": 0.9742120343839542
11
+ },
12
+ "confusion_matrix": [
13
+ [
14
+ 891,
15
+ 13,
16
+ 8
17
+ ],
18
+ [
19
+ 30,
20
+ 14,
21
+ 5
22
+ ],
23
+ [
24
+ 23,
25
+ 4,
26
+ 1020
27
+ ]
28
+ ],
29
+ "classification_report": {
30
+ "malignant": {
31
+ "precision": 0.9438559322033898,
32
+ "recall": 0.9769736842105263,
33
+ "f1-score": 0.9601293103448276,
34
+ "support": 912.0
35
+ },
36
+ "non_malignant": {
37
+ "precision": 0.45161290322580644,
38
+ "recall": 0.2857142857142857,
39
+ "f1-score": 0.35,
40
+ "support": 49.0
41
+ },
42
+ "non_roi": {
43
+ "precision": 0.9874152952565344,
44
+ "recall": 0.9742120343839542,
45
+ "f1-score": 0.9807692307692307,
46
+ "support": 1047.0
47
+ },
48
+ "accuracy": 0.9586653386454184,
49
+ "macro avg": {
50
+ "precision": 0.7942947102285768,
51
+ "recall": 0.7456333347695887,
52
+ "f1-score": 0.7636328470380195,
53
+ "support": 2008.0
54
+ },
55
+ "weighted avg": {
56
+ "precision": 0.9545565022714877,
57
+ "recall": 0.9586653386454184,
58
+ "f1-score": 0.9560026472359896,
59
+ "support": 2008.0
60
+ }
61
+ },
62
+ "n": 2008,
63
+ "src_B_acc": 0.991044776119403,
64
+ "src_B_n": 670,
65
+ "src_C_acc": 0.9435351882160393,
66
+ "src_C_n": 1222,
67
+ "src_D_acc": 0.9310344827586207,
68
+ "src_D_n": 116
69
+ },
70
+ "logs": [
71
+ {
72
+ "epoch": 0,
73
+ "train_loss": 0.4929635787010193,
74
+ "val_macro_f1": 0.6471185247514092
75
+ },
76
+ {
77
+ "epoch": 1,
78
+ "train_loss": 0.4068743224143982,
79
+ "val_macro_f1": 0.672029039895627
80
+ },
81
+ {
82
+ "epoch": 2,
83
+ "train_loss": 0.38642153549194336,
84
+ "val_macro_f1": 0.7636328470380195
85
+ },
86
+ {
87
+ "epoch": 3,
88
+ "train_loss": 0.37608554458618165,
89
+ "val_macro_f1": 0.6929870535811765
90
+ },
91
+ {
92
+ "epoch": 4,
93
+ "train_loss": 0.3536324541568756,
94
+ "val_macro_f1": 0.681863020478044
95
+ },
96
+ {
97
+ "epoch": 5,
98
+ "train_loss": 0.3438236377239227,
99
+ "val_macro_f1": 0.7297394494154753
100
+ },
101
+ {
102
+ "epoch": 6,
103
+ "train_loss": 0.346241375207901,
104
+ "val_macro_f1": 0.7207562981488446
105
+ },
106
+ {
107
+ "epoch": 7,
108
+ "train_loss": 0.3320102198123932,
109
+ "val_macro_f1": 0.7377554222541036
110
+ }
111
+ ]
112
+ }
stage1_final/results/resized/swin/target3_swin_fold1_val.json ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 1,
3
+ "metrics": {
4
+ "macro_f1": 0.7857336829802138,
5
+ "accuracy": 0.9201784828953892,
6
+ "balanced_acc": 0.7932461683434494,
7
+ "per_class_recall": {
8
+ "malignant": 0.9232456140350878,
9
+ "non_malignant": 0.52,
10
+ "non_roi": 0.9364928909952607
11
+ },
12
+ "confusion_matrix": [
13
+ [
14
+ 842,
15
+ 17,
16
+ 53
17
+ ],
18
+ [
19
+ 15,
20
+ 26,
21
+ 9
22
+ ],
23
+ [
24
+ 55,
25
+ 12,
26
+ 988
27
+ ]
28
+ ],
29
+ "classification_report": {
30
+ "malignant": {
31
+ "precision": 0.9232456140350878,
32
+ "recall": 0.9232456140350878,
33
+ "f1-score": 0.9232456140350878,
34
+ "support": 912.0
35
+ },
36
+ "non_malignant": {
37
+ "precision": 0.4727272727272727,
38
+ "recall": 0.52,
39
+ "f1-score": 0.49523809523809526,
40
+ "support": 50.0
41
+ },
42
+ "non_roi": {
43
+ "precision": 0.940952380952381,
44
+ "recall": 0.9364928909952607,
45
+ "f1-score": 0.9387173396674584,
46
+ "support": 1055.0
47
+ },
48
+ "accuracy": 0.9201784828953892,
49
+ "macro avg": {
50
+ "precision": 0.7789750892382471,
51
+ "recall": 0.7932461683434494,
52
+ "f1-score": 0.7857336829802138,
53
+ "support": 2017.0
54
+ },
55
+ "weighted avg": {
56
+ "precision": 0.9213391797427495,
57
+ "recall": 0.9201784828953892,
58
+ "f1-score": 0.9207281596981028,
59
+ "support": 2017.0
60
+ }
61
+ },
62
+ "n": 2017,
63
+ "src_B_acc": 0.9162087912087912,
64
+ "src_B_n": 728,
65
+ "src_C_acc": 0.9293577981651376,
66
+ "src_C_n": 1090,
67
+ "src_D_acc": 0.8844221105527639,
68
+ "src_D_n": 199
69
+ },
70
+ "logs": [
71
+ {
72
+ "epoch": 0,
73
+ "train_loss": 0.4599347586631775,
74
+ "val_macro_f1": 0.7110064216144951
75
+ },
76
+ {
77
+ "epoch": 1,
78
+ "train_loss": 0.3820734360218048,
79
+ "val_macro_f1": 0.7088128237128926
80
+ },
81
+ {
82
+ "epoch": 2,
83
+ "train_loss": 0.3764275577068329,
84
+ "val_macro_f1": 0.7158825082060302
85
+ },
86
+ {
87
+ "epoch": 3,
88
+ "train_loss": 0.35431050968170164,
89
+ "val_macro_f1": 0.7225737057990355
90
+ },
91
+ {
92
+ "epoch": 4,
93
+ "train_loss": 0.34666806292533875,
94
+ "val_macro_f1": 0.7318496707986267
95
+ },
96
+ {
97
+ "epoch": 5,
98
+ "train_loss": 0.3432994258403778,
99
+ "val_macro_f1": 0.6782823865881005
100
+ },
101
+ {
102
+ "epoch": 6,
103
+ "train_loss": 0.34389158844947815,
104
+ "val_macro_f1": 0.7565811238670507
105
+ },
106
+ {
107
+ "epoch": 7,
108
+ "train_loss": 0.33427645421028135,
109
+ "val_macro_f1": 0.7391608629733692
110
+ },
111
+ {
112
+ "epoch": 8,
113
+ "train_loss": 0.3203038873672485,
114
+ "val_macro_f1": 0.7376647871032472
115
+ },
116
+ {
117
+ "epoch": 9,
118
+ "train_loss": 0.3243390636444092,
119
+ "val_macro_f1": 0.7857336829802138
120
+ },
121
+ {
122
+ "epoch": 10,
123
+ "train_loss": 0.3185851831436157,
124
+ "val_macro_f1": 0.7278906575939734
125
+ },
126
+ {
127
+ "epoch": 11,
128
+ "train_loss": 0.3140652894973755,
129
+ "val_macro_f1": 0.731804225656243
130
+ },
131
+ {
132
+ "epoch": 12,
133
+ "train_loss": 0.3110732009410858,
134
+ "val_macro_f1": 0.7269125678826401
135
+ },
136
+ {
137
+ "epoch": 13,
138
+ "train_loss": 0.3060138030052185,
139
+ "val_macro_f1": 0.7376388638792327
140
+ },
141
+ {
142
+ "epoch": 14,
143
+ "train_loss": 0.3060260980129242,
144
+ "val_macro_f1": 0.7353778145439502
145
+ }
146
+ ]
147
+ }
stage1_final/results/resized/swin/target3_swin_fold2_val.json ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 2,
3
+ "metrics": {
4
+ "macro_f1": 0.7068246241742177,
5
+ "accuracy": 0.9215291750503019,
6
+ "balanced_acc": 0.7139435823527381,
7
+ "per_class_recall": {
8
+ "malignant": 0.9407894736842105,
9
+ "non_malignant": 0.2653061224489796,
10
+ "non_roi": 0.9357351509250244
11
+ },
12
+ "confusion_matrix": [
13
+ [
14
+ 858,
15
+ 40,
16
+ 14
17
+ ],
18
+ [
19
+ 31,
20
+ 13,
21
+ 5
22
+ ],
23
+ [
24
+ 60,
25
+ 6,
26
+ 961
27
+ ]
28
+ ],
29
+ "classification_report": {
30
+ "malignant": {
31
+ "precision": 0.9041095890410958,
32
+ "recall": 0.9407894736842105,
33
+ "f1-score": 0.9220849005910801,
34
+ "support": 912.0
35
+ },
36
+ "non_malignant": {
37
+ "precision": 0.22033898305084745,
38
+ "recall": 0.2653061224489796,
39
+ "f1-score": 0.24074074074074073,
40
+ "support": 49.0
41
+ },
42
+ "non_roi": {
43
+ "precision": 0.9806122448979592,
44
+ "recall": 0.9357351509250244,
45
+ "f1-score": 0.9576482311908321,
46
+ "support": 1027.0
47
+ },
48
+ "accuracy": 0.9215291750503019,
49
+ "macro avg": {
50
+ "precision": 0.7016869389966341,
51
+ "recall": 0.7139435823527381,
52
+ "f1-score": 0.7068246241742177,
53
+ "support": 1988.0
54
+ },
55
+ "weighted avg": {
56
+ "precision": 0.9267773294191022,
57
+ "recall": 0.9215291750503019,
58
+ "f1-score": 0.9236632087868943,
59
+ "support": 1988.0
60
+ }
61
+ },
62
+ "n": 1988,
63
+ "src_B_acc": 0.9372496662216289,
64
+ "src_B_n": 749,
65
+ "src_C_acc": 0.948210922787194,
66
+ "src_C_n": 1062,
67
+ "src_D_acc": 0.6949152542372882,
68
+ "src_D_n": 177
69
+ },
70
+ "logs": [
71
+ {
72
+ "epoch": 0,
73
+ "train_loss": 0.46994291009410977,
74
+ "val_macro_f1": 0.6314293197042745
75
+ },
76
+ {
77
+ "epoch": 1,
78
+ "train_loss": 0.3910994425652519,
79
+ "val_macro_f1": 0.6841595848508654
80
+ },
81
+ {
82
+ "epoch": 2,
83
+ "train_loss": 0.3862752379879119,
84
+ "val_macro_f1": 0.621349098191264
85
+ },
86
+ {
87
+ "epoch": 3,
88
+ "train_loss": 0.3657947563462787,
89
+ "val_macro_f1": 0.6576472530433962
90
+ },
91
+ {
92
+ "epoch": 4,
93
+ "train_loss": 0.359451976560411,
94
+ "val_macro_f1": 0.6537840140736347
95
+ },
96
+ {
97
+ "epoch": 5,
98
+ "train_loss": 0.3537936532308185,
99
+ "val_macro_f1": 0.6984524412070402
100
+ },
101
+ {
102
+ "epoch": 6,
103
+ "train_loss": 0.3429102547585018,
104
+ "val_macro_f1": 0.6601593141358699
105
+ },
106
+ {
107
+ "epoch": 7,
108
+ "train_loss": 0.33430976645340993,
109
+ "val_macro_f1": 0.6451248477023631
110
+ },
111
+ {
112
+ "epoch": 8,
113
+ "train_loss": 0.325911442202235,
114
+ "val_macro_f1": 0.7068246241742177
115
+ },
116
+ {
117
+ "epoch": 9,
118
+ "train_loss": 0.32440197183972314,
119
+ "val_macro_f1": 0.6751451607275314
120
+ },
121
+ {
122
+ "epoch": 10,
123
+ "train_loss": 0.31577868877895293,
124
+ "val_macro_f1": 0.669800264990573
125
+ },
126
+ {
127
+ "epoch": 11,
128
+ "train_loss": 0.3193944316534769,
129
+ "val_macro_f1": 0.6657873112379983
130
+ },
131
+ {
132
+ "epoch": 12,
133
+ "train_loss": 0.3109848373939121,
134
+ "val_macro_f1": 0.6569176332103991
135
+ },
136
+ {
137
+ "epoch": 13,
138
+ "train_loss": 0.30700282918082344,
139
+ "val_macro_f1": 0.6765540139186316
140
+ }
141
+ ]
142
+ }
stage1_final/results/resized/swin/target3_swin_fold3_val.json ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 3,
3
+ "metrics": {
4
+ "macro_f1": 0.7313823143068534,
5
+ "accuracy": 0.9012165450121654,
6
+ "balanced_acc": 0.7527928029132848,
7
+ "per_class_recall": {
8
+ "malignant": 0.8696604600219058,
9
+ "non_malignant": 0.44,
10
+ "non_roi": 0.9487179487179487
11
+ },
12
+ "confusion_matrix": [
13
+ [
14
+ 794,
15
+ 34,
16
+ 85
17
+ ],
18
+ [
19
+ 27,
20
+ 22,
21
+ 1
22
+ ],
23
+ [
24
+ 41,
25
+ 15,
26
+ 1036
27
+ ]
28
+ ],
29
+ "classification_report": {
30
+ "malignant": {
31
+ "precision": 0.9211136890951276,
32
+ "recall": 0.8696604600219058,
33
+ "f1-score": 0.8946478873239436,
34
+ "support": 913.0
35
+ },
36
+ "non_malignant": {
37
+ "precision": 0.30985915492957744,
38
+ "recall": 0.44,
39
+ "f1-score": 0.36363636363636365,
40
+ "support": 50.0
41
+ },
42
+ "non_roi": {
43
+ "precision": 0.9233511586452763,
44
+ "recall": 0.9487179487179487,
45
+ "f1-score": 0.935862691960253,
46
+ "support": 1092.0
47
+ },
48
+ "accuracy": 0.9012165450121654,
49
+ "macro avg": {
50
+ "precision": 0.7181080008899938,
51
+ "recall": 0.7527928029132848,
52
+ "f1-score": 0.7313823143068534,
53
+ "support": 2055.0
54
+ },
55
+ "weighted avg": {
56
+ "precision": 0.9074302779226141,
57
+ "recall": 0.9012165450121654,
58
+ "f1-score": 0.9036289045884063,
59
+ "support": 2055.0
60
+ }
61
+ },
62
+ "n": 2055,
63
+ "src_B_acc": 0.9026548672566371,
64
+ "src_B_n": 565,
65
+ "src_C_acc": 0.9003466204506065,
66
+ "src_C_n": 1154,
67
+ "src_D_acc": 0.9017857142857143,
68
+ "src_D_n": 336
69
+ },
70
+ "logs": [
71
+ {
72
+ "epoch": 0,
73
+ "train_loss": 0.48113818287849425,
74
+ "val_macro_f1": 0.6260072999482632
75
+ },
76
+ {
77
+ "epoch": 1,
78
+ "train_loss": 0.40316140627861025,
79
+ "val_macro_f1": 0.6329441530355094
80
+ },
81
+ {
82
+ "epoch": 2,
83
+ "train_loss": 0.37140513253211976,
84
+ "val_macro_f1": 0.7056012674662702
85
+ },
86
+ {
87
+ "epoch": 3,
88
+ "train_loss": 0.3690969798564911,
89
+ "val_macro_f1": 0.6552105309775969
90
+ },
91
+ {
92
+ "epoch": 4,
93
+ "train_loss": 0.35558233880996704,
94
+ "val_macro_f1": 0.6888972169946185
95
+ },
96
+ {
97
+ "epoch": 5,
98
+ "train_loss": 0.34434335327148435,
99
+ "val_macro_f1": 0.6623008593179436
100
+ },
101
+ {
102
+ "epoch": 6,
103
+ "train_loss": 0.3437868695259094,
104
+ "val_macro_f1": 0.7038207214812054
105
+ },
106
+ {
107
+ "epoch": 7,
108
+ "train_loss": 0.33506329679489133,
109
+ "val_macro_f1": 0.7056847142939514
110
+ },
111
+ {
112
+ "epoch": 8,
113
+ "train_loss": 0.3252559950351715,
114
+ "val_macro_f1": 0.7097718416321409
115
+ },
116
+ {
117
+ "epoch": 9,
118
+ "train_loss": 0.31754529213905336,
119
+ "val_macro_f1": 0.6875777031522615
120
+ },
121
+ {
122
+ "epoch": 10,
123
+ "train_loss": 0.32203039598464966,
124
+ "val_macro_f1": 0.7036444004988875
125
+ },
126
+ {
127
+ "epoch": 11,
128
+ "train_loss": 0.31389994311332703,
129
+ "val_macro_f1": 0.7163713379998212
130
+ },
131
+ {
132
+ "epoch": 12,
133
+ "train_loss": 0.3123688974380493,
134
+ "val_macro_f1": 0.7313823143068534
135
+ },
136
+ {
137
+ "epoch": 13,
138
+ "train_loss": 0.3086388671398163,
139
+ "val_macro_f1": 0.7252164752717541
140
+ },
141
+ {
142
+ "epoch": 14,
143
+ "train_loss": 0.30900491547584535,
144
+ "val_macro_f1": 0.717928530342249
145
+ },
146
+ {
147
+ "epoch": 15,
148
+ "train_loss": 0.30402742671966554,
149
+ "val_macro_f1": 0.725063806682733
150
+ },
151
+ {
152
+ "epoch": 16,
153
+ "train_loss": 0.30102282428741456,
154
+ "val_macro_f1": 0.7260007752335208
155
+ },
156
+ {
157
+ "epoch": 17,
158
+ "train_loss": 0.2985672166347504,
159
+ "val_macro_f1": 0.7106382134820762
160
+ }
161
+ ]
162
+ }
stage1_final/results/resized/swin/target3_swin_fold4_val.json ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fold": 4,
3
+ "metrics": {
4
+ "macro_f1": 0.6521586763136252,
5
+ "accuracy": 0.9229614807403702,
6
+ "balanced_acc": 0.6498121033048466,
7
+ "per_class_recall": {
8
+ "malignant": 0.940854326396495,
9
+ "non_malignant": 0.058823529411764705,
10
+ "non_roi": 0.9497584541062802
11
+ },
12
+ "confusion_matrix": [
13
+ [
14
+ 859,
15
+ 18,
16
+ 36
17
+ ],
18
+ [
19
+ 44,
20
+ 3,
21
+ 4
22
+ ],
23
+ [
24
+ 49,
25
+ 3,
26
+ 983
27
+ ]
28
+ ],
29
+ "classification_report": {
30
+ "malignant": {
31
+ "precision": 0.9023109243697479,
32
+ "recall": 0.940854326396495,
33
+ "f1-score": 0.9211796246648793,
34
+ "support": 913.0
35
+ },
36
+ "non_malignant": {
37
+ "precision": 0.125,
38
+ "recall": 0.058823529411764705,
39
+ "f1-score": 0.08,
40
+ "support": 51.0
41
+ },
42
+ "non_roi": {
43
+ "precision": 0.9608993157380255,
44
+ "recall": 0.9497584541062802,
45
+ "f1-score": 0.9552964042759962,
46
+ "support": 1035.0
47
+ },
48
+ "accuracy": 0.9229614807403702,
49
+ "macro avg": {
50
+ "precision": 0.6627367467025911,
51
+ "recall": 0.6498121033048466,
52
+ "f1-score": 0.6521586763136252,
53
+ "support": 1999.0
54
+ },
55
+ "weighted avg": {
56
+ "precision": 0.9128142399892127,
57
+ "recall": 0.9229614807403702,
58
+ "f1-score": 0.9173830794120515,
59
+ "support": 1999.0
60
+ }
61
+ },
62
+ "n": 1999,
63
+ "src_B_acc": 0.9550724637681159,
64
+ "src_B_n": 690,
65
+ "src_C_acc": 0.9227353463587922,
66
+ "src_C_n": 1126,
67
+ "src_D_acc": 0.8032786885245902,
68
+ "src_D_n": 183
69
+ },
70
+ "logs": [
71
+ {
72
+ "epoch": 0,
73
+ "train_loss": 0.47153146446697297,
74
+ "val_macro_f1": 0.6253741106462252
75
+ },
76
+ {
77
+ "epoch": 1,
78
+ "train_loss": 0.38950383521261667,
79
+ "val_macro_f1": 0.634759710371065
80
+ },
81
+ {
82
+ "epoch": 2,
83
+ "train_loss": 0.3723510449367856,
84
+ "val_macro_f1": 0.6521586763136252
85
+ },
86
+ {
87
+ "epoch": 3,
88
+ "train_loss": 0.3708163516388999,
89
+ "val_macro_f1": 0.6315619357093144
90
+ },
91
+ {
92
+ "epoch": 4,
93
+ "train_loss": 0.3565000023633715,
94
+ "val_macro_f1": 0.6374541959303275
95
+ },
96
+ {
97
+ "epoch": 5,
98
+ "train_loss": 0.34137669631413053,
99
+ "val_macro_f1": 0.6353387008099238
100
+ },
101
+ {
102
+ "epoch": 6,
103
+ "train_loss": 0.3367314050121913,
104
+ "val_macro_f1": 0.623599383782519
105
+ },
106
+ {
107
+ "epoch": 7,
108
+ "train_loss": 0.32387049472521223,
109
+ "val_macro_f1": 0.6165799728004868
110
+ }
111
+ ]
112
+ }
stage1_final/train_cls.py ADDED
@@ -0,0 +1,352 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Stage 1 v1 final: Plain classification (5-fold CV + final) with inline logits emission.
2
+
3
+ Backbones: convnext (ConvNeXt-Tiny), swin (Swin-Tiny), mamba (MambaVision-T), resnet (ResNet-50).
4
+ Resize: letterbox (aspect-ratio preserved) or squeeze (T.Resize((384,384))).
5
+
6
+ Pipeline per backbone:
7
+ 1. 5-fold CV: train plain model on 4 folds, eval on held-out fold → save fold checkpoint
8
+ 2. Final: train plain model on all train data, eval on test → save final checkpoint
9
+ 3. Emit plain OOF logits (all 5 folds' val predictions) → save plain_{bb}_oof.npz
10
+ 4. Emit plain test logits → save plain_{bb}_test.npz
11
+
12
+ All in one pass. No separate emit step needed.
13
+
14
+ Usage (DDP):
15
+ torchrun --nproc_per_node=2 train_cls.py --backbone mamba --resize letterbox
16
+ python train_cls.py --backbone mamba --resize letterbox # single GPU
17
+ """
18
+ import argparse
19
+ import datetime
20
+ import json
21
+ import os
22
+ import pathlib
23
+ import numpy as np
24
+ import torch
25
+ import torch.distributed as dist
26
+ import torch.nn as nn
27
+ from torch.nn.parallel import DistributedDataParallel as DDP
28
+ from torch.utils.data import DataLoader, Subset, DistributedSampler
29
+ from sklearn.metrics import (f1_score, accuracy_score, balanced_accuracy_score,
30
+ confusion_matrix, classification_report)
31
+ import timm
32
+
33
+ ROOT = pathlib.Path(__file__).parent
34
+ NUM_CLASSES = 3
35
+ SIZE = 384
36
+ BATCH = 32
37
+ EPOCHS = 25
38
+ LR = 1e-4
39
+ WD = 0.05
40
+ PATIENCE = 5
41
+ SEED = 42
42
+ LABEL_SMOOTH = 0.1
43
+ BACKBONES = ["convnext", "swin", "mamba", "resnet"]
44
+
45
+
46
+ def get_dataset_module(resize):
47
+ if resize == "letterbox":
48
+ import dataset_f as D
49
+ elif resize == "squeeze":
50
+ import dataset_f_squeeze as D
51
+ else:
52
+ raise ValueError(resize)
53
+ return D
54
+
55
+
56
+ def get_paths(backbone, resize):
57
+ """Return (models_dir, results_dir, logits_dir) for a backbone×resize combo."""
58
+ return (ROOT / "models" / resize / backbone,
59
+ ROOT / "results" / resize / backbone,
60
+ ROOT / "logits" / resize / backbone)
61
+
62
+
63
+ def setup():
64
+ if "RANK" not in os.environ:
65
+ return 0, 1, 0 # single-GPU fallback
66
+ rank = int(os.environ["RANK"]); world = int(os.environ["WORLD_SIZE"])
67
+ local = int(os.environ["LOCAL_RANK"])
68
+ torch.cuda.set_device(local)
69
+ dist.init_process_group(backend="nccl", timeout=datetime.timedelta(seconds=1800),
70
+ device_id=torch.device("cuda", local))
71
+ return rank, world, local
72
+
73
+
74
+ def cleanup():
75
+ if dist.is_initialized():
76
+ dist.destroy_process_group()
77
+
78
+
79
+ def is_main():
80
+ return (not dist.is_initialized()) or dist.get_rank() == 0
81
+
82
+
83
+ def log(*a):
84
+ if is_main():
85
+ print(*a, flush=True)
86
+
87
+
88
+ def set_seed(s):
89
+ torch.manual_seed(s); np.random.seed(s)
90
+ import random; random.seed(s)
91
+
92
+
93
+ def build_model(backbone):
94
+ if backbone == "convnext":
95
+ return timm.create_model("convnext_tiny", pretrained=True, num_classes=NUM_CLASSES, drop_rate=0.1)
96
+ if backbone == "swin":
97
+ return timm.create_model("swin_tiny_patch4_window7_224", pretrained=True, img_size=SIZE,
98
+ num_classes=NUM_CLASSES, drop_rate=0.1)
99
+ if backbone == "resnet":
100
+ return timm.create_model("resnet50", pretrained=True, num_classes=NUM_CLASSES, drop_rate=0.1)
101
+ if backbone == "mamba":
102
+ from mambavision.models.mamba_vision import mamba_vision_T
103
+ return mamba_vision_T(pretrained=True, num_classes=NUM_CLASSES, drop_rate=0.1)
104
+ raise ValueError(backbone)
105
+
106
+
107
+ def compute_per_class_precision(true, pred, names):
108
+ true = np.asarray(true); pred = np.asarray(pred)
109
+ result = {}
110
+ for i, name in enumerate(names):
111
+ tp = ((pred == i) & (true == i)).sum()
112
+ fp = ((pred == i) & (true != i)).sum()
113
+ result[name] = float(tp / max(tp + fp, 1))
114
+ return result
115
+
116
+
117
+ @torch.no_grad()
118
+ def evaluate(model, loader, device, names):
119
+ model.eval()
120
+ all_pred, all_true, all_src = [], [], []
121
+ for x, y, src, img in loader:
122
+ x = x.to(device, non_blocking=True)
123
+ logits = model(x)
124
+ pred = logits.argmax(1).cpu().numpy()
125
+ all_pred.extend(pred.tolist())
126
+ all_true.extend((y.numpy() if torch.is_tensor(y) else np.array(y)).tolist())
127
+ all_src.extend(list(src))
128
+ all_pred = np.array(all_pred); all_true = np.array(all_true); all_src = np.array(all_src)
129
+ metrics = {
130
+ "macro_f1": float(f1_score(all_true, all_pred, average="macro", labels=list(range(NUM_CLASSES)), zero_division=0)),
131
+ "accuracy": float(accuracy_score(all_true, all_pred)),
132
+ "balanced_acc": float(balanced_accuracy_score(all_true, all_pred)),
133
+ "per_class_recall": {names[i]: float(((all_true == i) & (all_pred == i)).sum() / max((all_true == i).sum(), 1)) for i in range(NUM_CLASSES)},
134
+ "per_class_precision": compute_per_class_precision(all_true, all_pred, names),
135
+ "confusion_matrix": confusion_matrix(all_true, all_pred, labels=list(range(NUM_CLASSES))).tolist(),
136
+ "classification_report": classification_report(all_true, all_pred, labels=list(range(NUM_CLASSES)), target_names=names, output_dict=True, zero_division=0),
137
+ "n": len(all_pred),
138
+ }
139
+ for s in ["B", "C", "D"]:
140
+ m = all_src == s
141
+ if m.sum() > 0:
142
+ metrics[f"src_{s}_acc"] = float(accuracy_score(all_true[m], all_pred[m]))
143
+ metrics[f"src_{s}_n"] = int(m.sum())
144
+ return metrics, all_pred, all_true
145
+
146
+
147
+ @torch.no_grad()
148
+ def collect_logits(model, loader, device):
149
+ """Collect raw logits, labels, and sources from a dataloader."""
150
+ model.eval()
151
+ L, Y, S = [], [], []
152
+ for x, y, src, _img in loader:
153
+ x = x.to(device, non_blocking=True)
154
+ logits = model(x).float().cpu().numpy()
155
+ L.append(logits)
156
+ Y.append(y.numpy() if torch.is_tensor(y) else np.asarray(y))
157
+ S.append(np.asarray(src))
158
+ return (np.concatenate(L), np.concatenate(Y).astype(np.int64), np.concatenate(S).astype("<U8"))
159
+
160
+
161
+ def train_one(backbone, train_ds, val_ds, ckpt_path, device, rank, world, local_rank):
162
+ sampler = DistributedSampler(train_ds, num_replicas=world, rank=rank, shuffle=True, drop_last=True) if world > 1 \
163
+ else None
164
+ loader_kwargs = dict(batch_size=BATCH, num_workers=4, pin_memory=True, persistent_workers=True, drop_last=True)
165
+ if world > 1:
166
+ loader_kwargs["sampler"] = sampler
167
+ else:
168
+ loader_kwargs["shuffle"] = True
169
+ loader = DataLoader(train_ds, **loader_kwargs)
170
+ val_loader = DataLoader(val_ds, batch_size=BATCH, shuffle=False, num_workers=4,
171
+ pin_memory=True, persistent_workers=True) if is_main() else None
172
+
173
+ model = build_model(backbone).to(device)
174
+ if world > 1:
175
+ model = DDP(model, device_ids=[local_rank], output_device=local_rank,
176
+ gradient_as_bucket_view=True, bucket_cap_mb=25,
177
+ find_unused_parameters=(backbone == "mamba"))
178
+ opt = torch.optim.AdamW(model.parameters(), lr=LR, weight_decay=WD)
179
+ sched = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=EPOCHS)
180
+ criterion = nn.CrossEntropyLoss(label_smoothing=LABEL_SMOOTH)
181
+
182
+ best_f1 = -1.0; best_metrics = None; best_state = None; no_improve = 0; logs = []
183
+ for ep in range(EPOCHS):
184
+ if sampler is not None:
185
+ sampler.set_epoch(ep)
186
+ model.train(); tot = 0.0; nb = 0
187
+ for x, y, _, _ in loader:
188
+ x = x.to(device, non_blocking=True); y = y.to(device, non_blocking=True)
189
+ opt.zero_grad(set_to_none=True)
190
+ with torch.amp.autocast("cuda", dtype=torch.bfloat16):
191
+ loss = criterion(model(x), y)
192
+ loss.backward(); opt.step()
193
+ tot += loss.item(); nb += 1
194
+ sched.step()
195
+ if is_main():
196
+ m = model.module if world > 1 else model
197
+ vm, _, _ = evaluate(m, val_loader, device, D.TARGET3_NAMES)
198
+ lg = {"epoch": ep, "train_loss": tot / max(nb, 1), "val_macro_f1": vm["macro_f1"]}
199
+ logs.append(lg)
200
+ log(f" ep{ep}: loss={lg['train_loss']:.4f} val_f1={vm['macro_f1']:.4f}")
201
+ if vm["macro_f1"] > best_f1:
202
+ best_f1 = vm["macro_f1"]; best_metrics = vm
203
+ best_state = {k: v.cpu() for k, v in m.state_dict().items()}; no_improve = 0
204
+ else:
205
+ no_improve += 1
206
+ if world > 1:
207
+ flag = torch.tensor([no_improve if is_main() else 0, best_f1 if is_main() else 0.0], device=device)
208
+ dist.all_reduce(flag, op=dist.ReduceOp.MAX)
209
+ no_improve = int(flag[0].item()); best_f1 = float(flag[1].item())
210
+ if no_improve >= PATIENCE:
211
+ log(f" early stop at ep{ep}"); break
212
+ if is_main() and best_state is not None:
213
+ torch.save(best_state, ckpt_path)
214
+ if world > 1:
215
+ dist.barrier()
216
+ return best_metrics, logs
217
+
218
+
219
+ def load_plain_model(backbone, ckpt_path, device):
220
+ model = build_model(backbone).to(device)
221
+ state = torch.load(ckpt_path, map_location=device, weights_only=False)
222
+ model.load_state_dict(state)
223
+ model.eval()
224
+ return model
225
+
226
+
227
+ def run_cv(backbone, resize, device, rank, world, local_rank):
228
+ D = get_dataset_module(resize)
229
+ models_dir, results_dir, logits_dir = get_paths(backbone, resize)
230
+ for p in (models_dir, results_dir, logits_dir):
231
+ p.mkdir(parents=True, exist_ok=True)
232
+
233
+ log(f"\n=== target3 CV ({resize}): {backbone} ===")
234
+ fold_metrics = []
235
+ base_train = D.FTarget3Dataset("train", fold=None, train=True, size=SIZE)
236
+ base_val = D.FTarget3Dataset("train", fold=None, train=False, size=SIZE)
237
+ all_cv = base_train.ds["cv_fold"]
238
+ oof_logits = np.zeros((len(base_train), NUM_CLASSES), dtype=np.float32)
239
+
240
+ for fold in range(5):
241
+ log(f"-- fold {fold} --")
242
+ set_seed(SEED)
243
+ tr_idx = [i for i, c in enumerate(all_cv) if c != fold]
244
+ va_idx = [i for i, c in enumerate(all_cv) if c == fold]
245
+ tr_sub = Subset(base_train, tr_idx)
246
+ va_sub = Subset(base_val, va_idx)
247
+ ckpt = models_dir / f"target3_{backbone}_fold{fold}.pt"
248
+ m, logs = train_one(backbone, tr_sub, va_sub, ckpt, device, rank, world, local_rank)
249
+ if is_main():
250
+ fold_metrics.append({"fold": fold, **m})
251
+ (results_dir / f"target3_{backbone}_fold{fold}_val.json").write_text(
252
+ json.dumps({"fold": fold, "metrics": m, "logs": logs}, indent=2))
253
+ log(f" fold{fold} macro_f1={m['macro_f1']:.4f}")
254
+
255
+ # Emit OOF logits for this fold inline
256
+ model = load_plain_model(backbone, ckpt, device)
257
+ va_loader = DataLoader(va_sub, batch_size=BATCH, shuffle=False, num_workers=4, pin_memory=True)
258
+ logits, labels, srcs = collect_logits(model, va_loader, device)
259
+ oof_logits[va_idx] = logits
260
+ del model; torch.cuda.empty_cache()
261
+
262
+ if is_main():
263
+ f1s = [fm["macro_f1"] for fm in fold_metrics]
264
+ nm = [fm["per_class_recall"]["non_malignant"] for fm in fold_metrics]
265
+ summ = {"backbone": backbone, "resize": resize, "folds": fold_metrics,
266
+ "cv_macro_f1_mean": float(np.mean(f1s)), "cv_macro_f1_std": float(np.std(f1s)),
267
+ "cv_non_malignant_recall_mean": float(np.mean(nm)), "cv_non_malignant_recall_std": float(np.std(nm))}
268
+ (results_dir / f"target3_{backbone}_cv_summary.json").write_text(json.dumps(summ, indent=2))
269
+ log(f"CV: f1={summ['cv_macro_f1_mean']:.4f}±{summ['cv_macro_f1_std']:.4f} nm_rec={summ['cv_non_malignant_recall_mean']:.4f}")
270
+ return summ, oof_logits
271
+ return None, None
272
+
273
+
274
+ def run_final(backbone, resize, device, rank, world, local_rank):
275
+ D = get_dataset_module(resize)
276
+ models_dir, results_dir, logits_dir = get_paths(backbone, resize)
277
+
278
+ log(f"\n=== target3 FINAL ({resize}): {backbone} ===")
279
+ set_seed(SEED)
280
+ tr = D.FTarget3Dataset("train", fold=None, train=True, size=SIZE)
281
+ va = D.FTarget3Dataset("validation", fold=None, train=False, size=SIZE)
282
+ te = D.FTarget3Dataset("test", fold=None, train=False, size=SIZE)
283
+ ckpt = models_dir / f"target3_{backbone}_final.pt"
284
+ m, logs = train_one(backbone, tr, va, ckpt, device, rank, world, local_rank)
285
+ if is_main():
286
+ model = load_plain_model(backbone, ckpt, device)
287
+ tl = DataLoader(te, batch_size=BATCH, shuffle=False, num_workers=4, pin_memory=True)
288
+ tm, tp, tt = evaluate(model, tl, device, D.TARGET3_NAMES)
289
+ res = {"backbone": backbone, "resize": resize, "val_metrics": m, "test_metrics": tm,
290
+ "test_predictions": tp.tolist(), "test_true": tt.tolist(), "logs": logs}
291
+ (results_dir / f"target3_{backbone}_final.json").write_text(json.dumps(res, indent=2))
292
+ log(f"FINAL: val_f1={m['macro_f1']:.4f} test_f1={tm['macro_f1']:.4f} test_nm_rec={tm['per_class_recall']['non_malignant']:.4f}")
293
+
294
+ # Emit test logits inline
295
+ te_loader = DataLoader(te, batch_size=BATCH, shuffle=False, num_workers=4, pin_memory=True)
296
+ test_logits, test_labels, test_srcs = collect_logits(model, te_loader, device)
297
+ del model; torch.cuda.empty_cache()
298
+ return res, test_logits, test_labels, test_srcs
299
+ return None, None, None, None
300
+
301
+
302
+ def save_oof_logits(backbone, resize, oof_logits):
303
+ D = get_dataset_module(resize)
304
+ _, _, logits_dir = get_paths(backbone, resize)
305
+ ds = D.load_from_disk(str(D.F_HF))["train"]
306
+ labels = np.asarray(ds["target3"], dtype=np.int64)
307
+ cvf = np.asarray(ds["cv_fold"], dtype=np.int64)
308
+ srcs = np.asarray(ds["source_dataset"], dtype="<U8")
309
+ fns = np.asarray(ds["original_filename"], dtype="<U64")
310
+ np.savez(logits_dir / f"plain_{backbone}_oof.npz",
311
+ logits=oof_logits, labels=labels, cv_fold=cvf, source=srcs, filename=fns)
312
+ log(f" saved plain_{backbone}_oof.npz ({oof_logits.shape})")
313
+
314
+
315
+ def save_test_logits(backbone, resize, test_logits, test_labels, test_srcs):
316
+ D = get_dataset_module(resize)
317
+ _, _, logits_dir = get_paths(backbone, resize)
318
+ ds = D.load_from_disk(str(D.F_HF))["test"]
319
+ fns = np.asarray(ds["original_filename"], dtype="<U64")
320
+ np.savez(logits_dir / f"plain_{backbone}_test.npz",
321
+ logits=test_logits, labels=test_labels, source=test_srcs, filename=fns)
322
+ log(f" saved plain_{backbone}_test.npz ({test_logits.shape})")
323
+
324
+
325
+ def main():
326
+ ap = argparse.ArgumentParser()
327
+ ap.add_argument("--backbone", choices=BACKBONES, required=True)
328
+ ap.add_argument("--resize", choices=["letterbox", "squeeze"], required=True)
329
+ ap.add_argument("--mode", choices=["cv", "final", "both"], default="both")
330
+ args = ap.parse_args()
331
+
332
+ global D
333
+ D = get_dataset_module(args.resize)
334
+
335
+ rank, world, local = setup()
336
+ dev = torch.device("cuda", local) if torch.cuda.is_available() else torch.device("cpu")
337
+ log(f"world={world} backbone={args.backbone} resize={args.resize}")
338
+ try:
339
+ if args.mode in ("cv", "both"):
340
+ summ, oof_logits = run_cv(args.backbone, args.resize, dev, rank, world, local)
341
+ if is_main() and oof_logits is not None:
342
+ save_oof_logits(args.backbone, args.resize, oof_logits)
343
+ if args.mode in ("final", "both"):
344
+ res, test_logits, test_labels, test_srcs = run_final(args.backbone, args.resize, dev, rank, world, local)
345
+ if is_main() and test_logits is not None:
346
+ save_test_logits(args.backbone, args.resize, test_logits, test_labels, test_srcs)
347
+ finally:
348
+ cleanup()
349
+
350
+
351
+ if __name__ == "__main__":
352
+ main()
stage1_final/train_crt.py ADDED
@@ -0,0 +1,347 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Stage 1 v1 final: cRT (classifier-retraining) with inline logits emission.
2
+
3
+ Loads frozen backbone checkpoints from train_cls.py, retrains classifier head
4
+ with class-balanced sampling (ClassAwareSampler + SGD), saves cRT checkpoints,
5
+ and emits cRT OOF + test logits — all in one pass.
6
+
7
+ cRT (Kang et al., ICLR 2020):
8
+ - Freeze backbone, retrain classifier from RANDOM init
9
+ - SGD (lr=0.2, momentum=0.9, weight_decay=5e-4), cosine LR
10
+ - ClassAwareSampler: cyclic round-robin, 4 samples/class/batch
11
+ - CrossEntropyLoss (no label smoothing)
12
+ - 10 epochs
13
+
14
+ Usage:
15
+ python train_crt.py --backbone mamba --resize letterbox
16
+ """
17
+ import argparse
18
+ import json
19
+ import pathlib
20
+ import sys
21
+ import numpy as np
22
+ import torch
23
+ import torch.nn as nn
24
+ from torch.utils.data import DataLoader, Sampler, Subset
25
+ import timm
26
+ from sklearn.metrics import (f1_score, accuracy_score, balanced_accuracy_score,
27
+ confusion_matrix, classification_report)
28
+
29
+ ROOT = pathlib.Path(__file__).parent
30
+ sys.path.insert(0, str(ROOT))
31
+
32
+ SIZE = 384
33
+ BATCH = 32
34
+ CRT_BATCH = 256
35
+ NUM_CLASSES = 3
36
+ CRT_EPOCHS = 10
37
+ CRT_LR = 0.2
38
+ CRT_MOMENTUM = 0.9
39
+ CRT_WD = 5e-4
40
+ SEED = 17
41
+ BACKBONES = ["convnext", "swin", "mamba", "resnet"]
42
+
43
+
44
+ def get_dataset_module(resize):
45
+ if resize == "letterbox":
46
+ import dataset_f as D
47
+ elif resize == "squeeze":
48
+ import dataset_f_squeeze as D
49
+ else:
50
+ raise ValueError(resize)
51
+ return D
52
+
53
+
54
+ def get_paths(backbone, resize):
55
+ return (ROOT / "models" / resize / backbone,
56
+ ROOT / "results" / resize / backbone,
57
+ ROOT / "logits" / resize / backbone)
58
+
59
+
60
+ def build_model(backbone):
61
+ if backbone == "convnext":
62
+ return timm.create_model("convnext_tiny", pretrained=False, num_classes=NUM_CLASSES, drop_rate=0.1)
63
+ if backbone == "swin":
64
+ return timm.create_model("swin_tiny_patch4_window7_224", pretrained=False, img_size=SIZE, num_classes=NUM_CLASSES, drop_rate=0.1)
65
+ if backbone == "resnet":
66
+ return timm.create_model("resnet50", pretrained=False, num_classes=NUM_CLASSES, drop_rate=0.1)
67
+ if backbone == "mamba":
68
+ from mambavision.models.mamba_vision import mamba_vision_T
69
+ return mamba_vision_T(pretrained=False, num_classes=NUM_CLASSES, drop_rate=0.1)
70
+ raise ValueError(backbone)
71
+
72
+
73
+ def load_frozen_backbone(backbone, ckpt_path, device):
74
+ model = build_model(backbone).to(device)
75
+ state = torch.load(ckpt_path, map_location=device, weights_only=False)
76
+ model.load_state_dict(state)
77
+ model.eval()
78
+ for p in model.parameters():
79
+ p.requires_grad = False
80
+ return model
81
+
82
+
83
+ def get_classifier_linear(model):
84
+ if hasattr(model, "head") and hasattr(model.head, "fc") and isinstance(model.head.fc, nn.Linear):
85
+ return model.head.fc
86
+ if hasattr(model, "classifier") and isinstance(model.classifier, nn.Linear):
87
+ return model.classifier
88
+ if hasattr(model, "head") and isinstance(model.head, nn.Linear):
89
+ return model.head
90
+ if hasattr(model, "fc") and isinstance(model.fc, nn.Linear):
91
+ return model.fc
92
+ raise RuntimeError("classifier linear layer not found")
93
+
94
+
95
+ def compute_per_class_precision(true, pred, names):
96
+ true = np.asarray(true); pred = np.asarray(pred)
97
+ result = {}
98
+ for i, name in enumerate(names):
99
+ tp = ((pred == i) & (true == i)).sum()
100
+ fp = ((pred == i) & (true != i)).sum()
101
+ result[name] = float(tp / max(tp + fp, 1))
102
+ return result
103
+
104
+
105
+ def eval_predictions(all_pred, all_true, all_src, names):
106
+ all_pred = np.array(all_pred); all_true = np.array(all_true); all_src = np.array(all_src)
107
+ m = {
108
+ "macro_f1": float(f1_score(all_true, all_pred, average="macro", labels=list(range(NUM_CLASSES)), zero_division=0)),
109
+ "accuracy": float(accuracy_score(all_true, all_pred)),
110
+ "balanced_acc": float(balanced_accuracy_score(all_true, all_pred)),
111
+ "per_class_recall": {names[i]: float(((all_true == i) & (all_pred == i)).sum() / max((all_true == i).sum(), 1)) for i in range(NUM_CLASSES)},
112
+ "per_class_precision": compute_per_class_precision(all_true, all_pred, names),
113
+ "confusion_matrix": confusion_matrix(all_true, all_pred, labels=list(range(NUM_CLASSES))).tolist(),
114
+ "classification_report": classification_report(all_true, all_pred, labels=list(range(NUM_CLASSES)), target_names=names, output_dict=True, zero_division=0),
115
+ "n": len(all_pred),
116
+ }
117
+ for s in ["B", "C", "D"]:
118
+ mk = all_src == s
119
+ if mk.sum() > 0:
120
+ m[f"src_{s}_acc"] = float(accuracy_score(all_true[mk], all_pred[mk]))
121
+ m[f"src_{s}_n"] = int(mk.sum())
122
+ return m
123
+
124
+
125
+ class ClassAwareSampler(Sampler):
126
+ """ClassAwareSampler: cycles through classes, samples num_samples_cls per class."""
127
+ def __init__(self, labels, num_samples_cls=4):
128
+ self.labels = np.array(labels)
129
+ self.num_classes = NUM_CLASSES
130
+ self.num_samples_cls = num_samples_cls
131
+ self.cls_indices = {}
132
+ for c in range(self.num_classes):
133
+ self.cls_indices[c] = np.where(self.labels == c)[0].tolist()
134
+ max_cls_size = max(len(v) for v in self.cls_indices.values())
135
+ self.num_samples = self.num_classes * max_cls_size
136
+
137
+ def __iter__(self):
138
+ cls_iters = {c: 0 for c in range(self.num_classes)}
139
+ cls_orders = {c: np.random.permutation(len(self.cls_indices[c])) for c in range(self.num_classes)}
140
+ for _ in range(self.num_samples // (self.num_classes * self.num_samples_cls)):
141
+ for c in range(self.num_classes):
142
+ for _ in range(self.num_samples_cls):
143
+ if cls_iters[c] >= len(self.cls_indices[c]):
144
+ cls_orders[c] = np.random.permutation(len(self.cls_indices[c]))
145
+ cls_iters[c] = 0
146
+ idx = self.cls_indices[c][cls_orders[c][cls_iters[c]]]
147
+ cls_iters[c] += 1
148
+ yield idx
149
+
150
+ def __len__(self):
151
+ return self.num_samples
152
+
153
+
154
+ def crt_train(model, train_ds, device):
155
+ """cRT: freeze backbone, retrain classifier from RANDOM init with class-balanced sampling."""
156
+ clf = get_classifier_linear(model)
157
+ nn.init.kaiming_normal_(clf.weight, mode='fan_out', nonlinearity='linear')
158
+ if clf.bias is not None:
159
+ nn.init.zeros_(clf.bias)
160
+ for p in clf.parameters():
161
+ p.requires_grad = True
162
+
163
+ labels = np.array(train_ds.all_labels()) if hasattr(train_ds, 'all_labels') else np.array([train_ds[i][1] for i in range(len(train_ds))])
164
+ sampler = ClassAwareSampler(labels, num_samples_cls=4)
165
+ loader = DataLoader(train_ds, batch_size=CRT_BATCH, sampler=sampler, num_workers=4, pin_memory=True)
166
+
167
+ opt = torch.optim.SGD(clf.parameters(), lr=CRT_LR, momentum=CRT_MOMENTUM, weight_decay=CRT_WD)
168
+ sched = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=CRT_EPOCHS, eta_min=0.0)
169
+ crit = nn.CrossEntropyLoss()
170
+
171
+ for ep in range(CRT_EPOCHS):
172
+ sched.step()
173
+ model.train()
174
+ tot = 0.0; nb = 0
175
+ for x, y, _, _ in loader:
176
+ x = x.to(device, non_blocking=True)
177
+ y = y.to(device, non_blocking=True)
178
+ opt.zero_grad(set_to_none=True)
179
+ with torch.amp.autocast("cuda", dtype=torch.bfloat16):
180
+ loss = crit(model(x), y)
181
+ loss.backward()
182
+ opt.step()
183
+ tot += loss.item(); nb += 1
184
+ print(f" cRT ep{ep}: loss={tot/max(nb,1):.4f} lr={sched.get_last_lr()[0]:.6f}")
185
+
186
+ for p in clf.parameters():
187
+ p.requires_grad = False
188
+ return model
189
+
190
+
191
+ @torch.no_grad()
192
+ def evaluate(model, loader, device, names):
193
+ model.eval()
194
+ all_pred, all_true, all_src = [], [], []
195
+ for x, y, src, img in loader:
196
+ x = x.to(device, non_blocking=True)
197
+ logits = model(x)
198
+ pred = logits.argmax(1).cpu().numpy()
199
+ all_pred.extend(pred.tolist())
200
+ all_true.extend((y.numpy() if torch.is_tensor(y) else np.array(y)).tolist())
201
+ all_src.extend(list(src))
202
+ all_pred = np.array(all_pred); all_true = np.array(all_true); all_src = np.array(all_src)
203
+ return eval_predictions(all_pred, all_true, all_src, names)
204
+
205
+
206
+ @torch.no_grad()
207
+ def collect_logits(model, loader, device):
208
+ model.eval()
209
+ L, Y, S = [], [], []
210
+ for x, y, src, _img in loader:
211
+ x = x.to(device, non_blocking=True)
212
+ logits = model(x).float().cpu().numpy()
213
+ L.append(logits)
214
+ Y.append(y.numpy() if torch.is_tensor(y) else np.asarray(y))
215
+ S.append(np.asarray(src))
216
+ return (np.concatenate(L), np.concatenate(Y).astype(np.int64), np.concatenate(S).astype("<U8"))
217
+
218
+
219
+ def save_crt_head(model, backbone, tag, models_dir):
220
+ path = models_dir / f"crt_{backbone}_{tag}.pt"
221
+ torch.save({"full_state_dict": model.state_dict(), "backbone": backbone, "tag": tag}, path)
222
+ print(f" saved cRT checkpoint -> {path}")
223
+
224
+
225
+ def load_crt_checkpoint(backbone, ckpt_path, device):
226
+ model = build_model(backbone).to(device)
227
+ state = torch.load(ckpt_path, map_location=device, weights_only=False)
228
+ model.load_state_dict(state["full_state_dict"])
229
+ model.eval()
230
+ for p in model.parameters():
231
+ p.requires_grad_(False)
232
+ return model
233
+
234
+
235
+ def run_cv(backbone, resize, device):
236
+ D = get_dataset_module(resize)
237
+ models_dir, results_dir, logits_dir = get_paths(backbone, resize)
238
+ names = D.TARGET3_NAMES
239
+
240
+ print(f"\n=== cRT CV ({resize}): {backbone} ===")
241
+ base_train = D.FTarget3Dataset("train", fold=None, train=True, size=SIZE)
242
+ base_val = D.FTarget3Dataset("train", fold=None, train=False, size=SIZE)
243
+ all_cv = base_train.ds["cv_fold"]
244
+ fold_metrics = []
245
+ oof_logits = np.zeros((len(base_train), NUM_CLASSES), dtype=np.float32)
246
+
247
+ for fold in range(5):
248
+ print(f"-- fold {fold} --")
249
+ torch.manual_seed(SEED); np.random.seed(SEED)
250
+ plain_ckpt = models_dir / f"target3_{backbone}_fold{fold}.pt"
251
+ model = load_frozen_backbone(backbone, plain_ckpt, device)
252
+
253
+ tr_idx = [i for i, c in enumerate(all_cv) if c != fold]
254
+ va_idx = [i for i, c in enumerate(all_cv) if c == fold]
255
+ tr_sub = Subset(base_train, tr_idx)
256
+ va_sub = Subset(base_val, va_idx)
257
+
258
+ model = crt_train(model, tr_sub, device)
259
+ save_crt_head(model, backbone, f"fold{fold}", models_dir)
260
+ va_loader = DataLoader(va_sub, batch_size=BATCH, shuffle=False, num_workers=4, pin_memory=True)
261
+ m = evaluate(model, va_loader, device, names)
262
+ print(f" fold{fold} f1={m['macro_f1']:.4f} nm_rec={m['per_class_recall']['non_malignant']:.4f}")
263
+ fold_metrics.append({"fold": fold, **m})
264
+
265
+ # Collect OOF logits inline
266
+ logits, _, _ = collect_logits(model, va_loader, device)
267
+ oof_logits[va_idx] = logits
268
+ del model; torch.cuda.empty_cache()
269
+
270
+ f1s = [fm["macro_f1"] for fm in fold_metrics]
271
+ nms = [fm["per_class_recall"]["non_malignant"] for fm in fold_metrics]
272
+ baccs = [fm["balanced_acc"] for fm in fold_metrics]
273
+ summ = {
274
+ "backbone": backbone, "resize": resize, "folds": fold_metrics,
275
+ "cv_macro_f1_mean": float(np.mean(f1s)), "cv_macro_f1_std": float(np.std(f1s)),
276
+ "cv_non_malignant_recall_mean": float(np.mean(nms)), "cv_non_malignant_recall_std": float(np.std(nms)),
277
+ "cv_balanced_acc_mean": float(np.mean(baccs)), "cv_balanced_acc_std": float(np.std(baccs)),
278
+ }
279
+ (results_dir / f"crt_{backbone}_cv_summary.json").write_text(json.dumps(summ, indent=2))
280
+ print(f"CV: f1={summ['cv_macro_f1_mean']:.4f}±{summ['cv_macro_f1_std']:.4f} nm_rec={summ['cv_non_malignant_recall_mean']:.4f}±{summ['cv_non_malignant_recall_std']:.4f}")
281
+
282
+ # Save OOF logits
283
+ ds = D.load_from_disk(str(D.F_HF))["train"]
284
+ labels = np.asarray(ds["target3"], dtype=np.int64)
285
+ cvf = np.asarray(ds["cv_fold"], dtype=np.int64)
286
+ srcs = np.asarray(ds["source_dataset"], dtype="<U8")
287
+ fns = np.asarray(ds["original_filename"], dtype="<U64")
288
+ np.savez(logits_dir / f"{backbone}_oof.npz",
289
+ logits=oof_logits, labels=labels, cv_fold=cvf, source=srcs, filename=fns)
290
+ print(f" saved {backbone}_oof.npz ({oof_logits.shape})")
291
+ return summ
292
+
293
+
294
+ def run_final(backbone, resize, device):
295
+ D = get_dataset_module(resize)
296
+ models_dir, results_dir, logits_dir = get_paths(backbone, resize)
297
+ names = D.TARGET3_NAMES
298
+
299
+ print(f"\n=== cRT FINAL ({resize}): {backbone} ===")
300
+ torch.manual_seed(SEED); np.random.seed(SEED)
301
+ plain_ckpt = models_dir / f"target3_{backbone}_final.pt"
302
+ model = load_frozen_backbone(backbone, plain_ckpt, device)
303
+
304
+ tr = D.FTarget3Dataset("train", fold=None, train=True, size=SIZE)
305
+ te = D.FTarget3Dataset("test", fold=None, train=False, size=SIZE)
306
+
307
+ model = crt_train(model, tr, device)
308
+ save_crt_head(model, backbone, "final", models_dir)
309
+ te_loader = DataLoader(te, batch_size=BATCH, shuffle=False, num_workers=4, pin_memory=True)
310
+ tm = evaluate(model, te_loader, device, names)
311
+ print(f"FINAL: test_f1={tm['macro_f1']:.4f} test_nm_rec={tm['per_class_recall']['non_malignant']:.4f} test_bal_acc={tm['balanced_acc']:.4f}")
312
+
313
+ res = {"backbone": backbone, "resize": resize, "test_metrics": tm}
314
+ (results_dir / f"crt_{backbone}_final.json").write_text(json.dumps(res, indent=2))
315
+
316
+ # Save test logits inline
317
+ test_logits, test_labels, test_srcs = collect_logits(model, te_loader, device)
318
+ ds = D.load_from_disk(str(D.F_HF))["test"]
319
+ fns = np.asarray(ds["original_filename"], dtype="<U64")
320
+ np.savez(logits_dir / f"{backbone}_test.npz",
321
+ logits=test_logits, labels=test_labels, source=test_srcs, filename=fns)
322
+ print(f" saved {backbone}_test.npz ({test_logits.shape})")
323
+
324
+ del model; torch.cuda.empty_cache()
325
+ return res
326
+
327
+
328
+ def main():
329
+ ap = argparse.ArgumentParser()
330
+ ap.add_argument("--backbone", choices=BACKBONES, required=True)
331
+ ap.add_argument("--resize", choices=["letterbox", "squeeze"], required=True)
332
+ ap.add_argument("--mode", choices=["cv", "final", "both"], default="both")
333
+ args = ap.parse_args()
334
+ device = torch.device("cuda")
335
+ bb = args.backbone
336
+ print(f"=== cRT classifier-balancing ({args.resize}) — {bb} ===")
337
+ try:
338
+ if args.mode in ("cv", "both"):
339
+ run_cv(bb, args.resize, device)
340
+ if args.mode in ("final", "both"):
341
+ run_final(bb, args.resize, device)
342
+ finally:
343
+ torch.cuda.empty_cache()
344
+
345
+
346
+ if __name__ == "__main__":
347
+ main()
stage1_final/train_seg.py ADDED
@@ -0,0 +1,340 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Stage 1 v1 final: Binary tumor segmentation (5-fold CV + final).
2
+
3
+ Backbones: convnext, swin, mamba, resnet (all via timm features_only + FPN,
4
+ except mamba which uses hook-based feature extraction).
5
+ Resize: letterbox or squeeze.
6
+
7
+ Usage (DDP):
8
+ torchrun --nproc_per_node=2 train_seg.py --backbone mamba --resize letterbox
9
+ python train_seg.py --backbone mamba --resize letterbox # single GPU
10
+ """
11
+ import argparse
12
+ import datetime
13
+ import json
14
+ import os
15
+ import pathlib
16
+ import sys
17
+ import numpy as np
18
+ import torch
19
+ import torch.distributed as dist
20
+ import torch.nn as nn
21
+ import torch.nn.functional as F
22
+ from torch.nn.parallel import DistributedDataParallel as DDP
23
+ from torch.utils.data import DataLoader, Subset, DistributedSampler
24
+ import timm
25
+
26
+ ROOT = pathlib.Path(__file__).parent
27
+ sys.path.insert(0, str(ROOT))
28
+
29
+ SIZE = 384
30
+ BATCH = 16
31
+ EPOCHS = 50
32
+ LR = 1e-4
33
+ WD = 0.05
34
+ PATIENCE = 10
35
+ SEED = 42
36
+ BACKBONES = ["convnext", "swin", "mamba", "resnet"]
37
+
38
+
39
+ def get_dataset_module(resize):
40
+ if resize == "letterbox":
41
+ import dataset_f as D
42
+ elif resize == "squeeze":
43
+ import dataset_f_squeeze as D
44
+ else:
45
+ raise ValueError(resize)
46
+ return D
47
+
48
+
49
+ def get_paths(backbone, resize):
50
+ return (ROOT / "models" / resize / backbone,
51
+ ROOT / "results" / resize / backbone,
52
+ ROOT / "logits" / resize / backbone)
53
+
54
+
55
+ def setup():
56
+ if "RANK" not in os.environ:
57
+ return 0, 1, 0
58
+ rank = int(os.environ["RANK"]); world = int(os.environ["WORLD_SIZE"])
59
+ local = int(os.environ["LOCAL_RANK"])
60
+ torch.cuda.set_device(local)
61
+ dist.init_process_group(backend="nccl", timeout=datetime.timedelta(seconds=1800),
62
+ device_id=torch.device("cuda", local))
63
+ return rank, world, local
64
+
65
+
66
+ def cleanup():
67
+ if dist.is_initialized():
68
+ dist.destroy_process_group()
69
+
70
+
71
+ def is_main():
72
+ return (not dist.is_initialized()) or dist.get_rank() == 0
73
+
74
+
75
+ def log(*a):
76
+ if is_main():
77
+ print(*a, flush=True)
78
+
79
+
80
+ def set_seed(s):
81
+ torch.manual_seed(s); np.random.seed(s)
82
+ import random; random.seed(s)
83
+
84
+
85
+ class FPNDecoder(nn.Module):
86
+ def __init__(self, in_channels, hidden=128):
87
+ super().__init__()
88
+ self.laterals = nn.ModuleList([nn.Conv2d(c, hidden, 1) for c in in_channels])
89
+ self.smooths = nn.ModuleList([nn.Conv2d(hidden, hidden, 3, padding=1) for _ in in_channels])
90
+ self.head = nn.Sequential(nn.Conv2d(hidden, hidden, 3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(hidden, 1, 1))
91
+
92
+ def forward(self, feats):
93
+ lat = [l(f) for l, f in zip(self.laterals, feats)]
94
+ for i in range(len(lat) - 1, 0, -1):
95
+ lat[i - 1] = lat[i - 1] + F.interpolate(lat[i], size=lat[i - 1].shape[-2:], mode="nearest")
96
+ return self.head(self.smooths[0](lat[0]))
97
+
98
+
99
+ class TimmSegModel(nn.Module):
100
+ """Generic timm backbone + FPN decoder. Works for ConvNeXt, Swin, ResNet."""
101
+ def __init__(self, backbone_name):
102
+ super().__init__()
103
+ self.backbone_name = backbone_name
104
+ if backbone_name == "convnext":
105
+ self.backbone = timm.create_model("convnext_tiny", pretrained=True, features_only=True, out_indices=(1, 2, 3))
106
+ elif backbone_name == "swin":
107
+ self.backbone = timm.create_model("swin_tiny_patch4_window7_224", pretrained=True, img_size=SIZE, features_only=True, out_indices=(1, 2, 3))
108
+ elif backbone_name == "resnet":
109
+ self.backbone = timm.create_model("resnet50", pretrained=True, features_only=True, out_indices=(1, 2, 3))
110
+ else:
111
+ raise ValueError(backbone_name)
112
+
113
+ with torch.no_grad():
114
+ outs = self.backbone(torch.randn(1, 3, SIZE, SIZE))
115
+ self._is_nhwc = []
116
+ chs = []
117
+ for o in outs:
118
+ if o.dim() == 4 and o.shape[1] != o.shape[-1]:
119
+ is_nhwc = o.shape[-1] > o.shape[1]
120
+ self._is_nhwc.append(is_nhwc)
121
+ chs.append(o.shape[-1] if is_nhwc else o.shape[1])
122
+ else:
123
+ self._is_nhwc.append(False)
124
+ chs.append(o.shape[1] if o.dim() == 4 else o.shape[-1])
125
+ self.decoder = FPNDecoder(chs)
126
+
127
+ def forward(self, x):
128
+ feats = self.backbone(x)
129
+ feats = [f.permute(0, 3, 1, 2) if (f.dim() == 4 and self._is_nhwc[i]) else f for i, f in enumerate(feats)]
130
+ out = self.decoder(feats)
131
+ return F.interpolate(out, size=x.shape[-2:], mode="bilinear", align_corners=False)
132
+
133
+
134
+ class MambaSegModel(nn.Module):
135
+ """MambaVision-T backbone with FPN decoder. Captures stage outputs via hooks."""
136
+ def __init__(self):
137
+ super().__init__()
138
+ from mambavision.models.mamba_vision import mamba_vision_T
139
+ self.net = mamba_vision_T(pretrained=True, num_classes=0, global_pool='')
140
+ self._feats = {}
141
+ self._hooks = []
142
+ levels = self.net.levels
143
+ self._idxs = [1, 2, 3]
144
+ for i in self._idxs:
145
+ hk = levels[i].register_forward_hook(self._mk_hook(i))
146
+ self._hooks.append(hk)
147
+ self.net.eval()
148
+ dev = torch.cuda.current_device() if torch.cuda.is_available() else "cpu"
149
+ self.net.to(dev)
150
+ with torch.no_grad():
151
+ self.net(torch.randn(1, 3, SIZE, SIZE, device=dev))
152
+ chs = []
153
+ for i in self._idxs:
154
+ f = self._feats[i]
155
+ chs.append(f.shape[1] if f.dim() == 4 else f.shape[-1])
156
+ self.decoder = FPNDecoder(chs)
157
+
158
+ def _mk_hook(self, i):
159
+ def hook(mod, inp, out):
160
+ self._feats[i] = out
161
+ return hook
162
+
163
+ def forward(self, x):
164
+ self._feats = {}
165
+ self.net(x)
166
+ feats = [self._feats[i] for i in self._idxs]
167
+ feats = [f if f.dim() == 4 else f.permute(0, 3, 1, 2) for f in feats]
168
+ out = self.decoder(feats)
169
+ return F.interpolate(out, size=x.shape[-2:], mode="bilinear", align_corners=False)
170
+
171
+
172
+ def build_seg_model(backbone):
173
+ if backbone == "mamba":
174
+ return MambaSegModel()
175
+ return TimmSegModel(backbone)
176
+
177
+
178
+ def dice_loss(pred, target, eps=1e-7):
179
+ pred = torch.sigmoid(pred)
180
+ inter = (pred * target).sum(dim=(2, 3))
181
+ union = pred.sum(dim=(2, 3)) + target.sum(dim=(2, 3))
182
+ return 1 - (2 * inter + eps) / (union + eps)
183
+
184
+
185
+ def combined_loss(pred, target):
186
+ return 0.5 * F.binary_cross_entropy_with_logits(pred, target) + 0.5 * dice_loss(pred, target).mean()
187
+
188
+
189
+ @torch.no_grad()
190
+ def evaluate(model, loader, device):
191
+ model.eval()
192
+ all_dice = 0.0; all_iou = 0.0; n = 0
193
+ for x, m in loader:
194
+ x = x.to(device, non_blocking=True); m = m.to(device, non_blocking=True)
195
+ with torch.amp.autocast("cuda", dtype=torch.bfloat16):
196
+ logits = model(x)
197
+ pred = (torch.sigmoid(logits) > 0.5).float()
198
+ inter = (pred * m).sum(dim=(2, 3))
199
+ union = pred.sum(dim=(2, 3)) + m.sum(dim=(2, 3)) - inter
200
+ all_dice += ((2 * inter + 1e-7) / (union + inter + 1e-7)).mean().item()
201
+ all_iou += ((inter + 1e-7) / (union + 1e-7)).mean().item()
202
+ n += 1
203
+ return {"dice": all_dice / max(n, 1), "iou": all_iou / max(n, 1)}
204
+
205
+
206
+ def train_one(backbone, train_ds, val_ds, ckpt_path, device, rank, world, local_rank):
207
+ sampler = DistributedSampler(train_ds, num_replicas=world, rank=rank, shuffle=True, drop_last=True) if world > 1 \
208
+ else None
209
+ loader_kwargs = dict(batch_size=BATCH, num_workers=4, pin_memory=True, persistent_workers=True, drop_last=True)
210
+ if world > 1:
211
+ loader_kwargs["sampler"] = sampler
212
+ else:
213
+ loader_kwargs["shuffle"] = True
214
+ loader = DataLoader(train_ds, **loader_kwargs)
215
+ val_loader = DataLoader(val_ds, batch_size=BATCH, shuffle=False, num_workers=4,
216
+ pin_memory=True, persistent_workers=True) if is_main() else None
217
+
218
+ model = build_seg_model(backbone).to(device)
219
+ if world > 1:
220
+ model = DDP(model, device_ids=[local_rank], output_device=local_rank,
221
+ gradient_as_bucket_view=True, bucket_cap_mb=25,
222
+ find_unused_parameters=True)
223
+ opt = torch.optim.AdamW(model.parameters(), lr=LR, weight_decay=WD)
224
+ sched = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=EPOCHS)
225
+ best = -1.0; best_m = None; best_state = None; no_imp = 0; logs = []
226
+ for ep in range(EPOCHS):
227
+ if sampler is not None:
228
+ sampler.set_epoch(ep)
229
+ model.train(); tot = 0.0; nb = 0
230
+ for x, m in loader:
231
+ x = x.to(device, non_blocking=True); m = m.to(device, non_blocking=True)
232
+ opt.zero_grad(set_to_none=True)
233
+ with torch.amp.autocast("cuda", dtype=torch.bfloat16):
234
+ loss = combined_loss(model(x), m)
235
+ loss.backward(); opt.step()
236
+ tot += loss.item(); nb += 1
237
+ sched.step()
238
+ if is_main():
239
+ m = model.module if world > 1 else model
240
+ vm = evaluate(m, val_loader, device)
241
+ lg = {"epoch": ep, "train_loss": tot / max(nb, 1), "val_dice": vm["dice"], "val_iou": vm["iou"]}
242
+ logs.append(lg)
243
+ log(f" ep{ep}: loss={lg['train_loss']:.4f} dice={vm['dice']:.4f} iou={vm['iou']:.4f}")
244
+ if vm["dice"] > best:
245
+ best = vm["dice"]; best_m = vm
246
+ best_state = {k: v.cpu() for k, v in m.state_dict().items()}; no_imp = 0
247
+ else:
248
+ no_imp += 1
249
+ if world > 1:
250
+ flag = torch.tensor([no_imp if is_main() else 0, best if is_main() else 0.0], device=device)
251
+ dist.all_reduce(flag, op=dist.ReduceOp.MAX)
252
+ no_imp = int(flag[0].item()); best = float(flag[1].item())
253
+ if no_imp >= PATIENCE:
254
+ log(f" early stop ep{ep}"); break
255
+ if is_main() and best_state is not None:
256
+ torch.save(best_state, ckpt_path)
257
+ if world > 1:
258
+ dist.barrier()
259
+ return best_m, logs
260
+
261
+
262
+ def run_cv(backbone, resize, device, rank, world, local_rank):
263
+ D = get_dataset_module(resize)
264
+ models_dir, results_dir, logits_dir = get_paths(backbone, resize)
265
+
266
+ log(f"\n=== seg CV ({resize}): {backbone} ===")
267
+ splits = D.build_seg_splits()
268
+ train_rows = splits["train"]
269
+ full_tr = D.SegDataset(train_rows, train=True, size=SIZE)
270
+ full_va = D.SegDataset(train_rows, train=False, size=SIZE)
271
+ cvs = [r["f_cv"] for r in train_rows]
272
+ fold_metrics = []
273
+ for fold in range(5):
274
+ log(f"-- fold {fold} --")
275
+ set_seed(SEED)
276
+ tr_idx = [i for i, c in enumerate(cvs) if c != fold]
277
+ va_idx = [i for i, c in enumerate(cvs) if c == fold]
278
+ tr_ds = Subset(full_tr, tr_idx); va_ds = Subset(full_va, va_idx)
279
+ ckpt = models_dir / f"seg_{backbone}_fold{fold}.pt"
280
+ m, logs = train_one(backbone, tr_ds, va_ds, ckpt, device, rank, world, local_rank)
281
+ if is_main():
282
+ fold_metrics.append({"fold": fold, **m})
283
+ (results_dir / f"seg_{backbone}_fold{fold}_val.json").write_text(
284
+ json.dumps({"fold": fold, "metrics": m, "logs": logs}, indent=2))
285
+ log(f" fold{fold} dice={m['dice']:.4f}")
286
+ if is_main():
287
+ ds = [fm["dice"] for fm in fold_metrics]
288
+ summ = {"backbone": backbone, "resize": resize, "folds": fold_metrics,
289
+ "cv_dice_mean": float(np.mean(ds)), "cv_dice_std": float(np.std(ds)),
290
+ "cv_iou_mean": float(np.mean([fm["iou"] for fm in fold_metrics])),
291
+ "cv_iou_std": float(np.std([fm["iou"] for fm in fold_metrics]))}
292
+ (results_dir / f"seg_{backbone}_cv_summary.json").write_text(json.dumps(summ, indent=2))
293
+ log(f"CV: dice={summ['cv_dice_mean']:.4f}±{summ['cv_dice_std']:.4f}")
294
+ return summ if is_main() else None
295
+
296
+
297
+ def run_final(backbone, resize, device, rank, world, local_rank):
298
+ D = get_dataset_module(resize)
299
+ models_dir, results_dir, logits_dir = get_paths(backbone, resize)
300
+
301
+ log(f"\n=== seg FINAL ({resize}): {backbone} ===")
302
+ set_seed(SEED)
303
+ splits = D.build_seg_splits()
304
+ tr = D.SegDataset(splits["train"], train=True, size=SIZE)
305
+ va = D.SegDataset(splits["validation"], train=False, size=SIZE)
306
+ te = D.SegDataset(splits["test"], train=False, size=SIZE)
307
+ ckpt = models_dir / f"seg_{backbone}_final.pt"
308
+ m, logs = train_one(backbone, tr, va, ckpt, device, rank, world, local_rank)
309
+ if is_main():
310
+ model = build_seg_model(backbone).to(device)
311
+ model.load_state_dict(torch.load(ckpt, map_location=device))
312
+ tl = DataLoader(te, batch_size=BATCH, shuffle=False, num_workers=4, pin_memory=True)
313
+ tm = evaluate(model, tl, device)
314
+ res = {"backbone": backbone, "resize": resize, "val_metrics": m, "test_metrics": tm, "logs": logs}
315
+ (results_dir / f"seg_{backbone}_final.json").write_text(json.dumps(res, indent=2))
316
+ log(f"FINAL: val_dice={m['dice']:.4f} test_dice={tm['dice']:.4f} test_iou={tm['iou']:.4f}")
317
+ return res
318
+ return None
319
+
320
+
321
+ def main():
322
+ ap = argparse.ArgumentParser()
323
+ ap.add_argument("--backbone", choices=BACKBONES, required=True)
324
+ ap.add_argument("--resize", choices=["letterbox", "squeeze"], required=True)
325
+ ap.add_argument("--mode", choices=["cv", "final", "both"], default="both")
326
+ args = ap.parse_args()
327
+ rank, world, local = setup()
328
+ dev = torch.device("cuda", local) if torch.cuda.is_available() else torch.device("cpu")
329
+ log(f"world={world} backbone={args.backbone} resize={args.resize}")
330
+ try:
331
+ if args.mode in ("cv", "both"):
332
+ run_cv(args.backbone, args.resize, dev, rank, world, local)
333
+ if args.mode in ("final", "both"):
334
+ run_final(args.backbone, args.resize, dev, rank, world, local)
335
+ finally:
336
+ cleanup()
337
+
338
+
339
+ if __name__ == "__main__":
340
+ main()
stage1_final/verify_all.py ADDED
@@ -0,0 +1,566 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Comprehensive verification: load every checkpoint, run inference, compare
2
+ logits (.npz) and metrics (.json) with what the models actually produce.
3
+
4
+ Checks per (resize, backbone) combo:
5
+ 1. Plain OOF: load fold models → inference on fold val → compare with plain_{bb}_oof.npz slices
6
+ 2. Plain test: load final model → inference on test → compare logits + metrics with JSON
7
+ 3. cRT OOF: load fold cRT models → inference on fold val → compare with {bb}_oof.npz slices
8
+ 4. cRT test: load final cRT model → inference on test → compare logits + metrics with JSON
9
+ 5. Seg test: load final seg model → inference on test → compare dice/iou with JSON
10
+
11
+ Usage:
12
+ python verify_all.py
13
+ """
14
+ import json
15
+ import pathlib
16
+ import sys
17
+ import numpy as np
18
+ import torch
19
+ from torch.utils.data import DataLoader, Subset
20
+ from sklearn.metrics import (f1_score, accuracy_score, balanced_accuracy_score,
21
+ confusion_matrix)
22
+ import timm
23
+
24
+ ROOT = pathlib.Path(__file__).parent
25
+ sys.path.insert(0, str(ROOT))
26
+
27
+ NUM_CLASSES = 3
28
+ SIZE = 384
29
+ BATCH = 32
30
+ TOL = 1e-4 # float tolerance for logits comparison
31
+
32
+ BACKBONES = ["convnext", "swin", "mamba", "resnet"]
33
+ RESIZES = [("resized", "squeeze"), ("letterbox", "letterbox")]
34
+ NAMES = ["malignant", "non_malignant", "non_roi"]
35
+
36
+
37
+ def get_dataset_module(resize_dir):
38
+ if resize_dir == "letterbox":
39
+ import dataset_f as D
40
+ else:
41
+ import dataset_f_squeeze as D
42
+ return D
43
+
44
+
45
+ def build_cls_model(backbone):
46
+ if backbone == "convnext":
47
+ return timm.create_model("convnext_tiny", pretrained=False, num_classes=NUM_CLASSES, drop_rate=0.1)
48
+ if backbone == "swin":
49
+ return timm.create_model("swin_tiny_patch4_window7_224", pretrained=False, img_size=SIZE, num_classes=NUM_CLASSES, drop_rate=0.1)
50
+ if backbone == "resnet":
51
+ return timm.create_model("resnet50", pretrained=False, num_classes=NUM_CLASSES, drop_rate=0.1)
52
+ if backbone == "mamba":
53
+ from mambavision.models.mamba_vision import mamba_vision_T
54
+ return mamba_vision_T(pretrained=False, num_classes=NUM_CLASSES, drop_rate=0.1)
55
+ raise ValueError(backbone)
56
+
57
+
58
+ def compute_per_class_precision(true, pred):
59
+ true = np.asarray(true); pred = np.asarray(pred)
60
+ result = {}
61
+ for i, name in enumerate(NAMES):
62
+ tp = ((pred == i) & (true == i)).sum()
63
+ fp = ((pred == i) & (true != i)).sum()
64
+ result[name] = float(tp / max(tp + fp, 1))
65
+ return result
66
+
67
+
68
+ def compute_metrics(pred, true, src=None):
69
+ pred = np.asarray(pred); true = np.asarray(true)
70
+ m = {
71
+ "macro_f1": float(f1_score(true, pred, average="macro", labels=list(range(NUM_CLASSES)), zero_division=0)),
72
+ "accuracy": float(accuracy_score(true, pred)),
73
+ "balanced_acc": float(balanced_accuracy_score(true, pred)),
74
+ "per_class_recall": {NAMES[i]: float(((true == i) & (pred == i)).sum() / max((true == i).sum(), 1)) for i in range(NUM_CLASSES)},
75
+ "per_class_precision": compute_per_class_precision(true, pred),
76
+ }
77
+ if src is not None:
78
+ src = np.asarray(src)
79
+ for s in ["B", "C", "D"]:
80
+ mk = src == s
81
+ if mk.sum() > 0:
82
+ m[f"src_{s}_acc"] = float(accuracy_score(true[mk], pred[mk]))
83
+ m[f"src_{s}_n"] = int(mk.sum())
84
+ return m
85
+
86
+
87
+ def check_metrics_close(computed, saved, label, tol=1e-4):
88
+ """Compare computed metrics with saved JSON metrics. Returns list of mismatches."""
89
+ mismatches = []
90
+ for key in ["macro_f1", "accuracy", "balanced_acc"]:
91
+ if key in saved and key in computed:
92
+ if abs(computed[key] - saved[key]) > tol:
93
+ mismatches.append(f" {label}.{key}: computed={computed[key]:.6f} saved={saved[key]:.6f} DIFF={abs(computed[key]-saved[key]):.6f}")
94
+ for cls in NAMES:
95
+ if "per_class_recall" in saved and cls in saved["per_class_recall"]:
96
+ cv = computed["per_class_recall"][cls]
97
+ sv = saved["per_class_recall"][cls]
98
+ if abs(cv - sv) > tol:
99
+ mismatches.append(f" {label}.recall.{cls}: computed={cv:.6f} saved={sv:.6f}")
100
+ if "per_class_precision" in saved and cls in saved["per_class_precision"]:
101
+ cv = computed["per_class_precision"][cls]
102
+ sv = saved["per_class_precision"][cls]
103
+ if abs(cv - sv) > tol:
104
+ mismatches.append(f" {label}.precision.{cls}: computed={cv:.6f} saved={sv:.6f}")
105
+ return mismatches
106
+
107
+
108
+ @torch.no_grad()
109
+ def collect_logits(model, loader, device):
110
+ model.eval()
111
+ L, Y, S = [], [], []
112
+ for x, y, src, _img in loader:
113
+ x = x.to(device, non_blocking=True)
114
+ logits = model(x).float().cpu().numpy()
115
+ L.append(logits)
116
+ Y.append(y.numpy() if torch.is_tensor(y) else np.asarray(y))
117
+ S.append(np.asarray(src))
118
+ return (np.concatenate(L), np.concatenate(Y).astype(np.int64), np.concatenate(S).astype("<U8"))
119
+
120
+
121
+ # ---- Seg model building ----
122
+ import torch.nn as nn
123
+ import torch.nn.functional as F
124
+
125
+ class FPNDecoder(nn.Module):
126
+ def __init__(self, in_channels, hidden=128):
127
+ super().__init__()
128
+ self.laterals = nn.ModuleList([nn.Conv2d(c, hidden, 1) for c in in_channels])
129
+ self.smooths = nn.ModuleList([nn.Conv2d(hidden, hidden, 3, padding=1) for _ in in_channels])
130
+ self.head = nn.Sequential(nn.Conv2d(hidden, hidden, 3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(hidden, 1, 1))
131
+ def forward(self, feats):
132
+ lat = [l(f) for l, f in zip(self.laterals, feats)]
133
+ for i in range(len(lat) - 1, 0, -1):
134
+ lat[i - 1] = lat[i - 1] + F.interpolate(lat[i], size=lat[i - 1].shape[-2:], mode="nearest")
135
+ return self.head(self.smooths[0](lat[0]))
136
+
137
+ class TimmSegModel(nn.Module):
138
+ def __init__(self, backbone_name):
139
+ super().__init__()
140
+ if backbone_name == "convnext":
141
+ self.backbone = timm.create_model("convnext_tiny", pretrained=False, features_only=True, out_indices=(1, 2, 3))
142
+ elif backbone_name == "swin":
143
+ self.backbone = timm.create_model("swin_tiny_patch4_window7_224", pretrained=False, img_size=SIZE, features_only=True, out_indices=(1, 2, 3))
144
+ elif backbone_name == "resnet":
145
+ self.backbone = timm.create_model("resnet50", pretrained=False, features_only=True, out_indices=(1, 2, 3))
146
+ else:
147
+ raise ValueError(backbone_name)
148
+ with torch.no_grad():
149
+ outs = self.backbone(torch.randn(1, 3, SIZE, SIZE))
150
+ self._is_nhwc = []
151
+ chs = []
152
+ for o in outs:
153
+ if o.dim() == 4 and o.shape[1] != o.shape[-1]:
154
+ is_nhwc = o.shape[-1] > o.shape[1]
155
+ self._is_nhwc.append(is_nhwc)
156
+ chs.append(o.shape[-1] if is_nhwc else o.shape[1])
157
+ else:
158
+ self._is_nhwc.append(False)
159
+ chs.append(o.shape[1] if o.dim() == 4 else o.shape[-1])
160
+ self.decoder = FPNDecoder(chs)
161
+ def forward(self, x):
162
+ feats = self.backbone(x)
163
+ feats = [f.permute(0, 3, 1, 2) if (f.dim() == 4 and self._is_nhwc[i]) else f for i, f in enumerate(feats)]
164
+ out = self.decoder(feats)
165
+ return F.interpolate(out, size=x.shape[-2:], mode="bilinear", align_corners=False)
166
+
167
+ class MambaSegModel(nn.Module):
168
+ def __init__(self):
169
+ super().__init__()
170
+ from mambavision.models.mamba_vision import mamba_vision_T
171
+ self.net = mamba_vision_T(pretrained=False, num_classes=0, global_pool='')
172
+ self._feats = {}
173
+ self._hooks = []
174
+ levels = self.net.levels
175
+ self._idxs = [1, 2, 3]
176
+ for i in self._idxs:
177
+ hk = levels[i].register_forward_hook(self._mk_hook(i))
178
+ self._hooks.append(hk)
179
+ self.net.eval()
180
+ dev = torch.cuda.current_device() if torch.cuda.is_available() else "cpu"
181
+ self.net.to(dev)
182
+ with torch.no_grad():
183
+ self.net(torch.randn(1, 3, SIZE, SIZE, device=dev))
184
+ chs = []
185
+ for i in self._idxs:
186
+ f = self._feats[i]
187
+ chs.append(f.shape[1] if f.dim() == 4 else f.shape[-1])
188
+ self.decoder = FPNDecoder(chs)
189
+ def _mk_hook(self, i):
190
+ def hook(mod, inp, out):
191
+ self._feats[i] = out
192
+ return hook
193
+ def forward(self, x):
194
+ self._feats = {}
195
+ self.net(x)
196
+ feats = [self._feats[i] for i in self._idxs]
197
+ feats = [f if f.dim() == 4 else f.permute(0, 3, 1, 2) for f in feats]
198
+ out = self.decoder(feats)
199
+ return F.interpolate(out, size=x.shape[-2:], mode="bilinear", align_corners=False)
200
+
201
+ def build_seg_model(backbone):
202
+ if backbone == "mamba":
203
+ return MambaSegModel()
204
+ return TimmSegModel(backbone)
205
+
206
+
207
+ @torch.no_grad()
208
+ def eval_seg(model, loader, device):
209
+ model.eval()
210
+ all_dice = 0.0; all_iou = 0.0; n = 0
211
+ for x, m in loader:
212
+ x = x.to(device, non_blocking=True); m = m.to(device, non_blocking=True)
213
+ with torch.amp.autocast("cuda", dtype=torch.bfloat16):
214
+ logits = model(x)
215
+ pred = (torch.sigmoid(logits) > 0.5).float()
216
+ inter = (pred * m).sum(dim=(2, 3))
217
+ union = pred.sum(dim=(2, 3)) + m.sum(dim=(2, 3)) - inter
218
+ all_dice += ((2 * inter + 1e-7) / (union + inter + 1e-7)).mean().item()
219
+ all_iou += ((inter + 1e-7) / (union + 1e-7)).mean().item()
220
+ n += 1
221
+ return {"dice": all_dice / max(n, 1), "iou": all_iou / max(n, 1)}
222
+
223
+
224
+ def load_plain_model(backbone, ckpt_path, device):
225
+ model = build_cls_model(backbone).to(device)
226
+ state = torch.load(ckpt_path, map_location=device, weights_only=False)
227
+ model.load_state_dict(state)
228
+ model.eval()
229
+ return model
230
+
231
+
232
+ def load_crt_model(backbone, ckpt_path, device):
233
+ model = build_cls_model(backbone).to(device)
234
+ state = torch.load(ckpt_path, map_location=device, weights_only=False)
235
+ if isinstance(state, dict) and "full_state_dict" in state:
236
+ model.load_state_dict(state["full_state_dict"])
237
+ else:
238
+ model.load_state_dict(state)
239
+ model.eval()
240
+ return model
241
+
242
+
243
+ def verify_combo(resize_dir, resize_label, backbone, device, D):
244
+ """Verify one (resize, backbone) combo. Returns dict of results."""
245
+ models_dir = ROOT / "models" / resize_dir / backbone
246
+ results_dir = ROOT / "results" / resize_dir / backbone
247
+ logits_dir = ROOT / "logits" / resize_dir / backbone
248
+
249
+ tag = f"{resize_label}/{backbone}"
250
+ results = {"tag": tag, "checks": [], "pass": True}
251
+
252
+ # ---- 1. Plain OOF logits ----
253
+ print(f"\n[{tag}] Checking plain OOF logits...")
254
+ oof_path = logits_dir / f"plain_{backbone}_oof.npz"
255
+ if oof_path.exists():
256
+ z = np.load(oof_path, allow_pickle=True)
257
+ saved_oof = z["logits"]
258
+ cv_folds = z["cv_fold"]
259
+
260
+ base_val = D.FTarget3Dataset("train", fold=None, train=False, size=SIZE)
261
+ all_cv = base_val.ds["cv_fold"]
262
+
263
+ all_match = True
264
+ for fold in range(5):
265
+ ckpt = models_dir / f"target3_{backbone}_fold{fold}.pt"
266
+ if not ckpt.exists():
267
+ print(f" ⚠️ fold{fold} checkpoint missing")
268
+ results["checks"].append(("plain_oof_fold" + str(fold), "SKIP", "checkpoint missing"))
269
+ all_match = False
270
+ continue
271
+
272
+ model = load_plain_model(backbone, ckpt, device)
273
+ va_idx = [i for i, c in enumerate(all_cv) if c == fold]
274
+ va_sub = Subset(base_val, va_idx)
275
+ va_loader = DataLoader(va_sub, batch_size=BATCH, shuffle=False, num_workers=4, pin_memory=True)
276
+ logits, _, _ = collect_logits(model, va_loader, device)
277
+
278
+ saved_slice = saved_oof[va_idx]
279
+ match = np.allclose(logits, saved_slice, rtol=TOL, atol=TOL)
280
+ max_diff = np.max(np.abs(logits - saved_slice)) if not match else 0.0
281
+
282
+ status = "PASS" if match else "FAIL"
283
+ if not match:
284
+ all_match = False
285
+ results["pass"] = False
286
+ print(f" fold{fold}: {status}" + (f" (max_diff={max_diff:.6f})" if not match else ""))
287
+ results["checks"].append((f"plain_oof_fold{fold}", status, f"max_diff={max_diff:.6f}" if not match else ""))
288
+ del model; torch.cuda.empty_cache()
289
+
290
+ # Also verify OOF metrics match cv_summary
291
+ cv_summary_path = results_dir / f"target3_{backbone}_cv_summary.json"
292
+ if cv_summary_path.exists():
293
+ cv_summ = json.loads(cv_summary_path.read_text())
294
+ oof_pred = saved_oof.argmax(1)
295
+ oof_labels = z["labels"]
296
+ oof_src = z["source"]
297
+ # Compute pooled OOF metrics
298
+ pooled_m = compute_metrics(oof_pred, oof_labels, oof_src)
299
+ saved_pooled = None
300
+ # The cv_summary has per-fold metrics, not pooled — check per-fold
301
+ for fold_m in cv_summ.get("folds", []):
302
+ fold = fold_m["fold"]
303
+ va_idx = [i for i, c in enumerate(cv_folds) if c == fold]
304
+ fold_pred = oof_pred[va_idx]
305
+ fold_true = oof_labels[va_idx]
306
+ fold_src = oof_src[va_idx]
307
+ computed_m = compute_metrics(fold_pred, fold_true, fold_src)
308
+ mismatches = check_metrics_close(computed_m, fold_m, f"plain_oof_fold{fold}")
309
+ if mismatches:
310
+ all_match = False
311
+ results["pass"] = False
312
+ for mm in mismatches:
313
+ print(f" ❌ {mm}")
314
+ results["checks"].append((f"plain_oof_fold{fold}_metrics", "FAIL", "; ".join(mismatches)))
315
+ else:
316
+ results["checks"].append((f"plain_oof_fold{fold}_metrics", "PASS", ""))
317
+ else:
318
+ print(f" ⚠️ plain OOF npz missing")
319
+ results["checks"].append(("plain_oof", "SKIP", "npz missing"))
320
+ all_match = False
321
+
322
+ # ---- 2. Plain test logits + metrics ----
323
+ print(f"[{tag}] Checking plain test logits + metrics...")
324
+ test_logits_path = logits_dir / f"plain_{backbone}_test.npz"
325
+ final_ckpt = models_dir / f"target3_{backbone}_final.pt"
326
+ if test_logits_path.exists() and final_ckpt.exists():
327
+ z = np.load(test_logits_path, allow_pickle=True)
328
+ saved_logits = z["logits"]
329
+ saved_labels = z["labels"]
330
+ saved_src = z["source"]
331
+
332
+ model = load_plain_model(backbone, final_ckpt, device)
333
+ te = D.FTarget3Dataset("test", fold=None, train=False, size=SIZE)
334
+ te_loader = DataLoader(te, batch_size=BATCH, shuffle=False, num_workers=4, pin_memory=True)
335
+ logits, labels, srcs = collect_logits(model, te_loader, device)
336
+
337
+ # Compare logits
338
+ match = np.allclose(logits, saved_logits, rtol=TOL, atol=TOL)
339
+ max_diff = np.max(np.abs(logits - saved_logits)) if not match else 0.0
340
+ status = "PASS" if match else "FAIL"
341
+ if not match:
342
+ results["pass"] = False
343
+ print(f" logits: {status}" + (f" (max_diff={max_diff:.6f})" if not match else ""))
344
+ results["checks"].append(("plain_test_logits", status, f"max_diff={max_diff:.6f}" if not match else ""))
345
+
346
+ # Compare labels
347
+ labels_match = np.array_equal(labels, saved_labels)
348
+ if not labels_match:
349
+ print(f" ❌ labels mismatch!")
350
+ results["pass"] = False
351
+ results["checks"].append(("plain_test_labels", "PASS" if labels_match else "FAIL", ""))
352
+
353
+ # Compare metrics with JSON
354
+ final_json_path = results_dir / f"target3_{backbone}_final.json"
355
+ if final_json_path.exists():
356
+ saved_final = json.loads(final_json_path.read_text())
357
+ test_metrics = saved_final.get("test_metrics", saved_final)
358
+ computed_m = compute_metrics(logits.argmax(1), labels, srcs)
359
+ mismatches = check_metrics_close(computed_m, test_metrics, "plain_test")
360
+ if mismatches:
361
+ results["pass"] = False
362
+ for mm in mismatches:
363
+ print(f" ❌ {mm}")
364
+ results["checks"].append(("plain_test_metrics", "FAIL", "; ".join(mismatches)))
365
+ else:
366
+ print(f" metrics: PASS")
367
+ results["checks"].append(("plain_test_metrics", "PASS", ""))
368
+
369
+ del model; torch.cuda.empty_cache()
370
+ else:
371
+ missing = "logits" if not test_logits_path.exists() else "checkpoint"
372
+ print(f" ⚠️ {missing} missing")
373
+ results["checks"].append(("plain_test", "SKIP", f"{missing} missing"))
374
+
375
+ # ---- 3. cRT OOF logits ----
376
+ print(f"[{tag}] Checking cRT OOF logits...")
377
+ crt_oof_path = logits_dir / f"{backbone}_oof.npz"
378
+ if crt_oof_path.exists():
379
+ z = np.load(crt_oof_path, allow_pickle=True)
380
+ saved_oof = z["logits"]
381
+ cv_folds = z["cv_fold"]
382
+
383
+ base_val = D.FTarget3Dataset("train", fold=None, train=False, size=SIZE)
384
+ all_cv = base_val.ds["cv_fold"]
385
+
386
+ for fold in range(5):
387
+ ckpt = models_dir / f"crt_{backbone}_fold{fold}.pt"
388
+ if not ckpt.exists():
389
+ print(f" ⚠️ cRT fold{fold} checkpoint missing")
390
+ results["checks"].append((f"crt_oof_fold{fold}", "SKIP", "checkpoint missing"))
391
+ continue
392
+
393
+ model = load_crt_model(backbone, ckpt, device)
394
+ va_idx = [i for i, c in enumerate(all_cv) if c == fold]
395
+ va_sub = Subset(base_val, va_idx)
396
+ va_loader = DataLoader(va_sub, batch_size=BATCH, shuffle=False, num_workers=4, pin_memory=True)
397
+ logits, _, _ = collect_logits(model, va_loader, device)
398
+
399
+ saved_slice = saved_oof[va_idx]
400
+ match = np.allclose(logits, saved_slice, rtol=TOL, atol=TOL)
401
+ max_diff = np.max(np.abs(logits - saved_slice)) if not match else 0.0
402
+
403
+ status = "PASS" if match else "FAIL"
404
+ if not match:
405
+ results["pass"] = False
406
+ print(f" cRT fold{fold}: {status}" + (f" (max_diff={max_diff:.6f})" if not match else ""))
407
+ results["checks"].append((f"crt_oof_fold{fold}", status, f"max_diff={max_diff:.6f}" if not match else ""))
408
+ del model; torch.cuda.empty_cache()
409
+
410
+ # Verify cRT CV summary metrics
411
+ crt_cv_path = results_dir / f"crt_{backbone}_cv_summary.json"
412
+ if crt_cv_path.exists():
413
+ cv_summ = json.loads(crt_cv_path.read_text())
414
+ oof_pred = saved_oof.argmax(1)
415
+ oof_labels = z["labels"]
416
+ oof_src = z["source"]
417
+ for fold_m in cv_summ.get("folds", []):
418
+ fold = fold_m["fold"]
419
+ va_idx = [i for i, c in enumerate(cv_folds) if c == fold]
420
+ fold_pred = oof_pred[va_idx]
421
+ fold_true = oof_labels[va_idx]
422
+ fold_src = oof_src[va_idx]
423
+ computed_m = compute_metrics(fold_pred, fold_true, fold_src)
424
+ mismatches = check_metrics_close(computed_m, fold_m, f"crt_oof_fold{fold}")
425
+ if mismatches:
426
+ results["pass"] = False
427
+ for mm in mismatches:
428
+ print(f" ❌ {mm}")
429
+ results["checks"].append((f"crt_oof_fold{fold}_metrics", "FAIL", "; ".join(mismatches)))
430
+ else:
431
+ results["checks"].append((f"crt_oof_fold{fold}_metrics", "PASS", ""))
432
+ else:
433
+ print(f" ⚠️ cRT OOF npz missing")
434
+ results["checks"].append(("crt_oof", "SKIP", "npz missing"))
435
+
436
+ # ---- 4. cRT test logits + metrics ----
437
+ print(f"[{tag}] Checking cRT test logits + metrics...")
438
+ crt_test_path = logits_dir / f"{backbone}_test.npz"
439
+ crt_final_ckpt = models_dir / f"crt_{backbone}_final.pt"
440
+ if crt_test_path.exists() and crt_final_ckpt.exists():
441
+ z = np.load(crt_test_path, allow_pickle=True)
442
+ saved_logits = z["logits"]
443
+ saved_labels = z["labels"]
444
+ saved_src = z["source"]
445
+
446
+ model = load_crt_model(backbone, crt_final_ckpt, device)
447
+ te = D.FTarget3Dataset("test", fold=None, train=False, size=SIZE)
448
+ te_loader = DataLoader(te, batch_size=BATCH, shuffle=False, num_workers=4, pin_memory=True)
449
+ logits, labels, srcs = collect_logits(model, te_loader, device)
450
+
451
+ # Compare logits
452
+ match = np.allclose(logits, saved_logits, rtol=TOL, atol=TOL)
453
+ max_diff = np.max(np.abs(logits - saved_logits)) if not match else 0.0
454
+ status = "PASS" if match else "FAIL"
455
+ if not match:
456
+ results["pass"] = False
457
+ print(f" cRT logits: {status}" + (f" (max_diff={max_diff:.6f})" if not match else ""))
458
+ results["checks"].append(("crt_test_logits", status, f"max_diff={max_diff:.6f}" if not match else ""))
459
+
460
+ # Compare labels
461
+ labels_match = np.array_equal(labels, saved_labels)
462
+ if not labels_match:
463
+ print(f" ❌ cRT labels mismatch!")
464
+ results["pass"] = False
465
+ results["checks"].append(("crt_test_labels", "PASS" if labels_match else "FAIL", ""))
466
+
467
+ # Compare metrics with JSON
468
+ crt_final_json = results_dir / f"crt_{backbone}_final.json"
469
+ if crt_final_json.exists():
470
+ saved_final = json.loads(crt_final_json.read_text())
471
+ test_metrics = saved_final.get("test_metrics", saved_final)
472
+ computed_m = compute_metrics(logits.argmax(1), labels, srcs)
473
+ mismatches = check_metrics_close(computed_m, test_metrics, "crt_test")
474
+ if mismatches:
475
+ results["pass"] = False
476
+ for mm in mismatches:
477
+ print(f" ❌ {mm}")
478
+ results["checks"].append(("crt_test_metrics", "FAIL", "; ".join(mismatches)))
479
+ else:
480
+ print(f" cRT metrics: PASS")
481
+ results["checks"].append(("crt_test_metrics", "PASS", ""))
482
+
483
+ del model; torch.cuda.empty_cache()
484
+ else:
485
+ missing = "logits" if not crt_test_path.exists() else "checkpoint"
486
+ print(f" ⚠️ cRT {missing} missing")
487
+ results["checks"].append(("crt_test", "SKIP", f"{missing} missing"))
488
+
489
+ # ---- 5. Seg test metrics ----
490
+ print(f"[{tag}] Checking seg test metrics...")
491
+ seg_final_ckpt = models_dir / f"seg_{backbone}_final.pt"
492
+ seg_final_json = results_dir / f"seg_{backbone}_final.json"
493
+ if seg_final_ckpt.exists() and seg_final_json.exists():
494
+ saved_seg = json.loads(seg_final_json.read_text())
495
+ saved_test = saved_seg.get("test_metrics", {})
496
+
497
+ model = build_seg_model(backbone).to(device)
498
+ state = torch.load(seg_final_ckpt, map_location=device, weights_only=False)
499
+ model.load_state_dict(state)
500
+ model.eval()
501
+
502
+ splits = D.build_seg_splits()
503
+ te = D.SegDataset(splits["test"], train=False, size=SIZE)
504
+ te_loader = DataLoader(te, batch_size=16, shuffle=False, num_workers=4, pin_memory=True)
505
+ computed_seg = eval_seg(model, te_loader, device)
506
+
507
+ dice_match = abs(computed_seg["dice"] - saved_test.get("dice", 0)) < 1e-4
508
+ iou_match = abs(computed_seg["iou"] - saved_test.get("iou", 0)) < 1e-4
509
+
510
+ status = "PASS" if dice_match and iou_match else "FAIL"
511
+ if not dice_match or not iou_match:
512
+ results["pass"] = False
513
+ print(f" dice: {status} (computed={computed_seg['dice']:.6f} saved={saved_test.get('dice',0):.6f} diff={abs(computed_seg['dice']-saved_test.get('dice',0)):.6f})")
514
+ print(f" iou: {'PASS' if iou_match else 'FAIL'} (computed={computed_seg['iou']:.6f} saved={saved_test.get('iou',0):.6f} diff={abs(computed_seg['iou']-saved_test.get('iou',0)):.6f})")
515
+ results["checks"].append(("seg_test", status, f"dice_diff={abs(computed_seg['dice']-saved_test.get('dice',0)):.6f} iou_diff={abs(computed_seg['iou']-saved_test.get('iou',0)):.6f}"))
516
+
517
+ del model; torch.cuda.empty_cache()
518
+ else:
519
+ missing = "checkpoint" if not seg_final_ckpt.exists() else "json"
520
+ print(f" ⚠️ seg {missing} missing")
521
+ results["checks"].append(("seg_test", "SKIP", f"{missing} missing"))
522
+
523
+ return results
524
+
525
+
526
+ def main():
527
+ device = torch.device("cuda")
528
+ all_results = []
529
+
530
+ for resize_dir, resize_label in RESIZES:
531
+ D = get_dataset_module(resize_dir)
532
+ for backbone in BACKBONES:
533
+ print(f"\n{'='*60}")
534
+ print(f"Verifying: {resize_label}/{backbone}")
535
+ print(f"{'='*60}")
536
+ r = verify_combo(resize_dir, resize_label, backbone, device, D)
537
+ all_results.append(r)
538
+
539
+ # Final summary
540
+ print(f"\n{'='*60}")
541
+ print(f"FINAL VERIFICATION SUMMARY")
542
+ print(f"{'='*60}")
543
+ total_pass = 0
544
+ total_fail = 0
545
+ total_skip = 0
546
+ for r in all_results:
547
+ tag = r["tag"]
548
+ passes = [c for c in r["checks"] if c[1] == "PASS"]
549
+ fails = [c for c in r["checks"] if c[1] == "FAIL"]
550
+ skips = [c for c in r["checks"] if c[1] == "SKIP"]
551
+ total_pass += len(passes)
552
+ total_fail += len(fails)
553
+ total_skip += len(skips)
554
+ status = "✅ PASS" if r["pass"] else "❌ FAIL"
555
+ print(f" {tag:25s}: {status} ({len(passes)} pass, {len(fails)} fail, {len(skips)} skip)")
556
+ for c in r["checks"]:
557
+ if c[1] == "FAIL":
558
+ print(f" ❌ {c[0]}: {c[2]}")
559
+
560
+ print(f"\n Total: {total_pass} pass, {total_fail} fail, {total_skip} skip")
561
+ overall = "✅ ALL VERIFIED" if total_fail == 0 else f"❌ {total_fail} FAILURES"
562
+ print(f" {overall}")
563
+
564
+
565
+ if __name__ == "__main__":
566
+ main()
stage1v2_final/check_progress.sh ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # Check if stage1v2_final training is still running and report progress
3
+ RUN_PID=$(pgrep -f "run_all.sh" 2>/dev/null | head -1)
4
+ TRAIN_PID=$(pgrep -f "stage1v2_final/train_cls\|stage1v2_final/train_crt\|stage1v2_final/ensemble" 2>/dev/null | head -1)
5
+
6
+ if [ -z "$RUN_PID" ] && [ -z "$TRAIN_PID" ]; then
7
+ echo "TRAINING_COMPLETE"
8
+ echo "Backbones with final results:"
9
+ for bb in convnext swin mamba resnet; do
10
+ f="/home/kccitadmin/jupyterlab/sandbox/stage1v2_final/results/letterbox/${bb}/target3_${bb}_final.json"
11
+ if [ -f "$f" ]; then echo " ✓ $bb plain"; else echo " ✗ $bb plain"; fi
12
+ f="/home/kccitadmin/jupyterlab/sandbox/stage1v2_final/results/letterbox/${bb}/crt_${bb}_final.json"
13
+ if [ -f "$f" ]; then echo " ✓ $bb cRT"; else echo " ✗ $bb cRT"; fi
14
+ done
15
+ echo "Ensemble results:"
16
+ ls /home/kccitadmin/jupyterlab/sandbox/stage1v2_final/results/letterbox/ensemble_*.json 2>/dev/null || echo " none"
17
+ else
18
+ echo "RUNNING"
19
+ echo "run_all PID: ${RUN_PID:-none}, train PID: ${TRAIN_PID:-none}"
20
+ tail -10 /home/kccitadmin/jupyterlab/sandbox/stage1v2_final/stage1v2_run.log 2>/dev/null
21
+ fi
stage1v2_final/dataset_f.py ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Dataset F utilities — letterbox (aspect-ratio-preserving, zero-pad 384×384).
2
+
3
+ Images are letterboxed to (size, size) with zero-padding instead of squeezed.
4
+ This preserves aspect ratio and avoids spatial distortion.
5
+
6
+ Supports: ConvNeXt-Tiny, Swin-Tiny, MambaVision-T, ResNet-50.
7
+ """
8
+ import pathlib
9
+ import numpy as np
10
+ import torch
11
+ from torch.utils.data import Dataset
12
+ from PIL import Image, ImageDraw
13
+ from torchvision import transforms as T
14
+ from torchvision.transforms import InterpolationMode
15
+ from datasets import load_from_disk, load_dataset
16
+
17
+ ROOT = pathlib.Path(__file__).parent
18
+ F_HF = pathlib.Path("/home/kccitadmin/jupyterlab/sandbox/datasets/F1_hf_dataset")
19
+ F_PARQUET = pathlib.Path("/home/kccitadmin/jupyterlab/sandbox/datasets/reports/F_prepared.parquet")
20
+
21
+ TARGET3_NAMES = ["malignant", "non_malignant", "non_roi"]
22
+ IMAGING_NAMES = ["WLI", "NBI", "BLC"]
23
+ SOURCE_NAMES = ["B", "C", "D"]
24
+
25
+ IMAGENET_MEAN = [0.485, 0.456, 0.406]
26
+ IMAGENET_STD = [0.229, 0.224, 0.225]
27
+
28
+
29
+ def letterbox(img, size=384):
30
+ """Resize preserving aspect ratio, then pad to (size, size) with zeros."""
31
+ w, h = img.size
32
+ scale = size / max(w, h)
33
+ new_w, new_h = int(round(w * scale)), int(round(h * scale))
34
+ new_w = max(new_w, 1)
35
+ new_h = max(new_h, 1)
36
+ img = img.resize((new_w, new_h), Image.BICUBIC)
37
+ padded = Image.new("RGB", (size, size), (0, 0, 0))
38
+ padded.paste(img, ((size - new_w) // 2, (size - new_h) // 2))
39
+ return padded
40
+
41
+
42
+ def letterbox_mask(mask_img, size=384):
43
+ """Same letterbox for masks — uses NEAREST interpolation."""
44
+ w, h = mask_img.size
45
+ scale = size / max(w, h)
46
+ new_w, new_h = int(round(w * scale)), int(round(h * scale))
47
+ new_w = max(new_w, 1)
48
+ new_h = max(new_h, 1)
49
+ mask_img = mask_img.resize((new_w, new_h), Image.NEAREST)
50
+ padded = Image.new("L", (size, size), 0)
51
+ padded.paste(mask_img, ((size - new_w) // 2, (size - new_h) // 2))
52
+ return padded
53
+
54
+
55
+ def get_cls_train_transforms(size=384):
56
+ return T.Compose([
57
+ T.Lambda(lambda img: letterbox(img, size)),
58
+ T.RandomHorizontalFlip(p=0.5),
59
+ T.RandomVerticalFlip(p=0.5),
60
+ T.RandomRotation(degrees=10),
61
+ T.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.05),
62
+ T.ToTensor(),
63
+ T.Normalize(mean=IMAGENET_MEAN, std=IMAGENET_STD),
64
+ ])
65
+
66
+
67
+ def get_cls_val_transforms(size=384):
68
+ return T.Compose([
69
+ T.Lambda(lambda img: letterbox(img, size)),
70
+ T.ToTensor(),
71
+ T.Normalize(mean=IMAGENET_MEAN, std=IMAGENET_STD),
72
+ ])
73
+
74
+
75
+ class SegPairTransform:
76
+ """Letterbox both image and mask, preserving aspect ratio."""
77
+ def __init__(self, size=384, train=True):
78
+ self.size = size
79
+ self.train = train
80
+
81
+ def __call__(self, image, mask):
82
+ image = letterbox(image, self.size)
83
+ mask = letterbox_mask(mask, self.size)
84
+ if self.train:
85
+ if np.random.rand() < 0.5:
86
+ image = image.transpose(Image.FLIP_LEFT_RIGHT)
87
+ mask = mask.transpose(Image.FLIP_LEFT_RIGHT)
88
+ if np.random.rand() < 0.5:
89
+ image = image.transpose(Image.FLIP_TOP_BOTTOM)
90
+ mask = mask.transpose(Image.FLIP_TOP_BOTTOM)
91
+ angle = np.random.uniform(-10, 10)
92
+ image = image.rotate(angle, resample=Image.BICUBIC, fillcolor=0)
93
+ mask = mask.rotate(angle, resample=Image.NEAREST, fillcolor=0)
94
+ image = T.ToTensor()(image)
95
+ image = T.Normalize(mean=IMAGENET_MEAN, std=IMAGENET_STD)(image)
96
+ mask = torch.from_numpy(np.array(mask, dtype=np.float32)).unsqueeze(0)
97
+ return image, mask
98
+
99
+
100
+ def rasterize_mask(seg_struct, w, h):
101
+ mask = Image.new("L", (w, h), 0)
102
+ draw = ImageDraw.Draw(mask)
103
+ if seg_struct is not None:
104
+ for lbl, pts in zip(seg_struct["label"], seg_struct["points"]):
105
+ if lbl in ("Tumor", "Flat Tumor"):
106
+ poly = [(float(p[0]), float(p[1])) for p in pts]
107
+ if len(poly) >= 3:
108
+ draw.polygon(poly, fill=1)
109
+ return np.array(mask, dtype=np.float32)
110
+
111
+
112
+ class FTarget3Dataset(Dataset):
113
+ """target3 classification on dataset F. Letterboxed, aspect-ratio-preserving."""
114
+ def __init__(self, split, fold=None, train=True, size=384):
115
+ # F1 dataset uses "val" instead of "validation"
116
+ _split = "val" if split == "validation" else split
117
+ self.ds = load_from_disk(str(F_HF))[_split]
118
+ self.fold = fold
119
+ self.train = train
120
+ self.size = size
121
+ self.tf = get_cls_train_transforms(size) if train else get_cls_val_transforms(size)
122
+ all_cv = self.ds["cv_fold"]
123
+ all_t3 = self.ds["target3"]
124
+ all_src = self.ds["source_dataset"]
125
+ if fold is not None:
126
+ assert split == "train"
127
+ self.indices = [i for i, c in enumerate(all_cv) if c == fold]
128
+ else:
129
+ self.indices = list(range(len(self.ds)))
130
+ self._labels = [all_t3[i] for i in self.indices]
131
+ self._sources = [all_src[i] for i in self.indices]
132
+
133
+ def __len__(self):
134
+ return len(self.indices)
135
+
136
+ def get_label(self, idx):
137
+ return self._labels[idx]
138
+
139
+ def all_labels(self):
140
+ return list(self._labels)
141
+
142
+ def __getitem__(self, idx):
143
+ r = self.ds[self.indices[idx]]
144
+ img = r["image"].convert("RGB")
145
+ x = self.tf(img)
146
+ return x, r["target3"], r.get("source_dataset", ""), r.get("imaging_type", -1)
147
+
148
+
149
+ # ---------- Segmentation (milkyroad/C malignant images, mapped to F split) ----------
150
+
151
+ def _build_fn_to_f_map():
152
+ import pandas as pd
153
+ f = pd.read_parquet(F_PARQUET)
154
+ return dict(zip(f["original_filename"], zip(f["split"], f["cv_fold"])))
155
+
156
+
157
+ def load_seg_rows():
158
+ """Return list of seg rows: {filename, pid, image, segmentation, f_split, f_cv}."""
159
+ c_ds = load_dataset("milkyroad/C", split="train")
160
+ fn_map = _build_fn_to_f_map()
161
+ rows = []
162
+ for r in c_ds:
163
+ if r["has_segmentation"] == 1 and r["class"] == "Malignant":
164
+ fn = r["filename"]
165
+ if fn not in fn_map:
166
+ continue
167
+ split, cv = fn_map[fn]
168
+ rows.append({
169
+ "filename": fn, "pid": r["pid"], "image": r["image"],
170
+ "segmentation": r["segmentation"], "f_split": split, "f_cv": int(cv),
171
+ })
172
+ return rows
173
+
174
+
175
+ class SegDataset(Dataset):
176
+ def __init__(self, rows, train=True, size=384):
177
+ self.rows = rows
178
+ self.train = train
179
+ self.tf = SegPairTransform(size=size, train=train)
180
+
181
+ def __len__(self):
182
+ return len(self.rows)
183
+
184
+ def __getitem__(self, idx):
185
+ r = self.rows[idx]
186
+ img = r["image"].convert("RGB")
187
+ w, h = img.size
188
+ mask_arr = rasterize_mask(r["segmentation"], w, h)
189
+ mask = Image.fromarray(mask_arr.astype(np.uint8), mode="L")
190
+ x, m = self.tf(img, mask)
191
+ return x, m
192
+
193
+
194
+ def build_seg_splits():
195
+ rows = load_seg_rows()
196
+ splits = {"train": [], "validation": [], "test": []}
197
+ for r in rows:
198
+ s = r["f_split"]
199
+ if s == "val":
200
+ s = "validation"
201
+ splits[s].append(r)
202
+ return splits
stage1v2_final/dataset_f_squeeze.py ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Dataset F utilities — squeeze (T.Resize((384,384)), aspect-ratio distorted).
2
+
3
+ Images are squeezed to (size, size) directly, which distorts aspect ratio.
4
+ This is the original v4 approach.
5
+
6
+ Supports: ConvNeXt-Tiny, Swin-Tiny, MambaVision-T, ResNet-50.
7
+ """
8
+ import pathlib
9
+ import numpy as np
10
+ import torch
11
+ from torch.utils.data import Dataset
12
+ from PIL import Image, ImageDraw
13
+ from torchvision import transforms as T
14
+ from torchvision.transforms import InterpolationMode
15
+ from datasets import load_from_disk, load_dataset
16
+
17
+ ROOT = pathlib.Path(__file__).parent
18
+ F_HF = pathlib.Path("/home/kccitadmin/jupyterlab/sandbox/datasets/F1_hf_dataset")
19
+ F_PARQUET = pathlib.Path("/home/kccitadmin/jupyterlab/sandbox/datasets/reports/F_prepared.parquet")
20
+
21
+ TARGET3_NAMES = ["malignant", "non_malignant", "non_roi"]
22
+ IMAGING_NAMES = ["WLI", "NBI", "BLC"]
23
+ SOURCE_NAMES = ["B", "C", "D"]
24
+
25
+ IMAGENET_MEAN = [0.485, 0.456, 0.406]
26
+ IMAGENET_STD = [0.229, 0.224, 0.225]
27
+
28
+
29
+ def get_cls_train_transforms(size=384):
30
+ return T.Compose([
31
+ T.Resize((size, size), interpolation=InterpolationMode.BICUBIC),
32
+ T.RandomHorizontalFlip(p=0.5),
33
+ T.RandomVerticalFlip(p=0.5),
34
+ T.RandomRotation(degrees=10),
35
+ T.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.05),
36
+ T.ToTensor(),
37
+ T.Normalize(mean=IMAGENET_MEAN, std=IMAGENET_STD),
38
+ ])
39
+
40
+
41
+ def get_cls_val_transforms(size=384):
42
+ return T.Compose([
43
+ T.Resize((size, size), interpolation=InterpolationMode.BICUBIC),
44
+ T.ToTensor(),
45
+ T.Normalize(mean=IMAGENET_MEAN, std=IMAGENET_STD),
46
+ ])
47
+
48
+
49
+ class SegPairTransform:
50
+ def __init__(self, size=384, train=True):
51
+ self.size = size
52
+ self.train = train
53
+
54
+ def __call__(self, image, mask):
55
+ image = image.resize((self.size, self.size), Image.BICUBIC)
56
+ mask = mask.resize((self.size, self.size), Image.NEAREST)
57
+ if self.train:
58
+ if np.random.rand() < 0.5:
59
+ image = image.transpose(Image.FLIP_LEFT_RIGHT)
60
+ mask = mask.transpose(Image.FLIP_LEFT_RIGHT)
61
+ if np.random.rand() < 0.5:
62
+ image = image.transpose(Image.FLIP_TOP_BOTTOM)
63
+ mask = mask.transpose(Image.FLIP_TOP_BOTTOM)
64
+ angle = np.random.uniform(-10, 10)
65
+ image = image.rotate(angle, resample=Image.BICUBIC, fillcolor=0)
66
+ mask = mask.rotate(angle, resample=Image.NEAREST, fillcolor=0)
67
+ image = T.ToTensor()(image)
68
+ image = T.Normalize(mean=IMAGENET_MEAN, std=IMAGENET_STD)(image)
69
+ mask = torch.from_numpy(np.array(mask, dtype=np.float32)).unsqueeze(0)
70
+ return image, mask
71
+
72
+
73
+ def rasterize_mask(seg_struct, w, h):
74
+ mask = Image.new("L", (w, h), 0)
75
+ draw = ImageDraw.Draw(mask)
76
+ if seg_struct is not None:
77
+ for lbl, pts in zip(seg_struct["label"], seg_struct["points"]):
78
+ if lbl in ("Tumor", "Flat Tumor"):
79
+ poly = [(float(p[0]), float(p[1])) for p in pts]
80
+ if len(poly) >= 3:
81
+ draw.polygon(poly, fill=1)
82
+ return np.array(mask, dtype=np.float32)
83
+
84
+
85
+ class FTarget3Dataset(Dataset):
86
+ """target3 classification on dataset F. Squeezed to (size, size)."""
87
+ def __init__(self, split, fold=None, train=True, size=384):
88
+ # F1 dataset uses "val" instead of "validation"
89
+ _split = "val" if split == "validation" else split
90
+ self.ds = load_from_disk(str(F_HF))[_split]
91
+ self.fold = fold
92
+ self.train = train
93
+ self.size = size
94
+ self.tf = get_cls_train_transforms(size) if train else get_cls_val_transforms(size)
95
+ all_cv = self.ds["cv_fold"]
96
+ all_t3 = self.ds["target3"]
97
+ all_src = self.ds["source_dataset"]
98
+ if fold is not None:
99
+ assert split == "train"
100
+ self.indices = [i for i, c in enumerate(all_cv) if c == fold]
101
+ else:
102
+ self.indices = list(range(len(self.ds)))
103
+ self._labels = [all_t3[i] for i in self.indices]
104
+ self._sources = [all_src[i] for i in self.indices]
105
+
106
+ def __len__(self):
107
+ return len(self.indices)
108
+
109
+ def get_label(self, idx):
110
+ return self._labels[idx]
111
+
112
+ def all_labels(self):
113
+ return list(self._labels)
114
+
115
+ def __getitem__(self, idx):
116
+ r = self.ds[self.indices[idx]]
117
+ img = r["image"].convert("RGB")
118
+ x = self.tf(img)
119
+ return x, r["target3"], r.get("source_dataset", ""), r.get("imaging_type", -1)
120
+
121
+
122
+ # ---------- Segmentation (milkyroad/C malignant, mapped to F split) ----------
123
+
124
+ def _build_fn_to_f_map():
125
+ import pandas as pd
126
+ f = pd.read_parquet(F_PARQUET)
127
+ return dict(zip(f["original_filename"], zip(f["split"], f["cv_fold"])))
128
+
129
+
130
+ def load_seg_rows():
131
+ """Return list of seg rows: {filename, pid, image, segmentation, f_split, f_cv}."""
132
+ c_ds = load_dataset("milkyroad/C", split="train")
133
+ fn_map = _build_fn_to_f_map()
134
+ rows = []
135
+ for r in c_ds:
136
+ if r["has_segmentation"] == 1 and r["class"] == "Malignant":
137
+ fn = r["filename"]
138
+ if fn not in fn_map:
139
+ continue
140
+ split, cv = fn_map[fn]
141
+ rows.append({
142
+ "filename": fn, "pid": r["pid"], "image": r["image"],
143
+ "segmentation": r["segmentation"], "f_split": split, "f_cv": int(cv),
144
+ })
145
+ return rows
146
+
147
+
148
+ class SegDataset(Dataset):
149
+ def __init__(self, rows, train=True, size=384):
150
+ self.rows = rows
151
+ self.train = train
152
+ self.tf = SegPairTransform(size=size, train=train)
153
+
154
+ def __len__(self):
155
+ return len(self.rows)
156
+
157
+ def __getitem__(self, idx):
158
+ r = self.rows[idx]
159
+ img = r["image"].convert("RGB")
160
+ w, h = img.size
161
+ mask_arr = rasterize_mask(r["segmentation"], w, h)
162
+ mask = Image.fromarray(mask_arr.astype(np.uint8), mode="L")
163
+ x, m = self.tf(img, mask)
164
+ return x, m
165
+
166
+
167
+ def build_seg_splits():
168
+ rows = load_seg_rows()
169
+ splits = {"train": [], "validation": [], "test": []}
170
+ for r in rows:
171
+ s = r["f_split"]
172
+ if s == "val":
173
+ s = "validation"
174
+ splits[s].append(r)
175
+ return splits
stage1v2_final/ensemble.py ADDED
@@ -0,0 +1,295 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Stage 1 v1 final: 4-model ensemble stacking (convnext, swin, mamba, resnet).
2
+
3
+ Both cRT and plain ensembles. 3 combiner methods:
4
+ A. logreg_logits_balanced — LogReg on 12-dim raw logits (4 backbones × 3 classes)
5
+ B. logreg_softmax_balanced — LogReg on 12-dim softmax probabilities
6
+ C. avg_softmax — simple softmax-probability averaging
7
+
8
+ Best method selected by pooled OOF macro-F1, then applied to test.
9
+
10
+ Usage:
11
+ python ensemble.py --resize letterbox
12
+ python ensemble.py --resize squeeze
13
+ """
14
+ import argparse
15
+ import json
16
+ import pathlib
17
+ import sys
18
+ import numpy as np
19
+ from scipy.special import softmax
20
+ from sklearn.linear_model import LogisticRegression
21
+ from sklearn.preprocessing import StandardScaler
22
+ from sklearn.metrics import (f1_score, accuracy_score, balanced_accuracy_score,
23
+ confusion_matrix, classification_report)
24
+
25
+ ROOT = pathlib.Path(__file__).parent
26
+ sys.path.insert(0, str(ROOT))
27
+
28
+ BACKBONES = ["convnext", "swin", "mamba", "resnet"]
29
+ NUM_CLASSES = 3
30
+ SEED = 17
31
+ METHODS = ["logreg_logits_balanced", "logreg_softmax_balanced", "avg_softmax"]
32
+
33
+
34
+ def get_paths(resize):
35
+ return ROOT / "logits" / resize, ROOT / "results" / resize
36
+
37
+
38
+ def load_split(logits_dir, kind, prefix=""):
39
+ """kind = 'oof' or 'test'. prefix = '' for cRT, 'plain_' for plain.
40
+ Logits are stored in per-backbone subdirectories: logits_dir/{bb}/{prefix}{bb}_{kind}.npz
41
+ """
42
+ out = {}
43
+ for bb in BACKBONES:
44
+ f = logits_dir / bb / f"{prefix}{bb}_{kind}.npz"
45
+ z = np.load(f, allow_pickle=True)
46
+ out[bb] = {k: z[k] for k in z.files}
47
+ return out
48
+
49
+
50
+ def stack_features(d, backbones=BACKBONES, use_softmax=False):
51
+ arrs = []
52
+ for bb in backbones:
53
+ lg = d[bb]["logits"].astype(np.float32)
54
+ arrs.append(softmax(lg, axis=1) if use_softmax else lg)
55
+ return np.concatenate(arrs, axis=1).astype(np.float32)
56
+
57
+
58
+ def compute_per_class_precision(true, pred, names):
59
+ true = np.asarray(true); pred = np.asarray(pred)
60
+ result = {}
61
+ for i, name in enumerate(names):
62
+ tp = ((pred == i) & (true == i)).sum()
63
+ fp = ((pred == i) & (true != i)).sum()
64
+ result[name] = float(tp / max(tp + fp, 1))
65
+ return result
66
+
67
+
68
+ def metrics_from_pred(pred, true, src=None, names=None):
69
+ if names is None:
70
+ names = ["malignant", "non_malignant", "non_roi"]
71
+ pred = np.asarray(pred); true = np.asarray(true)
72
+ m = {
73
+ "macro_f1": float(f1_score(true, pred, average="macro", labels=list(range(NUM_CLASSES)), zero_division=0)),
74
+ "accuracy": float(accuracy_score(true, pred)),
75
+ "balanced_acc": float(balanced_accuracy_score(true, pred)),
76
+ "per_class_recall": {names[i]: float(((true == i) & (pred == i)).sum() / max((true == i).sum(), 1)) for i in range(NUM_CLASSES)},
77
+ "per_class_precision": compute_per_class_precision(true, pred, names),
78
+ "confusion_matrix": confusion_matrix(true, pred, labels=list(range(NUM_CLASSES))).tolist(),
79
+ "classification_report": classification_report(true, pred, labels=list(range(NUM_CLASSES)), target_names=names, output_dict=True, zero_division=0),
80
+ "n": len(pred),
81
+ }
82
+ if src is not None:
83
+ src = np.asarray(src)
84
+ for s in ["B", "C", "D"]:
85
+ mk = src == s
86
+ if mk.sum() > 0:
87
+ m[f"src_{s}_acc"] = float(accuracy_score(true[mk], pred[mk]))
88
+ m[f"src_{s}_n"] = int(mk.sum())
89
+ return m
90
+
91
+
92
+ def make_logreg():
93
+ return LogisticRegression(C=1.0, max_iter=2000, solver="lbfgs",
94
+ class_weight="balanced", random_state=SEED)
95
+
96
+
97
+ def predict_method(method, X_tr, y_tr, X_va, n_backbones=len(BACKBONES)):
98
+ if method == "avg_softmax":
99
+ blocks = [X_va[:, i*NUM_CLASSES:(i+1)*NUM_CLASSES] for i in range(n_backbones)]
100
+ avg = np.mean(blocks, axis=0)
101
+ return avg.argmax(1)
102
+ scaler = StandardScaler()
103
+ Xtr = scaler.fit_transform(X_tr)
104
+ Xva = scaler.transform(X_va)
105
+ clf = make_logreg()
106
+ clf.fit(Xtr, y_tr)
107
+ return clf.predict(Xva)
108
+
109
+
110
+ def run_cv_method(method, X_oof, y_oof, cv_folds, src_oof):
111
+ fold_metrics = []
112
+ for k in range(5):
113
+ tr_mask = cv_folds != k
114
+ va_mask = cv_folds == k
115
+ pred_va = predict_method(method, X_oof[tr_mask], y_oof[tr_mask], X_oof[va_mask])
116
+ m = metrics_from_pred(pred_va, y_oof[va_mask], src_oof[va_mask])
117
+ m["fold"] = int(k)
118
+ fold_metrics.append(m)
119
+ f1s = [fm["macro_f1"] for fm in fold_metrics]
120
+ nms = [fm["per_class_recall"]["non_malignant"] for fm in fold_metrics]
121
+ baccs = [fm["balanced_acc"] for fm in fold_metrics]
122
+ prec_mal = [fm["per_class_precision"]["malignant"] for fm in fold_metrics]
123
+ prec_nm = [fm["per_class_precision"]["non_malignant"] for fm in fold_metrics]
124
+ prec_nroi = [fm["per_class_precision"]["non_roi"] for fm in fold_metrics]
125
+ rec_mal = [fm["per_class_recall"]["malignant"] for fm in fold_metrics]
126
+ rec_nm = [fm["per_class_recall"]["non_malignant"] for fm in fold_metrics]
127
+ rec_nroi = [fm["per_class_recall"]["non_roi"] for fm in fold_metrics]
128
+ return {
129
+ "folds": fold_metrics,
130
+ "cv_macro_f1_mean": float(np.mean(f1s)), "cv_macro_f1_std": float(np.std(f1s)),
131
+ "cv_non_malignant_recall_mean": float(np.mean(nms)), "cv_non_malignant_recall_std": float(np.std(nms)),
132
+ "cv_balanced_acc_mean": float(np.mean(baccs)), "cv_balanced_acc_std": float(np.std(baccs)),
133
+ "cv_malignant_precision_mean": float(np.mean(prec_mal)), "cv_malignant_precision_std": float(np.std(prec_mal)),
134
+ "cv_non_malignant_precision_mean": float(np.mean(prec_nm)), "cv_non_malignant_precision_std": float(np.std(prec_nm)),
135
+ "cv_non_roi_precision_mean": float(np.mean(prec_nroi)), "cv_non_roi_precision_std": float(np.std(prec_nroi)),
136
+ "cv_malignant_recall_mean": float(np.mean(rec_mal)), "cv_malignant_recall_std": float(np.std(rec_mal)),
137
+ "cv_non_malignant_recall_mean": float(np.mean(nms)), "cv_non_malignant_recall_std": float(np.std(nms)),
138
+ "cv_non_roi_recall_mean": float(np.mean(rec_nroi)), "cv_non_roi_recall_std": float(np.std(rec_nroi)),
139
+ }
140
+
141
+
142
+ def run_pooled_method(method, X_oof, y_oof, cv_folds, src_oof):
143
+ oof_pred = np.zeros(len(y_oof), dtype=np.int64)
144
+ for k in range(5):
145
+ tr_mask = cv_folds != k
146
+ va_mask = cv_folds == k
147
+ oof_pred[va_mask] = predict_method(method, X_oof[tr_mask], y_oof[tr_mask], X_oof[va_mask])
148
+ return metrics_from_pred(oof_pred, y_oof, src_oof)
149
+
150
+
151
+ def fit_predict_test(method, X_oof, y_oof, X_test, n_backbones=len(BACKBONES)):
152
+ if method == "avg_softmax":
153
+ blocks = [X_test[:, i*NUM_CLASSES:(i+1)*NUM_CLASSES] for i in range(n_backbones)]
154
+ avg = np.mean(blocks, axis=0)
155
+ return avg.argmax(1), avg
156
+ scaler = StandardScaler()
157
+ Xtr = scaler.fit_transform(X_oof)
158
+ Xte = scaler.transform(X_test)
159
+ clf = make_logreg()
160
+ clf.fit(Xtr, y_oof)
161
+ pred = clf.predict(Xte)
162
+ proba = clf.predict_proba(Xte)
163
+ return pred, proba
164
+
165
+
166
+ def single_metrics(logits_dir, kind, prefix=""):
167
+ d = load_split(logits_dir, kind, prefix=prefix)
168
+ out = {}
169
+ for bb in BACKBONES:
170
+ pred = d[bb]["logits"].argmax(1)
171
+ y = d[bb]["labels"]; src = d[bb].get("source", None)
172
+ out[bb] = metrics_from_pred(pred, y, src)
173
+ return out
174
+
175
+
176
+ def run_ensemble(label, prefix, logits_dir, results_dir):
177
+ """label='cRT' or 'plain'. prefix='' for cRT, 'plain_' for plain."""
178
+ print(f"\n=== Ensemble stacking ({label}, 4 backbones: {BACKBONES}) ===")
179
+ oof = load_split(logits_dir, "oof", prefix=prefix)
180
+ test = load_split(logits_dir, "test", prefix=prefix)
181
+
182
+ for bb in BACKBONES:
183
+ assert np.array_equal(oof[bb]["labels"], oof["convnext"]["labels"]), f"oof labels mismatch {bb}"
184
+ assert np.array_equal(test[bb]["labels"], test["convnext"]["labels"]), f"test labels mismatch {bb}"
185
+ print("alignment OK")
186
+
187
+ y_oof = oof["convnext"]["labels"].astype(np.int64)
188
+ y_test = test["convnext"]["labels"].astype(np.int64)
189
+ cv_folds = oof["convnext"]["cv_fold"].astype(np.int64)
190
+ src_oof = oof["convnext"]["source"]
191
+ src_test = test["convnext"]["source"]
192
+
193
+ X_oof_raw = stack_features(oof, use_softmax=False)
194
+ X_oof_sm = stack_features(oof, use_softmax=True)
195
+ X_test_raw = stack_features(test, use_softmax=False)
196
+ X_test_sm = stack_features(test, use_softmax=True)
197
+ print(f"X_oof_raw {X_oof_raw.shape} X_oof_sm {X_oof_sm.shape}")
198
+
199
+ method_features = {
200
+ "logreg_logits_balanced": (X_oof_raw, X_test_raw),
201
+ "logreg_softmax_balanced": (X_oof_sm, X_test_sm),
202
+ "avg_softmax": (X_oof_sm, X_test_sm),
203
+ }
204
+
205
+ all_cv = {}
206
+ all_pooled = {}
207
+ all_test = {}
208
+ for method in METHODS:
209
+ Xo, Xt = method_features[method]
210
+ print(f"\n--- {method} CV per-fold ---")
211
+ cv_res = run_cv_method(method, Xo, y_oof, cv_folds, src_oof)
212
+ for fm in cv_res["folds"]:
213
+ print(f" fold{fm['fold']}: f1={fm['macro_f1']:.4f} nm_rec={fm['per_class_recall']['non_malignant']:.4f}")
214
+ print(f" CV: f1={cv_res['cv_macro_f1_mean']:.4f}+-{cv_res['cv_macro_f1_std']:.4f}")
215
+
216
+ print(f"--- {method} CV pooled ---")
217
+ pooled = run_pooled_method(method, Xo, y_oof, cv_folds, src_oof)
218
+ print(f" pooled: f1={pooled['macro_f1']:.4f} nm_rec={pooled['per_class_recall']['non_malignant']:.4f}")
219
+
220
+ print(f"--- {method} Test ---")
221
+ pred_te, proba_te = fit_predict_test(method, Xo, y_oof, Xt)
222
+ tm = metrics_from_pred(pred_te, y_test, src_test)
223
+ print(f" test: f1={tm['macro_f1']:.4f} nm_rec={tm['per_class_recall']['non_malignant']:.4f} bacc={tm['balanced_acc']:.4f}")
224
+
225
+ all_cv[method] = cv_res
226
+ all_pooled[method] = pooled
227
+ all_test[method] = {"test_metrics": tm, "pred": pred_te.tolist(), "proba": proba_te.tolist()}
228
+
229
+ best_method = max(METHODS, key=lambda m: all_pooled[m]["macro_f1"])
230
+ print(f"\n=== Best method: {best_method} (pooled OOF macro-F1={all_pooled[best_method]['macro_f1']:.4f}) ===")
231
+
232
+ tag = label.lower() # 'crt' or 'plain'
233
+ cv_summary = {
234
+ "label": label, "methods": METHODS, "best_method": best_method,
235
+ "backbones": BACKBONES,
236
+ "per_method_cv": {m: all_cv[m] for m in METHODS},
237
+ "per_method_pooled": {m: all_pooled[m] for m in METHODS},
238
+ "best_cv": all_cv[best_method], "best_pooled": all_pooled[best_method],
239
+ }
240
+ (results_dir / f"ensemble_{tag}_cv_summary.json").write_text(json.dumps(cv_summary, indent=2))
241
+
242
+ best_test = all_test[best_method]
243
+ test_summary = {
244
+ "label": label, "best_method": best_method,
245
+ "test_metrics": best_test["test_metrics"],
246
+ "all_methods_test": {m: all_test[m]["test_metrics"] for m in METHODS},
247
+ }
248
+ (results_dir / f"ensemble_{tag}_test.json").write_text(json.dumps(test_summary, indent=2))
249
+
250
+ # Single model metrics
251
+ single_cv = single_metrics(logits_dir, "oof", prefix=prefix)
252
+ single_te = single_metrics(logits_dir, "test", prefix=prefix)
253
+ comp = {
254
+ "cv_single": {bb: single_cv[bb] for bb in BACKBONES},
255
+ "cv_ensemble_best_per_fold": all_cv[best_method],
256
+ "cv_ensemble_best_pooled": all_pooled[best_method],
257
+ "test_single": {bb: single_te[bb] for bb in BACKBONES},
258
+ "test_ensemble_best": best_test["test_metrics"],
259
+ "best_method": best_method,
260
+ "all_methods_test": {m: all_test[m]["test_metrics"] for m in METHODS},
261
+ }
262
+ (results_dir / f"ensemble_{tag}_single_vs_ensemble.json").write_text(json.dumps(comp, indent=2))
263
+
264
+ print(f"\nBest method: {best_method}")
265
+ print(f"CV per-fold f1: {all_cv[best_method]['cv_macro_f1_mean']:.4f}+-{all_cv[best_method]['cv_macro_f1_std']:.4f}")
266
+ print(f"CV pooled f1: {all_pooled[best_method]['macro_f1']:.4f}")
267
+ print(f"Test f1: {best_test['test_metrics']['macro_f1']:.4f}")
268
+ return cv_summary, test_summary, comp
269
+
270
+
271
+ def main():
272
+ ap = argparse.ArgumentParser()
273
+ ap.add_argument("--resize", choices=["letterbox", "squeeze"], required=True)
274
+ args = ap.parse_args()
275
+
276
+ # Map "squeeze" arg to "resized" directory name
277
+ resize_dir = "resized" if args.resize == "squeeze" else args.resize
278
+ logits_dir, results_dir = get_paths(resize_dir)
279
+ results_dir.mkdir(parents=True, exist_ok=True)
280
+
281
+ crt_cv, crt_test, crt_comp = run_ensemble("cRT", "", logits_dir, results_dir)
282
+ plain_cv, plain_test, plain_comp = run_ensemble("plain", "plain_", logits_dir, results_dir)
283
+
284
+ # Consolidated
285
+ all_results = {
286
+ "backbones": BACKBONES, "resize": args.resize,
287
+ "crt": {"cv_summary": crt_cv, "test_summary": crt_test, "comparison": crt_comp},
288
+ "plain": {"cv_summary": plain_cv, "test_summary": plain_test, "comparison": plain_comp},
289
+ }
290
+ (results_dir / "ensemble_all.json").write_text(json.dumps(all_results, indent=2))
291
+ print("\n=== All 4-model ensembles complete ===")
292
+
293
+
294
+ if __name__ == "__main__":
295
+ main()
stage1v2_final/f_reference_metrics.json ADDED
@@ -0,0 +1,1336 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "convnext": {
3
+ "plain_cv": {
4
+ "label": "convnext_plain_cv",
5
+ "folds": [
6
+ {
7
+ "mcc": 0.9194120515046523,
8
+ "macro_f1": 0.7549369857124005,
9
+ "MT_recall": 0.9638157894736842,
10
+ "MT_precision": 0.956474428726877,
11
+ "NML_recall": 0.2857142857142857,
12
+ "NML_precision": 0.3684210526315789,
13
+ "NROI_recall": 0.9847182425978988,
14
+ "NROI_precision": 0.9809705042816366,
15
+ "fold": 0
16
+ },
17
+ {
18
+ "mcc": 0.8549812264654902,
19
+ "macro_f1": 0.7904883586467214,
20
+ "MT_recall": 0.9462719298245614,
21
+ "MT_precision": 0.9046121593291404,
22
+ "NML_recall": 0.4,
23
+ "NML_precision": 0.6896551724137931,
24
+ "NROI_recall": 0.9308056872037914,
25
+ "NROI_precision": 0.9497098646034816,
26
+ "fold": 1
27
+ },
28
+ {
29
+ "mcc": 0.872484283655017,
30
+ "macro_f1": 0.7191863717346433,
31
+ "MT_recall": 0.9484649122807017,
32
+ "MT_precision": 0.9241452991452992,
33
+ "NML_recall": 0.2653061224489796,
34
+ "NML_precision": 0.25,
35
+ "NROI_recall": 0.9513145082765336,
36
+ "NROI_precision": 0.977,
37
+ "fold": 2
38
+ },
39
+ {
40
+ "mcc": 0.8605827674546662,
41
+ "macro_f1": 0.7565141287721873,
42
+ "MT_recall": 0.9222343921139102,
43
+ "MT_precision": 0.9439461883408071,
44
+ "NML_recall": 0.4,
45
+ "NML_precision": 0.37735849056603776,
46
+ "NROI_recall": 0.9560439560439561,
47
+ "NROI_precision": 0.9405405405405406,
48
+ "fold": 3
49
+ },
50
+ {
51
+ "mcc": 0.8458089107559619,
52
+ "macro_f1": 0.652147601979934,
53
+ "MT_recall": 0.9452354874041621,
54
+ "MT_precision": 0.8924508790072389,
55
+ "NML_recall": 0.058823529411764705,
56
+ "NML_precision": 0.1875,
57
+ "NROI_recall": 0.9400966183574879,
58
+ "NROI_precision": 0.9576771653543307,
59
+ "fold": 4
60
+ }
61
+ ],
62
+ "cv_means": {
63
+ "MCC": 0.8706538479671575,
64
+ "MCC_std": 0.02586519491309903,
65
+ "macro_f1": 0.7346546893691773,
66
+ "MT_recall": 0.9452045022194039,
67
+ "MT_precision": 0.9243257909098725,
68
+ "NML_recall": 0.28196878751500604,
69
+ "NML_precision": 0.374586943122282,
70
+ "NROI_recall": 0.9525958024959337,
71
+ "NROI_precision": 0.9611796149559979
72
+ }
73
+ },
74
+ "plain_final": {
75
+ "mcc": 0.9090384360223862,
76
+ "macro_f1": 0.7867752685071485,
77
+ "MT_recall": 0.9458077709611452,
78
+ "MT_precision": 0.9809119830328739,
79
+ "NML_recall": 0.32075471698113206,
80
+ "NML_precision": 0.68,
81
+ "NROI_recall": 0.9884032114183765,
82
+ "NROI_precision": 0.9358108108108109,
83
+ "label": "convnext_plain_test"
84
+ },
85
+ "crt_cv": {
86
+ "label": "convnext_crt_cv",
87
+ "folds": [
88
+ {
89
+ "mcc": 0.8962843598604839,
90
+ "macro_f1": 0.7408092088815458,
91
+ "MT_recall": 0.9429824561403509,
92
+ "MT_precision": 0.9598214285714286,
93
+ "NML_recall": 0.3673469387755102,
94
+ "NML_precision": 0.24324324324324326,
95
+ "NROI_recall": 0.9742120343839542,
96
+ "NROI_precision": 0.9826589595375722,
97
+ "fold": 0
98
+ },
99
+ {
100
+ "mcc": 0.8428535107275467,
101
+ "macro_f1": 0.7854925379619416,
102
+ "MT_recall": 0.9013157894736842,
103
+ "MT_precision": 0.9372862029646523,
104
+ "NML_recall": 0.66,
105
+ "NML_precision": 0.39759036144578314,
106
+ "NROI_recall": 0.9421800947867298,
107
+ "NROI_precision": 0.9403973509933775,
108
+ "fold": 1
109
+ },
110
+ {
111
+ "mcc": 0.8441916372913202,
112
+ "macro_f1": 0.731610480037181,
113
+ "MT_recall": 0.9122807017543859,
114
+ "MT_precision": 0.9193370165745857,
115
+ "NML_recall": 0.4897959183673469,
116
+ "NML_precision": 0.23529411764705882,
117
+ "NROI_recall": 0.9396299902629016,
118
+ "NROI_precision": 0.9836901121304791,
119
+ "fold": 2
120
+ },
121
+ {
122
+ "mcc": 0.7735090950435417,
123
+ "macro_f1": 0.7026481770827727,
124
+ "MT_recall": 0.8904709748083242,
125
+ "MT_precision": 0.9073660714285714,
126
+ "NML_recall": 0.68,
127
+ "NML_precision": 0.18994413407821228,
128
+ "NROI_recall": 0.8653846153846154,
129
+ "NROI_precision": 0.9642857142857143,
130
+ "fold": 3
131
+ },
132
+ {
133
+ "mcc": 0.7693347234033466,
134
+ "macro_f1": 0.6388269960982316,
135
+ "MT_recall": 0.8849945235487404,
136
+ "MT_precision": 0.9017857142857143,
137
+ "NML_recall": 0.17647058823529413,
138
+ "NML_precision": 0.06428571428571428,
139
+ "NROI_recall": 0.8966183574879227,
140
+ "NROI_precision": 0.9636552440290758,
141
+ "fold": 4
142
+ }
143
+ ],
144
+ "cv_means": {
145
+ "MCC": 0.8252346652652477,
146
+ "MCC_std": 0.04799622426987891,
147
+ "macro_f1": 0.7198774800123345,
148
+ "MT_recall": 0.9064088891450972,
149
+ "MT_precision": 0.9251192867649906,
150
+ "NML_recall": 0.4747226890756303,
151
+ "NML_precision": 0.22607151414000234,
152
+ "NROI_recall": 0.9236050184612248,
153
+ "NROI_precision": 0.9669374761952436
154
+ }
155
+ },
156
+ "crt_final": {
157
+ "mcc": 0.8961001150661378,
158
+ "macro_f1": 0.7851771594706953,
159
+ "MT_recall": 0.9529652351738241,
160
+ "MT_precision": 0.9718456725755996,
161
+ "NML_recall": 0.5849056603773585,
162
+ "NML_precision": 0.34065934065934067,
163
+ "NROI_recall": 0.9545049063336307,
164
+ "NROI_precision": 0.9709618874773139,
165
+ "label": "convnext_crt_test"
166
+ }
167
+ },
168
+ "swin": {
169
+ "plain_cv": {
170
+ "label": "swin_plain_cv",
171
+ "folds": [
172
+ {
173
+ "mcc": 0.9290503864306585,
174
+ "macro_f1": 0.7848429877450399,
175
+ "MT_recall": 0.9616228070175439,
176
+ "MT_precision": 0.9669239250275634,
177
+ "NML_recall": 0.3673469387755102,
178
+ "NML_precision": 0.45,
179
+ "NROI_recall": 0.9923591212989494,
180
+ "NROI_precision": 0.9792648444863337,
181
+ "fold": 0
182
+ },
183
+ {
184
+ "mcc": 0.8354408048926615,
185
+ "macro_f1": 0.7926293935683866,
186
+ "MT_recall": 0.9287280701754386,
187
+ "MT_precision": 0.9058823529411765,
188
+ "NML_recall": 0.5,
189
+ "NML_precision": 0.5681818181818182,
190
+ "NROI_recall": 0.9213270142180094,
191
+ "NROI_precision": 0.9364161849710982,
192
+ "fold": 1
193
+ },
194
+ {
195
+ "mcc": 0.869398518490781,
196
+ "macro_f1": 0.7215335981154607,
197
+ "MT_recall": 0.930921052631579,
198
+ "MT_precision": 0.9238302502720348,
199
+ "NML_recall": 0.24489795918367346,
200
+ "NML_precision": 0.3076923076923077,
201
+ "NROI_recall": 0.9659201557935735,
202
+ "NROI_precision": 0.9631067961165048,
203
+ "fold": 2
204
+ },
205
+ {
206
+ "mcc": 0.8392308784026812,
207
+ "macro_f1": 0.7434488108023993,
208
+ "MT_recall": 0.8882803943044907,
209
+ "MT_precision": 0.9364896073903002,
210
+ "NML_recall": 0.54,
211
+ "NML_precision": 0.2755102040816326,
212
+ "NROI_recall": 0.9532967032967034,
213
+ "NROI_precision": 0.9541704857928506,
214
+ "fold": 3
215
+ },
216
+ {
217
+ "mcc": 0.8420546110373329,
218
+ "macro_f1": 0.6836072581894488,
219
+ "MT_recall": 0.8981380065717415,
220
+ "MT_precision": 0.9371428571428572,
221
+ "NML_recall": 0.19607843137254902,
222
+ "NML_precision": 0.16129032258064516,
223
+ "NROI_recall": 0.9690821256038648,
224
+ "NROI_precision": 0.9444444444444444,
225
+ "fold": 4
226
+ }
227
+ ],
228
+ "cv_means": {
229
+ "MCC": 0.8630350398508229,
230
+ "MCC_std": 0.035119163266884225,
231
+ "macro_f1": 0.745212409684147,
232
+ "MT_recall": 0.9215380661401588,
233
+ "MT_precision": 0.9340537985547863,
234
+ "NML_recall": 0.36966466586634655,
235
+ "NML_precision": 0.3525349305072808,
236
+ "NROI_recall": 0.9603970240422199,
237
+ "NROI_precision": 0.9554805511622464
238
+ }
239
+ },
240
+ "plain_final": {
241
+ "mcc": 0.9105187847427771,
242
+ "macro_f1": 0.8172548784070295,
243
+ "MT_recall": 0.9550102249488752,
244
+ "MT_precision": 0.9579487179487179,
245
+ "NML_recall": 0.4716981132075472,
246
+ "NML_precision": 0.5952380952380952,
247
+ "NROI_recall": 0.9750223015165032,
248
+ "NROI_precision": 0.9629955947136564,
249
+ "label": "swin_plain_test"
250
+ },
251
+ "crt_cv": {
252
+ "label": "swin_crt_cv",
253
+ "folds": [
254
+ {
255
+ "mcc": 0.9193544888001476,
256
+ "macro_f1": 0.796298046609862,
257
+ "MT_recall": 0.9495614035087719,
258
+ "MT_precision": 0.9622222222222222,
259
+ "NML_recall": 0.5102040816326531,
260
+ "NML_precision": 0.3968253968253968,
261
+ "NROI_recall": 0.9856733524355301,
262
+ "NROI_precision": 0.9875598086124402,
263
+ "fold": 0
264
+ },
265
+ {
266
+ "mcc": 0.8195057269796786,
267
+ "macro_f1": 0.7853334523742818,
268
+ "MT_recall": 0.9089912280701754,
269
+ "MT_precision": 0.9070021881838074,
270
+ "NML_recall": 0.68,
271
+ "NML_precision": 0.425,
272
+ "NROI_recall": 0.9109004739336493,
273
+ "NROI_precision": 0.9393939393939394,
274
+ "fold": 1
275
+ },
276
+ {
277
+ "mcc": 0.8559996378789152,
278
+ "macro_f1": 0.7431091212492773,
279
+ "MT_recall": 0.9078947368421053,
280
+ "MT_precision": 0.9282511210762332,
281
+ "NML_recall": 0.32653061224489793,
282
+ "NML_precision": 0.3902439024390244,
283
+ "NROI_recall": 0.9688412852969815,
284
+ "NROI_precision": 0.943127962085308,
285
+ "fold": 2
286
+ },
287
+ {
288
+ "mcc": 0.7831106139350331,
289
+ "macro_f1": 0.7060042798394687,
290
+ "MT_recall": 0.8619934282584885,
291
+ "MT_precision": 0.9258823529411765,
292
+ "NML_recall": 0.7,
293
+ "NML_precision": 0.18716577540106952,
294
+ "NROI_recall": 0.8983516483516484,
295
+ "NROI_precision": 0.9636542239685658,
296
+ "fold": 3
297
+ },
298
+ {
299
+ "mcc": 0.7771847289348364,
300
+ "macro_f1": 0.6691956327288544,
301
+ "MT_recall": 0.8707557502738226,
302
+ "MT_precision": 0.9330985915492958,
303
+ "NML_recall": 0.39215686274509803,
304
+ "NML_precision": 0.11428571428571428,
305
+ "NROI_recall": 0.9014492753623189,
306
+ "NROI_precision": 0.9598765432098766,
307
+ "fold": 4
308
+ }
309
+ ],
310
+ "cv_means": {
311
+ "MCC": 0.8310310393057222,
312
+ "MCC_std": 0.052446330239173014,
313
+ "macro_f1": 0.7399881065603489,
314
+ "MT_recall": 0.8998393093906728,
315
+ "MT_precision": 0.9312912951945471,
316
+ "NML_recall": 0.5217783113245298,
317
+ "NML_precision": 0.30270415779024107,
318
+ "NROI_recall": 0.9330432070760256,
319
+ "NROI_precision": 0.9587224954540261
320
+ }
321
+ },
322
+ "crt_final": {
323
+ "mcc": 0.8903622799040505,
324
+ "macro_f1": 0.8024222443562965,
325
+ "MT_recall": 0.934560327198364,
326
+ "MT_precision": 0.961093585699264,
327
+ "NML_recall": 0.6981132075471698,
328
+ "NML_precision": 0.38144329896907214,
329
+ "NROI_recall": 0.9589652096342551,
330
+ "NROI_precision": 0.9737318840579711,
331
+ "label": "swin_crt_test"
332
+ }
333
+ },
334
+ "mamba": {
335
+ "plain_cv": {
336
+ "label": "mamba_plain_cv",
337
+ "folds": [
338
+ {
339
+ "mcc": 0.9126781960556674,
340
+ "macro_f1": 0.7622487991650223,
341
+ "MT_recall": 0.9616228070175439,
342
+ "MT_precision": 0.9481081081081081,
343
+ "NML_recall": 0.30612244897959184,
344
+ "NML_precision": 0.4166666666666667,
345
+ "NROI_recall": 0.9789875835721108,
346
+ "NROI_precision": 0.9789875835721108,
347
+ "fold": 0
348
+ },
349
+ {
350
+ "mcc": 0.8305638131967935,
351
+ "macro_f1": 0.7762061365474086,
352
+ "MT_recall": 0.9002192982456141,
353
+ "MT_precision": 0.9266365688487584,
354
+ "NML_recall": 0.4,
355
+ "NML_precision": 0.625,
356
+ "NROI_recall": 0.9469194312796209,
357
+ "NROI_precision": 0.9090081892629663,
358
+ "fold": 1
359
+ },
360
+ {
361
+ "mcc": 0.8254502646971118,
362
+ "macro_f1": 0.7283130543096893,
363
+ "MT_recall": 0.9221491228070176,
364
+ "MT_precision": 0.8937300743889479,
365
+ "NML_recall": 0.3469387755102041,
366
+ "NML_precision": 0.3333333333333333,
367
+ "NROI_recall": 0.9230769230769231,
368
+ "NROI_precision": 0.9518072289156626,
369
+ "fold": 2
370
+ },
371
+ {
372
+ "mcc": 0.8650734110074164,
373
+ "macro_f1": 0.7329640527858814,
374
+ "MT_recall": 0.9660460021905805,
375
+ "MT_precision": 0.9055441478439425,
376
+ "NML_recall": 0.3,
377
+ "NML_precision": 0.32608695652173914,
378
+ "NROI_recall": 0.9267399267399268,
379
+ "NROI_precision": 0.9777777777777777,
380
+ "fold": 3
381
+ },
382
+ {
383
+ "mcc": 0.8536968685656782,
384
+ "macro_f1": 0.6453354212756119,
385
+ "MT_recall": 0.9299014238773274,
386
+ "MT_precision": 0.9129032258064517,
387
+ "NML_recall": 0.0392156862745098,
388
+ "NML_precision": 0.125,
389
+ "NROI_recall": 0.9632850241545894,
390
+ "NROI_precision": 0.9468186134852802,
391
+ "fold": 4
392
+ }
393
+ ],
394
+ "cv_means": {
395
+ "MCC": 0.8574925107045335,
396
+ "MCC_std": 0.031206400288999524,
397
+ "macro_f1": 0.7290134928167227,
398
+ "MT_recall": 0.9359877308276167,
399
+ "MT_precision": 0.9173844249992417,
400
+ "NML_recall": 0.27845538215286114,
401
+ "NML_precision": 0.3652173913043478,
402
+ "NROI_recall": 0.9478017777646341,
403
+ "NROI_precision": 0.9528798786027595
404
+ }
405
+ },
406
+ "plain_final": {
407
+ "mcc": 0.8750689776791892,
408
+ "macro_f1": 0.6878826698558232,
409
+ "MT_recall": 0.9683026584867076,
410
+ "MT_precision": 0.907088122605364,
411
+ "NML_recall": 0.11320754716981132,
412
+ "NML_precision": 0.3333333333333333,
413
+ "NROI_recall": 0.944692239072257,
414
+ "NROI_precision": 0.9715596330275229,
415
+ "label": "mamba_plain_test"
416
+ },
417
+ "crt_cv": {
418
+ "label": "mamba_crt_cv",
419
+ "folds": [
420
+ {
421
+ "mcc": 0.8943879229677248,
422
+ "macro_f1": 0.7703929883524615,
423
+ "MT_recall": 0.930921052631579,
424
+ "MT_precision": 0.9571589627959414,
425
+ "NML_recall": 0.4897959183673469,
426
+ "NML_precision": 0.32432432432432434,
427
+ "NROI_recall": 0.9770773638968482,
428
+ "NROI_precision": 0.9770773638968482,
429
+ "fold": 0
430
+ },
431
+ {
432
+ "mcc": 0.7849668120875456,
433
+ "macro_f1": 0.7388394190601253,
434
+ "MT_recall": 0.8739035087719298,
435
+ "MT_precision": 0.9098173515981736,
436
+ "NML_recall": 0.7,
437
+ "NML_precision": 0.2892561983471074,
438
+ "NROI_recall": 0.9004739336492891,
439
+ "NROI_precision": 0.9313725490196079,
440
+ "fold": 1
441
+ },
442
+ {
443
+ "mcc": 0.8013597092447522,
444
+ "macro_f1": 0.7233465535919801,
445
+ "MT_recall": 0.9057017543859649,
446
+ "MT_precision": 0.8872180451127819,
447
+ "NML_recall": 0.4489795918367347,
448
+ "NML_precision": 0.28205128205128205,
449
+ "NROI_recall": 0.9055501460564752,
450
+ "NROI_precision": 0.9499489274770173,
451
+ "fold": 2
452
+ },
453
+ {
454
+ "mcc": 0.773009281732149,
455
+ "macro_f1": 0.7082230304388544,
456
+ "MT_recall": 0.904709748083242,
457
+ "MT_precision": 0.9027322404371585,
458
+ "NML_recall": 0.78,
459
+ "NML_precision": 0.19796954314720813,
460
+ "NROI_recall": 0.8434065934065934,
461
+ "NROI_precision": 0.9766702014846236,
462
+ "fold": 3
463
+ },
464
+ {
465
+ "mcc": 0.70299592439667,
466
+ "macro_f1": 0.6144642398310995,
467
+ "MT_recall": 0.8762322015334063,
468
+ "MT_precision": 0.9009009009009009,
469
+ "NML_recall": 0.21568627450980393,
470
+ "NML_precision": 0.04680851063829787,
471
+ "NROI_recall": 0.8106280193236715,
472
+ "NROI_precision": 0.9577625570776256,
473
+ "fold": 4
474
+ }
475
+ ],
476
+ "cv_means": {
477
+ "MCC": 0.7913439300857682,
478
+ "MCC_std": 0.061482643688561926,
479
+ "macro_f1": 0.7110532462549042,
480
+ "MT_recall": 0.8982936530812242,
481
+ "MT_precision": 0.9115655001689913,
482
+ "NML_recall": 0.5268923569427771,
483
+ "NML_precision": 0.22808197170164393,
484
+ "NROI_recall": 0.8874272112665755,
485
+ "NROI_precision": 0.9585663197911444
486
+ }
487
+ },
488
+ "crt_final": {
489
+ "mcc": 0.8358210752297587,
490
+ "macro_f1": 0.710723127977536,
491
+ "MT_recall": 0.9294478527607362,
492
+ "MT_precision": 0.9026812313803376,
493
+ "NML_recall": 0.33962264150943394,
494
+ "NML_precision": 0.21951219512195122,
495
+ "NROI_recall": 0.9250669045495094,
496
+ "NROI_precision": 0.9755409219190969,
497
+ "label": "mamba_crt_test"
498
+ }
499
+ },
500
+ "resnet": {
501
+ "plain_cv": {
502
+ "label": "resnet_plain_cv",
503
+ "folds": [
504
+ {
505
+ "mcc": 0.8842115065276618,
506
+ "macro_f1": 0.6888789981412877,
507
+ "MT_recall": 0.9243421052631579,
508
+ "MT_precision": 0.9514672686230248,
509
+ "NML_recall": 0.14285714285714285,
510
+ "NML_precision": 0.16666666666666666,
511
+ "NROI_recall": 0.9904489016236867,
512
+ "NROI_precision": 0.9601851851851851,
513
+ "fold": 0
514
+ },
515
+ {
516
+ "mcc": 0.7134671091024417,
517
+ "macro_f1": 0.5749939773548542,
518
+ "MT_recall": 0.8278508771929824,
519
+ "MT_precision": 0.8708189158016147,
520
+ "NML_recall": 0.0,
521
+ "NML_precision": 0.0,
522
+ "NROI_recall": 0.9156398104265403,
523
+ "NROI_precision": 0.84,
524
+ "fold": 1
525
+ },
526
+ {
527
+ "mcc": 0.853620242936873,
528
+ "macro_f1": 0.708771243093952,
529
+ "MT_recall": 0.9484649122807017,
530
+ "MT_precision": 0.8954451345755694,
531
+ "NML_recall": 0.20408163265306123,
532
+ "NML_precision": 0.3333333333333333,
533
+ "NROI_recall": 0.9357351509250244,
534
+ "NROI_precision": 0.96875,
535
+ "fold": 2
536
+ },
537
+ {
538
+ "mcc": 0.7764321797342358,
539
+ "macro_f1": 0.6855263141708154,
540
+ "MT_recall": 0.9266155531215772,
541
+ "MT_precision": 0.8840125391849529,
542
+ "NML_recall": 0.4,
543
+ "NML_precision": 0.18018018018018017,
544
+ "NROI_recall": 0.8598901098901099,
545
+ "NROI_precision": 0.9513677811550152,
546
+ "fold": 3
547
+ },
548
+ {
549
+ "mcc": 0.8244729978595079,
550
+ "macro_f1": 0.6814272127857329,
551
+ "MT_recall": 0.91894852135816,
552
+ "MT_precision": 0.894456289978678,
553
+ "NML_recall": 0.17647058823529413,
554
+ "NML_precision": 0.21951219512195122,
555
+ "NROI_recall": 0.9352657004830918,
556
+ "NROI_precision": 0.9490196078431372,
557
+ "fold": 4
558
+ }
559
+ ],
560
+ "cv_means": {
561
+ "MCC": 0.8104408072321441,
562
+ "MCC_std": 0.060106517099850855,
563
+ "macro_f1": 0.6679195491093284,
564
+ "MT_recall": 0.9092443938433158,
565
+ "MT_precision": 0.8992400296327681,
566
+ "NML_recall": 0.18468187274909967,
567
+ "NML_precision": 0.17993847506042626,
568
+ "NROI_recall": 0.9273959346696905,
569
+ "NROI_precision": 0.9338645148366675
570
+ }
571
+ },
572
+ "plain_final": {
573
+ "mcc": 0.8585527312407192,
574
+ "macro_f1": 0.7583345419165192,
575
+ "MT_recall": 0.9488752556237219,
576
+ "MT_precision": 0.9160908193484699,
577
+ "NML_recall": 0.41509433962264153,
578
+ "NML_precision": 0.3793103448275862,
579
+ "NROI_recall": 0.9295272078501338,
580
+ "NROI_precision": 0.9639222941720629,
581
+ "label": "resnet_plain_test"
582
+ },
583
+ "crt_cv": {
584
+ "label": "resnet_crt_cv",
585
+ "folds": [
586
+ {
587
+ "mcc": 0.8502617252481105,
588
+ "macro_f1": 0.730679551560137,
589
+ "MT_recall": 0.8695175438596491,
590
+ "MT_precision": 0.9682539682539683,
591
+ "NML_recall": 0.5918367346938775,
592
+ "NML_precision": 0.20279720279720279,
593
+ "NROI_recall": 0.9732569245463228,
594
+ "NROI_precision": 0.9741873804971319,
595
+ "fold": 0
596
+ },
597
+ {
598
+ "mcc": 0.6720512628738716,
599
+ "macro_f1": 0.6512420619279113,
600
+ "MT_recall": 0.7916666666666666,
601
+ "MT_precision": 0.8414918414918415,
602
+ "NML_recall": 0.52,
603
+ "NML_precision": 0.17333333333333334,
604
+ "NROI_recall": 0.8587677725118483,
605
+ "NROI_precision": 0.8979187314172448,
606
+ "fold": 1
607
+ },
608
+ {
609
+ "mcc": 0.8099841040138945,
610
+ "macro_f1": 0.6975201299009214,
611
+ "MT_recall": 0.8925438596491229,
612
+ "MT_precision": 0.9044444444444445,
613
+ "NML_recall": 0.32653061224489793,
614
+ "NML_precision": 0.2077922077922078,
615
+ "NROI_recall": 0.9328140214216164,
616
+ "NROI_precision": 0.9475766567754699,
617
+ "fold": 2
618
+ },
619
+ {
620
+ "mcc": 0.6892112917940405,
621
+ "macro_f1": 0.642297972725066,
622
+ "MT_recall": 0.8685651697699891,
623
+ "MT_precision": 0.8870246085011185,
624
+ "NML_recall": 0.62,
625
+ "NML_precision": 0.11524163568773234,
626
+ "NROI_recall": 0.7765567765567766,
627
+ "NROI_precision": 0.9506726457399103,
628
+ "fold": 3
629
+ },
630
+ {
631
+ "mcc": 0.7171930109780075,
632
+ "macro_f1": 0.6252180782789704,
633
+ "MT_recall": 0.836801752464403,
634
+ "MT_precision": 0.9095238095238095,
635
+ "NML_recall": 0.2549019607843137,
636
+ "NML_precision": 0.06132075471698113,
637
+ "NROI_recall": 0.8666666666666667,
638
+ "NROI_precision": 0.9472016895459345,
639
+ "fold": 4
640
+ }
641
+ ],
642
+ "cv_means": {
643
+ "MCC": 0.7477402789815849,
644
+ "MCC_std": 0.06996076869541769,
645
+ "macro_f1": 0.6693915588786011,
646
+ "MT_recall": 0.851818998481966,
647
+ "MT_precision": 0.9021477344430366,
648
+ "NML_recall": 0.46265386154461785,
649
+ "NML_precision": 0.15209702686549148,
650
+ "NROI_recall": 0.8816124323406462,
651
+ "NROI_precision": 0.9435114207951383
652
+ }
653
+ },
654
+ "crt_final": {
655
+ "mcc": 0.8402691812418909,
656
+ "macro_f1": 0.7435890103460675,
657
+ "MT_recall": 0.9151329243353783,
658
+ "MT_precision": 0.9381551362683438,
659
+ "NML_recall": 0.5849056603773585,
660
+ "NML_precision": 0.25833333333333336,
661
+ "NROI_recall": 0.927743086529884,
662
+ "NROI_precision": 0.9647495361781077,
663
+ "label": "resnet_crt_test"
664
+ }
665
+ },
666
+ "ensemble_plain": {
667
+ "methods_cv": {
668
+ "logreg_logits_balanced": {
669
+ "label": "ens_plain_logreg_logits_balanced_cv",
670
+ "folds": [
671
+ {
672
+ "mcc": 0.9186286053436367,
673
+ "macro_f1": 0.7959915072634196,
674
+ "MT_recall": 0.9342105263157895,
675
+ "MT_precision": 0.9781859931113662,
676
+ "NML_recall": 0.5918367346938775,
677
+ "NML_precision": 0.35365853658536583,
678
+ "NROI_recall": 0.9933142311365807,
679
+ "NROI_precision": 0.985781990521327,
680
+ "fold": 0
681
+ },
682
+ {
683
+ "mcc": 0.8516274350901303,
684
+ "macro_f1": 0.7890123604346321,
685
+ "MT_recall": 0.930921052631579,
686
+ "MT_precision": 0.9319429198682766,
687
+ "NML_recall": 0.66,
688
+ "NML_precision": 0.39759036144578314,
689
+ "NROI_recall": 0.9251184834123223,
690
+ "NROI_precision": 0.9540566959921799,
691
+ "fold": 1
692
+ },
693
+ {
694
+ "mcc": 0.8321775635157773,
695
+ "macro_f1": 0.7147224666392457,
696
+ "MT_recall": 0.8914473684210527,
697
+ "MT_precision": 0.9259681093394078,
698
+ "NML_recall": 0.5102040816326531,
699
+ "NML_precision": 0.18382352941176472,
700
+ "NROI_recall": 0.9406037000973709,
701
+ "NROI_precision": 0.9917864476386037,
702
+ "fold": 2
703
+ },
704
+ {
705
+ "mcc": 0.728680816634543,
706
+ "macro_f1": 0.6640203057111016,
707
+ "MT_recall": 0.7108433734939759,
708
+ "MT_precision": 0.9629080118694362,
709
+ "NML_recall": 0.88,
710
+ "NML_precision": 0.13095238095238096,
711
+ "NROI_recall": 0.9258241758241759,
712
+ "NROI_precision": 0.9674641148325359,
713
+ "fold": 3
714
+ },
715
+ {
716
+ "mcc": 0.7571738381171879,
717
+ "macro_f1": 0.6907150723460873,
718
+ "MT_recall": 0.7864184008762322,
719
+ "MT_precision": 0.9598930481283422,
720
+ "NML_recall": 0.8235294117647058,
721
+ "NML_precision": 0.1640625,
722
+ "NROI_recall": 0.9159420289855073,
723
+ "NROI_precision": 0.9527638190954774,
724
+ "fold": 4
725
+ }
726
+ ],
727
+ "cv_means": {
728
+ "MCC": 0.817657651740255,
729
+ "MCC_std": 0.0680221675429439,
730
+ "macro_f1": 0.7308923424788972,
731
+ "MT_recall": 0.8507681443477259,
732
+ "MT_precision": 0.9517796164633658,
733
+ "NML_recall": 0.6931140456182472,
734
+ "NML_precision": 0.2460174616790589,
735
+ "NROI_recall": 0.9401605238911914,
736
+ "NROI_precision": 0.9703706136160248
737
+ }
738
+ },
739
+ "logreg_softmax_balanced": {
740
+ "label": "ens_plain_logreg_softmax_balanced_cv",
741
+ "folds": [
742
+ {
743
+ "mcc": 0.9146634218258007,
744
+ "macro_f1": 0.7984977147390575,
745
+ "MT_recall": 0.9254385964912281,
746
+ "MT_precision": 0.9802555168408827,
747
+ "NML_recall": 0.6530612244897959,
748
+ "NML_precision": 0.34782608695652173,
749
+ "NROI_recall": 0.9933142311365807,
750
+ "NROI_precision": 0.985781990521327,
751
+ "fold": 0
752
+ },
753
+ {
754
+ "mcc": 0.8460073825010561,
755
+ "macro_f1": 0.7836946407353276,
756
+ "MT_recall": 0.9177631578947368,
757
+ "MT_precision": 0.9372900335946248,
758
+ "NML_recall": 0.66,
759
+ "NML_precision": 0.38372093023255816,
760
+ "NROI_recall": 0.9308056872037914,
761
+ "NROI_precision": 0.9460500963391136,
762
+ "fold": 1
763
+ },
764
+ {
765
+ "mcc": 0.8422600108364161,
766
+ "macro_f1": 0.7221573846990976,
767
+ "MT_recall": 0.9013157894736842,
768
+ "MT_precision": 0.927765237020316,
769
+ "NML_recall": 0.5102040816326531,
770
+ "NML_precision": 0.1968503937007874,
771
+ "NROI_recall": 0.943524829600779,
772
+ "NROI_precision": 0.9938461538461538,
773
+ "fold": 2
774
+ },
775
+ {
776
+ "mcc": 0.7818467734790953,
777
+ "macro_f1": 0.7038866565186006,
778
+ "MT_recall": 0.8214676889375685,
779
+ "MT_precision": 0.9689922480620154,
780
+ "NML_recall": 0.86,
781
+ "NML_precision": 0.16996047430830039,
782
+ "NROI_recall": 0.9111721611721612,
783
+ "NROI_precision": 0.9678988326848249,
784
+ "fold": 3
785
+ },
786
+ {
787
+ "mcc": 0.7921101623535759,
788
+ "macro_f1": 0.6999385071520852,
789
+ "MT_recall": 0.8400876232201533,
790
+ "MT_precision": 0.9376528117359413,
791
+ "NML_recall": 0.5686274509803921,
792
+ "NML_precision": 0.1746987951807229,
793
+ "NROI_recall": 0.9371980676328503,
794
+ "NROI_precision": 0.9556650246305419,
795
+ "fold": 4
796
+ }
797
+ ],
798
+ "cv_means": {
799
+ "MCC": 0.8353775501991889,
800
+ "MCC_std": 0.04729528929189374,
801
+ "macro_f1": 0.7416349807688337,
802
+ "MT_recall": 0.8812145712034741,
803
+ "MT_precision": 0.9503911694507561,
804
+ "NML_recall": 0.6503785514205681,
805
+ "NML_precision": 0.2546113360757781,
806
+ "NROI_recall": 0.9432029953492325,
807
+ "NROI_precision": 0.9698484196043923
808
+ }
809
+ },
810
+ "avg_softmax": {
811
+ "label": "ens_plain_avg_softmax_cv",
812
+ "folds": [
813
+ {
814
+ "mcc": 0.940383641133645,
815
+ "macro_f1": 0.7705245324742672,
816
+ "MT_recall": 0.9780701754385965,
817
+ "MT_precision": 0.9643243243243244,
818
+ "NML_recall": 0.2653061224489796,
819
+ "NML_precision": 0.52,
820
+ "NROI_recall": 0.994269340974212,
821
+ "NROI_precision": 0.9839319470699432,
822
+ "fold": 0
823
+ },
824
+ {
825
+ "mcc": 0.8715931091518556,
826
+ "macro_f1": 0.8127654158427232,
827
+ "MT_recall": 0.9418859649122807,
828
+ "MT_precision": 0.927645788336933,
829
+ "NML_recall": 0.44,
830
+ "NML_precision": 0.7586206896551724,
831
+ "NROI_recall": 0.9497630331753555,
832
+ "NROI_precision": 0.943502824858757,
833
+ "fold": 1
834
+ },
835
+ {
836
+ "mcc": 0.88447561481716,
837
+ "macro_f1": 0.7248604169294769,
838
+ "MT_recall": 0.9605263157894737,
839
+ "MT_precision": 0.9153605015673981,
840
+ "NML_recall": 0.22448979591836735,
841
+ "NML_precision": 0.3333333333333333,
842
+ "NROI_recall": 0.9552093476144109,
843
+ "NROI_precision": 0.9829659318637275,
844
+ "fold": 2
845
+ },
846
+ {
847
+ "mcc": 0.8744098876128987,
848
+ "macro_f1": 0.7678741479976162,
849
+ "MT_recall": 0.9364731653888281,
850
+ "MT_precision": 0.9385290889132821,
851
+ "NML_recall": 0.46,
852
+ "NML_precision": 0.36507936507936506,
853
+ "NROI_recall": 0.9542124542124543,
854
+ "NROI_precision": 0.9639222941720629,
855
+ "fold": 3
856
+ },
857
+ {
858
+ "mcc": 0.8596809641633102,
859
+ "macro_f1": 0.6561893987635757,
860
+ "MT_recall": 0.9342825848849945,
861
+ "MT_precision": 0.9142550911039657,
862
+ "NML_recall": 0.058823529411764705,
863
+ "NML_precision": 0.15789473684210525,
864
+ "NROI_recall": 0.9642512077294686,
865
+ "NROI_precision": 0.9531996179560649,
866
+ "fold": 4
867
+ }
868
+ ],
869
+ "cv_means": {
870
+ "MCC": 0.8861086433757739,
871
+ "MCC_std": 0.028264557355996926,
872
+ "macro_f1": 0.7464427824015318,
873
+ "MT_recall": 0.9502476412828347,
874
+ "MT_precision": 0.9320229588491806,
875
+ "NML_recall": 0.28972388955582234,
876
+ "NML_precision": 0.4269856249819952,
877
+ "NROI_recall": 0.9635410767411802,
878
+ "NROI_precision": 0.9655045231841111
879
+ }
880
+ }
881
+ },
882
+ "best_cv": {
883
+ "label": "ens_plain_best_cv",
884
+ "folds": [
885
+ {
886
+ "mcc": 0.940383641133645,
887
+ "macro_f1": 0.7705245324742672,
888
+ "MT_recall": 0.9780701754385965,
889
+ "MT_precision": 0.9643243243243244,
890
+ "NML_recall": 0.2653061224489796,
891
+ "NML_precision": 0.52,
892
+ "NROI_recall": 0.994269340974212,
893
+ "NROI_precision": 0.9839319470699432,
894
+ "fold": 0
895
+ },
896
+ {
897
+ "mcc": 0.8715931091518556,
898
+ "macro_f1": 0.8127654158427232,
899
+ "MT_recall": 0.9418859649122807,
900
+ "MT_precision": 0.927645788336933,
901
+ "NML_recall": 0.44,
902
+ "NML_precision": 0.7586206896551724,
903
+ "NROI_recall": 0.9497630331753555,
904
+ "NROI_precision": 0.943502824858757,
905
+ "fold": 1
906
+ },
907
+ {
908
+ "mcc": 0.88447561481716,
909
+ "macro_f1": 0.7248604169294769,
910
+ "MT_recall": 0.9605263157894737,
911
+ "MT_precision": 0.9153605015673981,
912
+ "NML_recall": 0.22448979591836735,
913
+ "NML_precision": 0.3333333333333333,
914
+ "NROI_recall": 0.9552093476144109,
915
+ "NROI_precision": 0.9829659318637275,
916
+ "fold": 2
917
+ },
918
+ {
919
+ "mcc": 0.8744098876128987,
920
+ "macro_f1": 0.7678741479976162,
921
+ "MT_recall": 0.9364731653888281,
922
+ "MT_precision": 0.9385290889132821,
923
+ "NML_recall": 0.46,
924
+ "NML_precision": 0.36507936507936506,
925
+ "NROI_recall": 0.9542124542124543,
926
+ "NROI_precision": 0.9639222941720629,
927
+ "fold": 3
928
+ },
929
+ {
930
+ "mcc": 0.8596809641633102,
931
+ "macro_f1": 0.6561893987635757,
932
+ "MT_recall": 0.9342825848849945,
933
+ "MT_precision": 0.9142550911039657,
934
+ "NML_recall": 0.058823529411764705,
935
+ "NML_precision": 0.15789473684210525,
936
+ "NROI_recall": 0.9642512077294686,
937
+ "NROI_precision": 0.9531996179560649,
938
+ "fold": 4
939
+ }
940
+ ],
941
+ "cv_means": {
942
+ "MCC": 0.8861086433757739,
943
+ "MCC_std": 0.028264557355996926,
944
+ "macro_f1": 0.7464427824015318,
945
+ "MT_recall": 0.9502476412828347,
946
+ "MT_precision": 0.9320229588491806,
947
+ "NML_recall": 0.28972388955582234,
948
+ "NML_precision": 0.4269856249819952,
949
+ "NROI_recall": 0.9635410767411802,
950
+ "NROI_precision": 0.9655045231841111
951
+ }
952
+ },
953
+ "best_method": "avg_softmax",
954
+ "best_final": {
955
+ "mcc": 0.9075512462454951,
956
+ "macro_f1": 0.7615222630862176,
957
+ "MT_recall": 0.9642126789366053,
958
+ "MT_precision": 0.955420466058764,
959
+ "NML_recall": 0.2830188679245283,
960
+ "NML_precision": 0.4838709677419355,
961
+ "NROI_recall": 0.9732381801962533,
962
+ "NROI_precision": 0.9620811287477954,
963
+ "label": "ens_plain_best_test"
964
+ },
965
+ "methods_final": {
966
+ "logreg_logits_balanced": {
967
+ "mcc": 0.884517905204319,
968
+ "macro_f1": 0.7915522517961128,
969
+ "MT_recall": 0.9079754601226994,
970
+ "MT_precision": 0.9790518191841234,
971
+ "NML_recall": 0.7924528301886793,
972
+ "NML_precision": 0.32558139534883723,
973
+ "NROI_recall": 0.9687778768956289,
974
+ "NROI_precision": 0.9731182795698925,
975
+ "label": "ens_plain_logreg_logits_balanced_test"
976
+ },
977
+ "logreg_softmax_balanced": {
978
+ "mcc": 0.9053484772466982,
979
+ "macro_f1": 0.8209345218510951,
980
+ "MT_recall": 0.9274028629856851,
981
+ "MT_precision": 0.9869423286180631,
982
+ "NML_recall": 0.8113207547169812,
983
+ "NML_precision": 0.39814814814814814,
984
+ "NROI_recall": 0.9741302408563782,
985
+ "NROI_precision": 0.9706666666666667,
986
+ "label": "ens_plain_logreg_softmax_balanced_test"
987
+ },
988
+ "avg_softmax": {
989
+ "mcc": 0.9075512462454951,
990
+ "macro_f1": 0.7615222630862176,
991
+ "MT_recall": 0.9642126789366053,
992
+ "MT_precision": 0.955420466058764,
993
+ "NML_recall": 0.2830188679245283,
994
+ "NML_precision": 0.4838709677419355,
995
+ "NROI_recall": 0.9732381801962533,
996
+ "NROI_precision": 0.9620811287477954,
997
+ "label": "ens_plain_avg_softmax_test"
998
+ }
999
+ }
1000
+ },
1001
+ "ensemble_crt": {
1002
+ "methods_cv": {
1003
+ "logreg_logits_balanced": {
1004
+ "label": "ens_crt_logreg_logits_balanced_cv",
1005
+ "folds": [
1006
+ {
1007
+ "mcc": 0.8709933056770047,
1008
+ "macro_f1": 0.7501083498178573,
1009
+ "MT_recall": 0.8640350877192983,
1010
+ "MT_precision": 0.9837702871410736,
1011
+ "NML_recall": 0.6938775510204082,
1012
+ "NML_precision": 0.22666666666666666,
1013
+ "NROI_recall": 0.9933142311365807,
1014
+ "NROI_precision": 0.9839167455061495,
1015
+ "fold": 0
1016
+ },
1017
+ {
1018
+ "mcc": 0.5722950416531528,
1019
+ "macro_f1": 0.5558070728141032,
1020
+ "MT_recall": 0.44627192982456143,
1021
+ "MT_precision": 0.8984547461368654,
1022
+ "NML_recall": 0.9,
1023
+ "NML_precision": 0.08050089445438283,
1024
+ "NROI_recall": 0.9014218009478673,
1025
+ "NROI_precision": 0.9462686567164179,
1026
+ "fold": 1
1027
+ },
1028
+ {
1029
+ "mcc": 0.8320541275421974,
1030
+ "macro_f1": 0.7274388020691958,
1031
+ "MT_recall": 0.8826754385964912,
1032
+ "MT_precision": 0.9231651376146789,
1033
+ "NML_recall": 0.5714285714285714,
1034
+ "NML_precision": 0.21705426356589147,
1035
+ "NROI_recall": 0.9464459591041869,
1036
+ "NROI_precision": 0.9848024316109423,
1037
+ "fold": 2
1038
+ },
1039
+ {
1040
+ "mcc": 0.7158310711251602,
1041
+ "macro_f1": 0.658809286850686,
1042
+ "MT_recall": 0.7185104052573932,
1043
+ "MT_precision": 0.9576642335766423,
1044
+ "NML_recall": 0.92,
1045
+ "NML_precision": 0.12602739726027398,
1046
+ "NROI_recall": 0.8965201465201466,
1047
+ "NROI_precision": 0.9741293532338309,
1048
+ "fold": 3
1049
+ },
1050
+ {
1051
+ "mcc": 0.7225753047899428,
1052
+ "macro_f1": 0.6298225224086198,
1053
+ "MT_recall": 0.8214676889375685,
1054
+ "MT_precision": 0.9168704156479217,
1055
+ "NML_recall": 0.29411764705882354,
1056
+ "NML_precision": 0.06302521008403361,
1057
+ "NROI_recall": 0.8782608695652174,
1058
+ "NROI_precision": 0.9639448568398727,
1059
+ "fold": 4
1060
+ }
1061
+ ],
1062
+ "cv_means": {
1063
+ "MCC": 0.7427497701574917,
1064
+ "MCC_std": 0.10450656680839478,
1065
+ "macro_f1": 0.6643972067920925,
1066
+ "MT_recall": 0.7465921100670625,
1067
+ "MT_precision": 0.9359849640234363,
1068
+ "NML_recall": 0.6758847539015606,
1069
+ "NML_precision": 0.14265488640624974,
1070
+ "NROI_recall": 0.9231926014547998,
1071
+ "NROI_precision": 0.9706124087814427
1072
+ }
1073
+ },
1074
+ "logreg_softmax_balanced": {
1075
+ "label": "ens_crt_logreg_softmax_balanced_cv",
1076
+ "folds": [
1077
+ {
1078
+ "mcc": 0.9003580888226094,
1079
+ "macro_f1": 0.7820422615472552,
1080
+ "MT_recall": 0.9067982456140351,
1081
+ "MT_precision": 0.9810201660735468,
1082
+ "NML_recall": 0.673469387755102,
1083
+ "NML_precision": 0.3,
1084
+ "NROI_recall": 0.9923591212989494,
1085
+ "NROI_precision": 0.9848341232227488,
1086
+ "fold": 0
1087
+ },
1088
+ {
1089
+ "mcc": 0.7884422129090666,
1090
+ "macro_f1": 0.715683631503666,
1091
+ "MT_recall": 0.8475877192982456,
1092
+ "MT_precision": 0.9473039215686274,
1093
+ "NML_recall": 0.74,
1094
+ "NML_precision": 0.20555555555555555,
1095
+ "NROI_recall": 0.9156398104265403,
1096
+ "NROI_precision": 0.9461312438785504,
1097
+ "fold": 1
1098
+ },
1099
+ {
1100
+ "mcc": 0.8572479648324871,
1101
+ "macro_f1": 0.7419248003814283,
1102
+ "MT_recall": 0.9133771929824561,
1103
+ "MT_precision": 0.9245283018867925,
1104
+ "NML_recall": 0.4897959183673469,
1105
+ "NML_precision": 0.25806451612903225,
1106
+ "NROI_recall": 0.9532619279454723,
1107
+ "NROI_precision": 0.9849094567404426,
1108
+ "fold": 2
1109
+ },
1110
+ {
1111
+ "mcc": 0.7736344444415194,
1112
+ "macro_f1": 0.700954522409364,
1113
+ "MT_recall": 0.8389923329682366,
1114
+ "MT_precision": 0.964735516372796,
1115
+ "NML_recall": 0.92,
1116
+ "NML_precision": 0.16487455197132617,
1117
+ "NROI_recall": 0.8791208791208791,
1118
+ "NROI_precision": 0.9775967413441955,
1119
+ "fold": 3
1120
+ },
1121
+ {
1122
+ "mcc": 0.7445040911785757,
1123
+ "macro_f1": 0.6429495992807898,
1124
+ "MT_recall": 0.8433734939759037,
1125
+ "MT_precision": 0.9299516908212561,
1126
+ "NML_recall": 0.3333333333333333,
1127
+ "NML_precision": 0.07234042553191489,
1128
+ "NROI_recall": 0.881159420289855,
1129
+ "NROI_precision": 0.9743589743589743,
1130
+ "fold": 4
1131
+ }
1132
+ ],
1133
+ "cv_means": {
1134
+ "MCC": 0.8128373604368516,
1135
+ "MCC_std": 0.05732993496058185,
1136
+ "macro_f1": 0.7167109630245007,
1137
+ "MT_recall": 0.8700257969677756,
1138
+ "MT_precision": 0.9495079193446039,
1139
+ "NML_recall": 0.6313197278911564,
1140
+ "NML_precision": 0.20016700983756577,
1141
+ "NROI_recall": 0.9243082318163391,
1142
+ "NROI_precision": 0.9735661079089823
1143
+ }
1144
+ },
1145
+ "avg_softmax": {
1146
+ "label": "ens_crt_avg_softmax_cv",
1147
+ "folds": [
1148
+ {
1149
+ "mcc": 0.9242729722844191,
1150
+ "macro_f1": 0.789111485874154,
1151
+ "MT_recall": 0.9473684210526315,
1152
+ "MT_precision": 0.9718785151856018,
1153
+ "NML_recall": 0.4897959183673469,
1154
+ "NML_precision": 0.36363636363636365,
1155
+ "NROI_recall": 0.9933142311365807,
1156
+ "NROI_precision": 0.9876543209876543,
1157
+ "fold": 0
1158
+ },
1159
+ {
1160
+ "mcc": 0.8385585928078274,
1161
+ "macro_f1": 0.7803452587993434,
1162
+ "MT_recall": 0.9111842105263158,
1163
+ "MT_precision": 0.9284916201117318,
1164
+ "NML_recall": 0.7,
1165
+ "NML_precision": 0.3684210526315789,
1166
+ "NROI_recall": 0.9260663507109005,
1167
+ "NROI_precision": 0.9513145082765336,
1168
+ "fold": 1
1169
+ },
1170
+ {
1171
+ "mcc": 0.8726117618357568,
1172
+ "macro_f1": 0.7641383950709629,
1173
+ "MT_recall": 0.9407894736842105,
1174
+ "MT_precision": 0.9206008583690987,
1175
+ "NML_recall": 0.46938775510204084,
1176
+ "NML_precision": 0.34328358208955223,
1177
+ "NROI_recall": 0.9474196689386563,
1178
+ "NROI_precision": 0.9838220424671386,
1179
+ "fold": 2
1180
+ },
1181
+ {
1182
+ "mcc": 0.817983570090549,
1183
+ "macro_f1": 0.7285785632292758,
1184
+ "MT_recall": 0.9058050383351588,
1185
+ "MT_precision": 0.9462242562929062,
1186
+ "NML_recall": 0.76,
1187
+ "NML_precision": 0.20652173913043478,
1188
+ "NROI_recall": 0.8946886446886447,
1189
+ "NROI_precision": 0.9799398194583752,
1190
+ "fold": 3
1191
+ },
1192
+ {
1193
+ "mcc": 0.7511652108597198,
1194
+ "macro_f1": 0.6301362729576805,
1195
+ "MT_recall": 0.8718510405257394,
1196
+ "MT_precision": 0.9149425287356322,
1197
+ "NML_recall": 0.17647058823529413,
1198
+ "NML_precision": 0.047619047619047616,
1199
+ "NROI_recall": 0.8801932367149758,
1200
+ "NROI_precision": 0.9691489361702128,
1201
+ "fold": 4
1202
+ }
1203
+ ],
1204
+ "cv_means": {
1205
+ "MCC": 0.8409184215756543,
1206
+ "MCC_std": 0.05751463114543797,
1207
+ "macro_f1": 0.7384619951862833,
1208
+ "MT_recall": 0.9153996368248112,
1209
+ "MT_precision": 0.9364275557389942,
1210
+ "NML_recall": 0.5191308523409364,
1211
+ "NML_precision": 0.2658963570213954,
1212
+ "NROI_recall": 0.9283364264379514,
1213
+ "NROI_precision": 0.974375925471983
1214
+ }
1215
+ }
1216
+ },
1217
+ "best_cv": {
1218
+ "label": "ens_crt_best_cv",
1219
+ "folds": [
1220
+ {
1221
+ "mcc": 0.9242729722844191,
1222
+ "macro_f1": 0.789111485874154,
1223
+ "MT_recall": 0.9473684210526315,
1224
+ "MT_precision": 0.9718785151856018,
1225
+ "NML_recall": 0.4897959183673469,
1226
+ "NML_precision": 0.36363636363636365,
1227
+ "NROI_recall": 0.9933142311365807,
1228
+ "NROI_precision": 0.9876543209876543,
1229
+ "fold": 0
1230
+ },
1231
+ {
1232
+ "mcc": 0.8385585928078274,
1233
+ "macro_f1": 0.7803452587993434,
1234
+ "MT_recall": 0.9111842105263158,
1235
+ "MT_precision": 0.9284916201117318,
1236
+ "NML_recall": 0.7,
1237
+ "NML_precision": 0.3684210526315789,
1238
+ "NROI_recall": 0.9260663507109005,
1239
+ "NROI_precision": 0.9513145082765336,
1240
+ "fold": 1
1241
+ },
1242
+ {
1243
+ "mcc": 0.8726117618357568,
1244
+ "macro_f1": 0.7641383950709629,
1245
+ "MT_recall": 0.9407894736842105,
1246
+ "MT_precision": 0.9206008583690987,
1247
+ "NML_recall": 0.46938775510204084,
1248
+ "NML_precision": 0.34328358208955223,
1249
+ "NROI_recall": 0.9474196689386563,
1250
+ "NROI_precision": 0.9838220424671386,
1251
+ "fold": 2
1252
+ },
1253
+ {
1254
+ "mcc": 0.817983570090549,
1255
+ "macro_f1": 0.7285785632292758,
1256
+ "MT_recall": 0.9058050383351588,
1257
+ "MT_precision": 0.9462242562929062,
1258
+ "NML_recall": 0.76,
1259
+ "NML_precision": 0.20652173913043478,
1260
+ "NROI_recall": 0.8946886446886447,
1261
+ "NROI_precision": 0.9799398194583752,
1262
+ "fold": 3
1263
+ },
1264
+ {
1265
+ "mcc": 0.7511652108597198,
1266
+ "macro_f1": 0.6301362729576805,
1267
+ "MT_recall": 0.8718510405257394,
1268
+ "MT_precision": 0.9149425287356322,
1269
+ "NML_recall": 0.17647058823529413,
1270
+ "NML_precision": 0.047619047619047616,
1271
+ "NROI_recall": 0.8801932367149758,
1272
+ "NROI_precision": 0.9691489361702128,
1273
+ "fold": 4
1274
+ }
1275
+ ],
1276
+ "cv_means": {
1277
+ "MCC": 0.8409184215756543,
1278
+ "MCC_std": 0.05751463114543797,
1279
+ "macro_f1": 0.7384619951862833,
1280
+ "MT_recall": 0.9153996368248112,
1281
+ "MT_precision": 0.9364275557389942,
1282
+ "NML_recall": 0.5191308523409364,
1283
+ "NML_precision": 0.2658963570213954,
1284
+ "NROI_recall": 0.9283364264379514,
1285
+ "NROI_precision": 0.974375925471983
1286
+ }
1287
+ },
1288
+ "best_method": "avg_softmax",
1289
+ "best_final": {
1290
+ "mcc": 0.8986285866331987,
1291
+ "macro_f1": 0.7870065958764059,
1292
+ "MT_recall": 0.950920245398773,
1293
+ "MT_precision": 0.9607438016528925,
1294
+ "NML_recall": 0.5283018867924528,
1295
+ "NML_precision": 0.37333333333333335,
1296
+ "NROI_recall": 0.9625334522747547,
1297
+ "NROI_precision": 0.9729486023444545,
1298
+ "label": "ens_crt_best_test"
1299
+ },
1300
+ "methods_final": {
1301
+ "logreg_logits_balanced": {
1302
+ "mcc": 0.8113816534564904,
1303
+ "macro_f1": 0.7026872849336631,
1304
+ "MT_recall": 0.8312883435582822,
1305
+ "MT_precision": 0.9806996381182147,
1306
+ "NML_recall": 0.6226415094339622,
1307
+ "NML_precision": 0.15492957746478872,
1308
+ "NROI_recall": 0.9553969669937555,
1309
+ "NROI_precision": 0.9648648648648649,
1310
+ "label": "ens_crt_logreg_logits_balanced_test"
1311
+ },
1312
+ "logreg_softmax_balanced": {
1313
+ "mcc": 0.8779595877368471,
1314
+ "macro_f1": 0.7793891042915391,
1315
+ "MT_recall": 0.9141104294478528,
1316
+ "MT_precision": 0.9770491803278688,
1317
+ "NML_recall": 0.7547169811320755,
1318
+ "NML_precision": 0.29850746268656714,
1319
+ "NROI_recall": 0.9580731489741302,
1320
+ "NROI_precision": 0.9737080689029919,
1321
+ "label": "ens_crt_logreg_softmax_balanced_test"
1322
+ },
1323
+ "avg_softmax": {
1324
+ "mcc": 0.8986285866331987,
1325
+ "macro_f1": 0.7870065958764059,
1326
+ "MT_recall": 0.950920245398773,
1327
+ "MT_precision": 0.9607438016528925,
1328
+ "NML_recall": 0.5283018867924528,
1329
+ "NML_precision": 0.37333333333333335,
1330
+ "NROI_recall": 0.9625334522747547,
1331
+ "NROI_precision": 0.9729486023444545,
1332
+ "label": "ens_crt_avg_softmax_test"
1333
+ }
1334
+ }
1335
+ }
1336
+ }
stage1v2_final/gpu_wait.log ADDED
@@ -0,0 +1,325 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === GPU Wait Monitor ===
2
+ Threshold: 20% util (3 consecutive)
3
+ Resize: letterbox
4
+ Started monitoring: Wed Aug 19 12:21:38 AM HKT 2026
5
+
6
+ Wed Aug 19 12:21:38 AM HKT 2026: GPU util=96% — waiting...
7
+ Wed Aug 19 12:22:38 AM HKT 2026: GPU util=96% — waiting...
8
+ Wed Aug 19 12:23:38 AM HKT 2026: GPU util=96% — waiting...
9
+ Wed Aug 19 12:24:38 AM HKT 2026: GPU util=96% — waiting...
10
+ Wed Aug 19 12:25:38 AM HKT 2026: GPU util=96% — waiting...
11
+ Wed Aug 19 12:26:38 AM HKT 2026: GPU util=91% — waiting...
12
+ Wed Aug 19 12:27:38 AM HKT 2026: GPU util=96% — waiting...
13
+ Wed Aug 19 12:28:39 AM HKT 2026: GPU util=96% — waiting...
14
+ Wed Aug 19 12:29:39 AM HKT 2026: GPU util=96% — waiting...
15
+ Wed Aug 19 12:30:39 AM HKT 2026: GPU util=96% — waiting...
16
+ Wed Aug 19 12:31:39 AM HKT 2026: GPU util=96% — waiting...
17
+ Wed Aug 19 12:32:39 AM HKT 2026: GPU util=96% — waiting...
18
+ Wed Aug 19 12:33:39 AM HKT 2026: GPU util=96% — waiting...
19
+ Wed Aug 19 12:34:39 AM HKT 2026: GPU util=93% — waiting...
20
+ Wed Aug 19 12:35:39 AM HKT 2026: GPU util=96% — waiting...
21
+ Wed Aug 19 12:36:39 AM HKT 2026: GPU util=96% — waiting...
22
+ Wed Aug 19 12:37:39 AM HKT 2026: GPU util=96% — waiting...
23
+ Wed Aug 19 12:38:39 AM HKT 2026: GPU util=96% — waiting...
24
+ Wed Aug 19 12:39:39 AM HKT 2026: GPU util=96% — waiting...
25
+ Wed Aug 19 12:40:39 AM HKT 2026: GPU util=96% — waiting...
26
+ Wed Aug 19 12:41:39 AM HKT 2026: GPU util=96% — waiting...
27
+ Wed Aug 19 12:42:39 AM HKT 2026: GPU util=96% — waiting...
28
+ Wed Aug 19 12:43:39 AM HKT 2026: GPU util=96% — waiting...
29
+ Wed Aug 19 12:44:40 AM HKT 2026: GPU util=96% — waiting...
30
+ Wed Aug 19 12:45:40 AM HKT 2026: GPU util=96% — waiting...
31
+ Wed Aug 19 12:46:40 AM HKT 2026: GPU util=96% — waiting...
32
+ Wed Aug 19 12:47:40 AM HKT 2026: GPU util=96% — waiting...
33
+ Wed Aug 19 12:48:40 AM HKT 2026: GPU util=96% — waiting...
34
+ Wed Aug 19 12:49:40 AM HKT 2026: GPU util=96% — waiting...
35
+ Wed Aug 19 12:50:40 AM HKT 2026: GPU util=96% — waiting...
36
+ Wed Aug 19 12:51:40 AM HKT 2026: GPU util=96% — waiting...
37
+ Wed Aug 19 12:52:40 AM HKT 2026: GPU util=96% — waiting...
38
+ Wed Aug 19 12:53:40 AM HKT 2026: GPU util=0% — low count: 1/3
39
+ Wed Aug 19 12:54:40 AM HKT 2026: GPU util=3% — low count: 2/3
40
+ Wed Aug 19 12:55:40 AM HKT 2026: GPU util=96% — resetting counter
41
+ Wed Aug 19 12:56:40 AM HKT 2026: GPU util=96% — waiting...
42
+ Wed Aug 19 12:57:40 AM HKT 2026: GPU util=96% — waiting...
43
+ Wed Aug 19 12:58:40 AM HKT 2026: GPU util=96% — waiting...
44
+ Wed Aug 19 12:59:40 AM HKT 2026: GPU util=96% — waiting...
45
+ Wed Aug 19 01:00:40 AM HKT 2026: GPU util=94% — waiting...
46
+ Wed Aug 19 01:01:40 AM HKT 2026: GPU util=96% — waiting...
47
+ Wed Aug 19 01:02:41 AM HKT 2026: GPU util=96% — waiting...
48
+ Wed Aug 19 01:03:41 AM HKT 2026: GPU util=96% — waiting...
49
+ Wed Aug 19 01:04:41 AM HKT 2026: GPU util=96% — waiting...
50
+ Wed Aug 19 01:05:41 AM HKT 2026: GPU util=96% — waiting...
51
+ Wed Aug 19 01:06:41 AM HKT 2026: GPU util=96% — waiting...
52
+ Wed Aug 19 01:07:41 AM HKT 2026: GPU util=96% — waiting...
53
+ Wed Aug 19 01:08:41 AM HKT 2026: GPU util=93% — waiting...
54
+ Wed Aug 19 01:09:41 AM HKT 2026: GPU util=96% — waiting...
55
+ Wed Aug 19 01:10:41 AM HKT 2026: GPU util=96% — waiting...
56
+ Wed Aug 19 01:11:41 AM HKT 2026: GPU util=96% — waiting...
57
+ Wed Aug 19 01:12:41 AM HKT 2026: GPU util=96% — waiting...
58
+ Wed Aug 19 01:13:41 AM HKT 2026: GPU util=96% — waiting...
59
+ Wed Aug 19 01:14:41 AM HKT 2026: GPU util=96% — waiting...
60
+ Wed Aug 19 01:15:41 AM HKT 2026: GPU util=96% — waiting...
61
+ Wed Aug 19 01:16:41 AM HKT 2026: GPU util=96% — waiting...
62
+ Wed Aug 19 01:17:41 AM HKT 2026: GPU util=96% — waiting...
63
+ Wed Aug 19 01:18:41 AM HKT 2026: GPU util=96% — waiting...
64
+ Wed Aug 19 01:19:42 AM HKT 2026: GPU util=96% — waiting...
65
+ Wed Aug 19 01:20:42 AM HKT 2026: GPU util=96% — waiting...
66
+ Wed Aug 19 01:21:42 AM HKT 2026: GPU util=96% — waiting...
67
+ Wed Aug 19 01:22:42 AM HKT 2026: GPU util=95% — waiting...
68
+ Wed Aug 19 01:23:42 AM HKT 2026: GPU util=96% — waiting...
69
+ Wed Aug 19 01:24:42 AM HKT 2026: GPU util=96% — waiting...
70
+ Wed Aug 19 01:25:42 AM HKT 2026: GPU util=96% — waiting...
71
+ Wed Aug 19 01:26:42 AM HKT 2026: GPU util=96% — waiting...
72
+ Wed Aug 19 01:27:42 AM HKT 2026: GPU util=79% — waiting...
73
+ Wed Aug 19 01:28:42 AM HKT 2026: GPU util=0% — low count: 1/3
74
+ Wed Aug 19 01:29:42 AM HKT 2026: GPU util=96% — resetting counter
75
+ Wed Aug 19 01:30:42 AM HKT 2026: GPU util=96% — waiting...
76
+ Wed Aug 19 01:31:42 AM HKT 2026: GPU util=96% — waiting...
77
+ Wed Aug 19 01:32:42 AM HKT 2026: GPU util=94% — waiting...
78
+ Wed Aug 19 01:33:42 AM HKT 2026: GPU util=96% — waiting...
79
+ Wed Aug 19 01:34:42 AM HKT 2026: GPU util=96% — waiting...
80
+ Wed Aug 19 01:35:42 AM HKT 2026: GPU util=96% — waiting...
81
+ Wed Aug 19 01:36:43 AM HKT 2026: GPU util=96% — waiting...
82
+ Wed Aug 19 01:37:43 AM HKT 2026: GPU util=96% — waiting...
83
+ Wed Aug 19 01:38:43 AM HKT 2026: GPU util=96% — waiting...
84
+ Wed Aug 19 01:39:43 AM HKT 2026: GPU util=96% — waiting...
85
+ Wed Aug 19 01:40:43 AM HKT 2026: GPU util=96% — waiting...
86
+ Wed Aug 19 01:41:43 AM HKT 2026: GPU util=96% — waiting...
87
+ Wed Aug 19 01:42:43 AM HKT 2026: GPU util=96% — waiting...
88
+ Wed Aug 19 01:43:43 AM HKT 2026: GPU util=96% — waiting...
89
+ Wed Aug 19 01:44:43 AM HKT 2026: GPU util=96% — waiting...
90
+ Wed Aug 19 01:45:43 AM HKT 2026: GPU util=96% — waiting...
91
+ Wed Aug 19 01:46:43 AM HKT 2026: GPU util=0% — low count: 1/3
92
+ Wed Aug 19 01:47:43 AM HKT 2026: GPU util=96% — resetting counter
93
+ Wed Aug 19 01:48:43 AM HKT 2026: GPU util=96% — waiting...
94
+ Wed Aug 19 01:49:43 AM HKT 2026: GPU util=96% — waiting...
95
+ Wed Aug 19 01:50:43 AM HKT 2026: GPU util=96% — waiting...
96
+ Wed Aug 19 01:51:43 AM HKT 2026: GPU util=96% — waiting...
97
+ Wed Aug 19 01:52:43 AM HKT 2026: GPU util=96% — waiting...
98
+ Wed Aug 19 01:53:44 AM HKT 2026: GPU util=96% — waiting...
99
+ Wed Aug 19 01:54:44 AM HKT 2026: GPU util=96% — waiting...
100
+ Wed Aug 19 01:55:44 AM HKT 2026: GPU util=96% — waiting...
101
+ Wed Aug 19 01:56:44 AM HKT 2026: GPU util=0% — low count: 1/3
102
+ Wed Aug 19 01:57:44 AM HKT 2026: GPU util=96% — resetting counter
103
+ Wed Aug 19 01:58:44 AM HKT 2026: GPU util=96% — waiting...
104
+ Wed Aug 19 01:59:44 AM HKT 2026: GPU util=96% — waiting...
105
+ Wed Aug 19 02:00:44 AM HKT 2026: GPU util=96% — waiting...
106
+ Wed Aug 19 02:01:44 AM HKT 2026: GPU util=96% — waiting...
107
+ Wed Aug 19 02:02:44 AM HKT 2026: GPU util=96% — waiting...
108
+ Wed Aug 19 02:03:44 AM HKT 2026: GPU util=96% — waiting...
109
+ Wed Aug 19 02:04:44 AM HKT 2026: GPU util=96% — waiting...
110
+ Wed Aug 19 02:05:44 AM HKT 2026: GPU util=95% — waiting...
111
+ Wed Aug 19 02:06:44 AM HKT 2026: GPU util=96% — waiting...
112
+ Wed Aug 19 02:07:44 AM HKT 2026: GPU util=96% — waiting...
113
+ Wed Aug 19 02:08:44 AM HKT 2026: GPU util=96% — waiting...
114
+ Wed Aug 19 02:09:44 AM HKT 2026: GPU util=94% — waiting...
115
+ Wed Aug 19 02:10:45 AM HKT 2026: GPU util=96% — waiting...
116
+ Wed Aug 19 02:11:45 AM HKT 2026: GPU util=96% — waiting...
117
+ Wed Aug 19 02:12:45 AM HKT 2026: GPU util=96% — waiting...
118
+ Wed Aug 19 02:13:45 AM HKT 2026: GPU util=96% — waiting...
119
+ Wed Aug 19 02:14:45 AM HKT 2026: GPU util=96% — waiting...
120
+ Wed Aug 19 02:15:45 AM HKT 2026: GPU util=0% — low count: 1/3
121
+ Wed Aug 19 02:16:45 AM HKT 2026: GPU util=96% — resetting counter
122
+ Wed Aug 19 02:17:45 AM HKT 2026: GPU util=95% — waiting...
123
+ Wed Aug 19 02:18:45 AM HKT 2026: GPU util=93% — waiting...
124
+ Wed Aug 19 02:19:45 AM HKT 2026: GPU util=96% — waiting...
125
+ Wed Aug 19 02:20:45 AM HKT 2026: GPU util=95% — waiting...
126
+ Wed Aug 19 02:21:45 AM HKT 2026: GPU util=96% — waiting...
127
+ Wed Aug 19 02:22:45 AM HKT 2026: GPU util=96% — waiting...
128
+ Wed Aug 19 02:23:45 AM HKT 2026: GPU util=96% — waiting...
129
+ Wed Aug 19 02:24:45 AM HKT 2026: GPU util=96% — waiting...
130
+ Wed Aug 19 02:25:45 AM HKT 2026: GPU util=96% — waiting...
131
+ Wed Aug 19 02:26:45 AM HKT 2026: GPU util=96% — waiting...
132
+ Wed Aug 19 02:27:46 AM HKT 2026: GPU util=96% — waiting...
133
+ Wed Aug 19 02:28:46 AM HKT 2026: GPU util=96% — waiting...
134
+ Wed Aug 19 02:29:46 AM HKT 2026: GPU util=96% — waiting...
135
+ Wed Aug 19 02:30:46 AM HKT 2026: GPU util=96% — waiting...
136
+ Wed Aug 19 02:31:46 AM HKT 2026: GPU util=96% — waiting...
137
+ Wed Aug 19 02:32:46 AM HKT 2026: GPU util=96% — waiting...
138
+ Wed Aug 19 02:33:46 AM HKT 2026: GPU util=96% — waiting...
139
+ Wed Aug 19 02:34:46 AM HKT 2026: GPU util=96% — waiting...
140
+ Wed Aug 19 02:35:46 AM HKT 2026: GPU util=96% — waiting...
141
+ Wed Aug 19 02:36:46 AM HKT 2026: GPU util=96% — waiting...
142
+ Wed Aug 19 02:37:46 AM HKT 2026: GPU util=96% — waiting...
143
+ Wed Aug 19 02:38:46 AM HKT 2026: GPU util=96% — waiting...
144
+ Wed Aug 19 02:39:46 AM HKT 2026: GPU util=96% — waiting...
145
+ Wed Aug 19 02:40:46 AM HKT 2026: GPU util=96% — waiting...
146
+ Wed Aug 19 02:41:46 AM HKT 2026: GPU util=96% — waiting...
147
+ Wed Aug 19 02:42:46 AM HKT 2026: GPU util=91% — waiting...
148
+ Wed Aug 19 02:43:46 AM HKT 2026: GPU util=96% — waiting...
149
+ Wed Aug 19 02:44:47 AM HKT 2026: GPU util=96% — waiting...
150
+ Wed Aug 19 02:45:47 AM HKT 2026: GPU util=95% — waiting...
151
+ Wed Aug 19 02:46:47 AM HKT 2026: GPU util=96% — waiting...
152
+ Wed Aug 19 02:47:47 AM HKT 2026: GPU util=96% — waiting...
153
+ Wed Aug 19 02:48:47 AM HKT 2026: GPU util=96% — waiting...
154
+ Wed Aug 19 02:49:47 AM HKT 2026: GPU util=96% — waiting...
155
+ Wed Aug 19 02:50:47 AM HKT 2026: GPU util=96% — waiting...
156
+ Wed Aug 19 02:51:47 AM HKT 2026: GPU util=96% — waiting...
157
+ Wed Aug 19 02:52:47 AM HKT 2026: GPU util=96% — waiting...
158
+ Wed Aug 19 02:53:47 AM HKT 2026: GPU util=96% — waiting...
159
+ Wed Aug 19 02:54:47 AM HKT 2026: GPU util=95% — waiting...
160
+ Wed Aug 19 02:55:47 AM HKT 2026: GPU util=96% — waiting...
161
+ Wed Aug 19 02:56:47 AM HKT 2026: GPU util=96% — waiting...
162
+ Wed Aug 19 02:57:47 AM HKT 2026: GPU util=96% — waiting...
163
+ Wed Aug 19 02:58:47 AM HKT 2026: GPU util=0% — low count: 1/3
164
+ Wed Aug 19 02:59:47 AM HKT 2026: GPU util=0% — low count: 2/3
165
+ Wed Aug 19 03:00:47 AM HKT 2026: GPU util=96% — resetting counter
166
+ Wed Aug 19 03:01:47 AM HKT 2026: GPU util=96% — waiting...
167
+ Wed Aug 19 03:02:48 AM HKT 2026: GPU util=96% — waiting...
168
+ Wed Aug 19 03:03:48 AM HKT 2026: GPU util=96% — waiting...
169
+ Wed Aug 19 03:04:48 AM HKT 2026: GPU util=96% — waiting...
170
+ Wed Aug 19 03:05:48 AM HKT 2026: GPU util=96% — waiting...
171
+ Wed Aug 19 03:06:48 AM HKT 2026: GPU util=0% — low count: 1/3
172
+ Wed Aug 19 03:07:48 AM HKT 2026: GPU util=96% — resetting counter
173
+ Wed Aug 19 03:08:48 AM HKT 2026: GPU util=96% — waiting...
174
+ Wed Aug 19 03:09:48 AM HKT 2026: GPU util=96% — waiting...
175
+ Wed Aug 19 03:10:48 AM HKT 2026: GPU util=96% — waiting...
176
+ Wed Aug 19 03:11:48 AM HKT 2026: GPU util=96% — waiting...
177
+ Wed Aug 19 03:12:48 AM HKT 2026: GPU util=94% — waiting...
178
+ Wed Aug 19 03:13:48 AM HKT 2026: GPU util=96% — waiting...
179
+ Wed Aug 19 03:14:48 AM HKT 2026: GPU util=96% — waiting...
180
+ Wed Aug 19 03:15:48 AM HKT 2026: GPU util=96% — waiting...
181
+ Wed Aug 19 03:16:48 AM HKT 2026: GPU util=96% — waiting...
182
+ Wed Aug 19 03:17:48 AM HKT 2026: GPU util=96% — waiting...
183
+ Wed Aug 19 03:18:48 AM HKT 2026: GPU util=96% — waiting...
184
+ Wed Aug 19 03:19:49 AM HKT 2026: GPU util=96% — waiting...
185
+ Wed Aug 19 03:20:49 AM HKT 2026: GPU util=96% — waiting...
186
+ Wed Aug 19 03:21:49 AM HKT 2026: GPU util=96% — waiting...
187
+ Wed Aug 19 03:22:49 AM HKT 2026: GPU util=0% — low count: 1/3
188
+ Wed Aug 19 03:23:49 AM HKT 2026: GPU util=0% — low count: 2/3
189
+ Wed Aug 19 03:24:49 AM HKT 2026: GPU util=96% — resetting counter
190
+ Wed Aug 19 03:25:49 AM HKT 2026: GPU util=96% — waiting...
191
+ Wed Aug 19 03:26:49 AM HKT 2026: GPU util=96% — waiting...
192
+ Wed Aug 19 03:27:49 AM HKT 2026: GPU util=96% — waiting...
193
+ Wed Aug 19 03:28:49 AM HKT 2026: GPU util=96% — waiting...
194
+ Wed Aug 19 03:29:49 AM HKT 2026: GPU util=96% — waiting...
195
+ Wed Aug 19 03:30:49 AM HKT 2026: GPU util=96% — waiting...
196
+ Wed Aug 19 03:31:49 AM HKT 2026: GPU util=96% — waiting...
197
+ Wed Aug 19 03:32:49 AM HKT 2026: GPU util=96% — waiting...
198
+ Wed Aug 19 03:33:49 AM HKT 2026: GPU util=96% — waiting...
199
+ Wed Aug 19 03:34:49 AM HKT 2026: GPU util=95% — waiting...
200
+ Wed Aug 19 03:35:49 AM HKT 2026: GPU util=96% — waiting...
201
+ Wed Aug 19 03:36:50 AM HKT 2026: GPU util=96% — waiting...
202
+ Wed Aug 19 03:37:50 AM HKT 2026: GPU util=96% — waiting...
203
+ Wed Aug 19 03:38:50 AM HKT 2026: GPU util=96% — waiting...
204
+ Wed Aug 19 03:39:50 AM HKT 2026: GPU util=96% — waiting...
205
+ Wed Aug 19 03:40:50 AM HKT 2026: GPU util=94% — waiting...
206
+ Wed Aug 19 03:41:50 AM HKT 2026: GPU util=96% — waiting...
207
+ Wed Aug 19 03:42:50 AM HKT 2026: GPU util=96% — waiting...
208
+ Wed Aug 19 03:43:50 AM HKT 2026: GPU util=96% — waiting...
209
+ Wed Aug 19 03:44:50 AM HKT 2026: GPU util=96% — waiting...
210
+ Wed Aug 19 03:45:50 AM HKT 2026: GPU util=96% — waiting...
211
+ Wed Aug 19 03:46:50 AM HKT 2026: GPU util=96% — waiting...
212
+ Wed Aug 19 03:47:50 AM HKT 2026: GPU util=95% — waiting...
213
+ Wed Aug 19 03:48:50 AM HKT 2026: GPU util=96% — waiting...
214
+ Wed Aug 19 03:49:50 AM HKT 2026: GPU util=96% — waiting...
215
+ Wed Aug 19 03:50:50 AM HKT 2026: GPU util=96% — waiting...
216
+ Wed Aug 19 03:51:50 AM HKT 2026: GPU util=96% — waiting...
217
+ Wed Aug 19 03:52:51 AM HKT 2026: GPU util=96% — waiting...
218
+ Wed Aug 19 03:53:51 AM HKT 2026: GPU util=96% — waiting...
219
+ Wed Aug 19 03:54:51 AM HKT 2026: GPU util=94% — waiting...
220
+ Wed Aug 19 03:55:51 AM HKT 2026: GPU util=96% — waiting...
221
+ Wed Aug 19 03:56:51 AM HKT 2026: GPU util=96% — waiting...
222
+ Wed Aug 19 03:57:51 AM HKT 2026: GPU util=96% — waiting...
223
+ Wed Aug 19 03:58:51 AM HKT 2026: GPU util=85% — waiting...
224
+ Wed Aug 19 03:59:51 AM HKT 2026: GPU util=96% — waiting...
225
+ Wed Aug 19 04:00:51 AM HKT 2026: GPU util=96% — waiting...
226
+ Wed Aug 19 04:01:51 AM HKT 2026: GPU util=96% — waiting...
227
+ Wed Aug 19 04:02:51 AM HKT 2026: GPU util=96% — waiting...
228
+ Wed Aug 19 04:03:51 AM HKT 2026: GPU util=96% — waiting...
229
+ Wed Aug 19 04:04:51 AM HKT 2026: GPU util=96% — waiting...
230
+ Wed Aug 19 04:05:51 AM HKT 2026: GPU util=95% — waiting...
231
+ Wed Aug 19 04:06:51 AM HKT 2026: GPU util=96% — waiting...
232
+ Wed Aug 19 04:07:51 AM HKT 2026: GPU util=96% — waiting...
233
+ Wed Aug 19 04:08:52 AM HKT 2026: GPU util=96% — waiting...
234
+ Wed Aug 19 04:09:52 AM HKT 2026: GPU util=93% — waiting...
235
+ Wed Aug 19 04:10:52 AM HKT 2026: GPU util=94% — waiting...
236
+ Wed Aug 19 04:11:52 AM HKT 2026: GPU util=96% — waiting...
237
+ Wed Aug 19 04:12:52 AM HKT 2026: GPU util=96% — waiting...
238
+ Wed Aug 19 04:13:52 AM HKT 2026: GPU util=96% — waiting...
239
+ Wed Aug 19 04:14:52 AM HKT 2026: GPU util=96% — waiting...
240
+ Wed Aug 19 04:15:52 AM HKT 2026: GPU util=96% — waiting...
241
+ Wed Aug 19 04:16:52 AM HKT 2026: GPU util=96% — waiting...
242
+ Wed Aug 19 04:17:52 AM HKT 2026: GPU util=96% — waiting...
243
+ Wed Aug 19 04:18:52 AM HKT 2026: GPU util=96% — waiting...
244
+ Wed Aug 19 04:19:52 AM HKT 2026: GPU util=96% — waiting...
245
+ Wed Aug 19 04:20:52 AM HKT 2026: GPU util=96% — waiting...
246
+ Wed Aug 19 04:21:52 AM HKT 2026: GPU util=96% — waiting...
247
+ Wed Aug 19 04:22:52 AM HKT 2026: GPU util=96% — waiting...
248
+ Wed Aug 19 04:23:52 AM HKT 2026: GPU util=96% — waiting...
249
+ Wed Aug 19 04:24:52 AM HKT 2026: GPU util=96% — waiting...
250
+ Wed Aug 19 04:25:53 AM HKT 2026: GPU util=96% — waiting...
251
+ Wed Aug 19 04:26:53 AM HKT 2026: GPU util=96% — waiting...
252
+ Wed Aug 19 04:27:53 AM HKT 2026: GPU util=96% — waiting...
253
+ Wed Aug 19 04:28:53 AM HKT 2026: GPU util=94% — waiting...
254
+ Wed Aug 19 04:29:53 AM HKT 2026: GPU util=96% — waiting...
255
+ Wed Aug 19 04:30:53 AM HKT 2026: GPU util=96% — waiting...
256
+ Wed Aug 19 04:31:53 AM HKT 2026: GPU util=96% — waiting...
257
+ Wed Aug 19 04:32:53 AM HKT 2026: GPU util=96% — waiting...
258
+ Wed Aug 19 04:33:53 AM HKT 2026: GPU util=96% — waiting...
259
+ Wed Aug 19 04:34:53 AM HKT 2026: GPU util=96% — waiting...
260
+ Wed Aug 19 04:35:53 AM HKT 2026: GPU util=96% — waiting...
261
+ Wed Aug 19 04:36:53 AM HKT 2026: GPU util=96% — waiting...
262
+ Wed Aug 19 04:37:53 AM HKT 2026: GPU util=96% — waiting...
263
+ Wed Aug 19 04:38:53 AM HKT 2026: GPU util=96% — waiting...
264
+ Wed Aug 19 04:39:53 AM HKT 2026: GPU util=96% — waiting...
265
+ Wed Aug 19 04:40:53 AM HKT 2026: GPU util=96% — waiting...
266
+ Wed Aug 19 04:41:54 AM HKT 2026: GPU util=96% — waiting...
267
+ Wed Aug 19 04:42:54 AM HKT 2026: GPU util=0% — low count: 1/3
268
+ Wed Aug 19 04:43:54 AM HKT 2026: GPU util=2% — low count: 2/3
269
+ Wed Aug 19 04:44:54 AM HKT 2026: GPU util=96% — resetting counter
270
+ Wed Aug 19 04:45:54 AM HKT 2026: GPU util=96% — waiting...
271
+ Wed Aug 19 04:46:54 AM HKT 2026: GPU util=96% — waiting...
272
+ Wed Aug 19 04:47:54 AM HKT 2026: GPU util=96% — waiting...
273
+ Wed Aug 19 04:48:54 AM HKT 2026: GPU util=96% — waiting...
274
+ Wed Aug 19 04:49:54 AM HKT 2026: GPU util=0% — low count: 1/3
275
+ Wed Aug 19 04:50:54 AM HKT 2026: GPU util=96% — resetting counter
276
+ Wed Aug 19 04:51:54 AM HKT 2026: GPU util=96% — waiting...
277
+ Wed Aug 19 04:52:54 AM HKT 2026: GPU util=96% — waiting...
278
+ Wed Aug 19 04:53:54 AM HKT 2026: GPU util=96% — waiting...
279
+ Wed Aug 19 04:54:54 AM HKT 2026: GPU util=96% — waiting...
280
+ Wed Aug 19 04:55:54 AM HKT 2026: GPU util=96% — waiting...
281
+ Wed Aug 19 04:56:54 AM HKT 2026: GPU util=96% — waiting...
282
+ Wed Aug 19 04:57:54 AM HKT 2026: GPU util=96% — waiting...
283
+ Wed Aug 19 04:58:54 AM HKT 2026: GPU util=96% — waiting...
284
+ Wed Aug 19 04:59:55 AM HKT 2026: GPU util=96% — waiting...
285
+ Wed Aug 19 05:00:55 AM HKT 2026: GPU util=96% — waiting...
286
+ Wed Aug 19 05:01:55 AM HKT 2026: GPU util=96% — waiting...
287
+ Wed Aug 19 05:02:55 AM HKT 2026: GPU util=96% — waiting...
288
+ Wed Aug 19 05:03:55 AM HKT 2026: GPU util=96% — waiting...
289
+ Wed Aug 19 05:04:55 AM HKT 2026: GPU util=96% — waiting...
290
+ Wed Aug 19 05:05:55 AM HKT 2026: GPU util=0% — low count: 1/3
291
+ Wed Aug 19 05:06:55 AM HKT 2026: GPU util=0% — low count: 2/3
292
+ Wed Aug 19 05:07:55 AM HKT 2026: GPU util=96% — resetting counter
293
+ Wed Aug 19 05:08:55 AM HKT 2026: GPU util=96% — waiting...
294
+ Wed Aug 19 05:09:55 AM HKT 2026: GPU util=96% — waiting...
295
+ Wed Aug 19 05:10:55 AM HKT 2026: GPU util=96% — waiting...
296
+ Wed Aug 19 05:11:55 AM HKT 2026: GPU util=96% — waiting...
297
+ Wed Aug 19 05:12:55 AM HKT 2026: GPU util=95% — waiting...
298
+ Wed Aug 19 05:13:55 AM HKT 2026: GPU util=96% — waiting...
299
+ Wed Aug 19 05:14:55 AM HKT 2026: GPU util=96% — waiting...
300
+ Wed Aug 19 05:15:55 AM HKT 2026: GPU util=96% — waiting...
301
+ Wed Aug 19 05:16:55 AM HKT 2026: GPU util=92% — waiting...
302
+ Wed Aug 19 05:17:56 AM HKT 2026: GPU util=96% — waiting...
303
+ Wed Aug 19 05:18:56 AM HKT 2026: GPU util=87% — waiting...
304
+ Wed Aug 19 05:19:56 AM HKT 2026: GPU util=96% — waiting...
305
+ Wed Aug 19 05:20:56 AM HKT 2026: GPU util=96% — waiting...
306
+ Wed Aug 19 05:21:56 AM HKT 2026: GPU util=96% — waiting...
307
+ Wed Aug 19 05:22:56 AM HKT 2026: GPU util=96% — waiting...
308
+ Wed Aug 19 05:23:56 AM HKT 2026: GPU util=96% — waiting...
309
+ Wed Aug 19 05:24:56 AM HKT 2026: GPU util=96% — waiting...
310
+ Wed Aug 19 05:25:56 AM HKT 2026: GPU util=96% — waiting...
311
+ Wed Aug 19 05:26:56 AM HKT 2026: GPU util=70% — waiting...
312
+ Wed Aug 19 05:27:56 AM HKT 2026: GPU util=96% — waiting...
313
+ Wed Aug 19 05:28:56 AM HKT 2026: GPU util=96% — waiting...
314
+ Wed Aug 19 05:29:56 AM HKT 2026: GPU util=96% — waiting...
315
+ Wed Aug 19 05:30:56 AM HKT 2026: GPU util=96% — waiting...
316
+ Wed Aug 19 05:31:56 AM HKT 2026: GPU util=96% — waiting...
317
+ Wed Aug 19 05:32:56 AM HKT 2026: GPU util=96% — waiting...
318
+ Wed Aug 19 05:33:57 AM HKT 2026: GPU util=96% — waiting...
319
+ Wed Aug 19 05:34:57 AM HKT 2026: GPU util=93% — waiting...
320
+ Wed Aug 19 05:35:57 AM HKT 2026: GPU util=96% — waiting...
321
+ Wed Aug 19 05:36:57 AM HKT 2026: GPU util=96% — waiting...
322
+ Wed Aug 19 05:37:57 AM HKT 2026: GPU util=96% — waiting...
323
+ Wed Aug 19 05:38:57 AM HKT 2026: GPU util=95% — waiting...
324
+ Wed Aug 19 05:39:57 AM HKT 2026: GPU util=96% — waiting...
325
+ Wed Aug 19 05:40:57 AM HKT 2026: GPU util=96% — waiting...
stage1v2_final/gpu_wait_and_run.sh ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # GPU monitor: waits for GPU to be consistently free, then runs run_all.sh
3
+ # Checks every 60s. Requires 3 consecutive low-util readings to start.
4
+ # Logs to gpu_wait.log
5
+ #
6
+ # Usage: bash gpu_wait_and_run.sh [threshold] [resize]
7
+ # threshold: GPU util % below which to start (default: 20)
8
+ # resize: letterbox (default) or squeeze
9
+
10
+ set -euo pipefail
11
+
12
+ THRESHOLD="${1:-20}"
13
+ RESIZE="${2:-letterbox}"
14
+ ROOT="$(cd "$(dirname "$0")" && pwd)"
15
+ WAIT_LOG="${ROOT}/gpu_wait.log"
16
+ RUN_LOG="${ROOT}/run_$(date +%Y%m%d_%H%M%S).log"
17
+
18
+ echo "=== GPU Wait Monitor ===" | tee "$WAIT_LOG"
19
+ echo "Threshold: ${THRESHOLD}% util (3 consecutive)" | tee -a "$WAIT_LOG"
20
+ echo "Resize: $RESIZE" | tee -a "$WAIT_LOG"
21
+ echo "Started monitoring: $(date)" | tee -a "$WAIT_LOG"
22
+ echo "" | tee -a "$WAIT_LOG"
23
+
24
+ LOW_COUNT=0
25
+
26
+ while true; do
27
+ UTIL=$(nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits 2>/dev/null | head -1 | tr -d ' ')
28
+
29
+ # Handle [N/A] case
30
+ if [ "$UTIL" = "[N/A]" ] || ! [[ "$UTIL" =~ ^[0-9]+$ ]]; then
31
+ UTIL=0
32
+ fi
33
+
34
+ if [ "$UTIL" -lt "$THRESHOLD" ]; then
35
+ LOW_COUNT=$((LOW_COUNT + 1))
36
+ echo "$(date): GPU util=${UTIL}% — low count: ${LOW_COUNT}/3" | tee -a "$WAIT_LOG"
37
+ if [ "$LOW_COUNT" -ge 3 ]; then
38
+ echo "$(date): GPU free for 3 consecutive checks — starting pipeline!" | tee -a "$WAIT_LOG"
39
+ echo "$(date): Launching run_all.sh $RESIZE" | tee -a "$WAIT_LOG"
40
+ bash "${ROOT}/run_all.sh" "$RESIZE" "$RUN_LOG" 2>&1 | tee -a "$WAIT_LOG"
41
+ echo "$(date): Pipeline complete!" | tee -a "$WAIT_LOG"
42
+ exit 0
43
+ fi
44
+ else
45
+ if [ "$LOW_COUNT" -gt 0 ]; then
46
+ echo "$(date): GPU util=${UTIL}% — resetting counter" | tee -a "$WAIT_LOG"
47
+ else
48
+ echo "$(date): GPU util=${UTIL}% — waiting..." | tee -a "$WAIT_LOG"
49
+ fi
50
+ LOW_COUNT=0
51
+ fi
52
+
53
+ sleep 60
54
+ done
stage1v2_final/logits/letterbox/convnext/convnext_oof.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:73b6d15dc8c827b0b13c9cdb78bf1fda3bd6b6c56aac166dad2b52cb3e04e9fb
3
+ size 2810488
stage1v2_final/logits/letterbox/convnext/convnext_test.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9bc2571fc45061ab450355dc4d26a32f4d5bb4fc298591b51e3ee73229b4d688
3
+ size 594826
stage1v2_final/logits/letterbox/convnext/plain_convnext_oof.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1f03d6ba8dfd23ccb07dfe123abda4a9b436f9ed8459a01b0e10da6f30760b84
3
+ size 2810488
stage1v2_final/logits/letterbox/convnext/plain_convnext_test.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4a7d56f5306d17930f47f46c63f2a53fe5b856d0954a245ece454c9f098f8d73
3
+ size 594826
stage1v2_final/logits/letterbox/mamba/mamba_oof.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9d11f5f77dbf6658abd743dcf13dffedefe322c3afb27705fb19baf12e0570d0
3
+ size 2810488
stage1v2_final/logits/letterbox/mamba/mamba_test.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5d307a780ad4ef28c732831c61843ff26329cdaa845287998da8c464f8752004
3
+ size 594826
stage1v2_final/logits/letterbox/mamba/plain_mamba_oof.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9e4cdee8fcde69a09de2bbcdb2e180de25f2b3186240bf272623ab9a13340169
3
+ size 2810488
stage1v2_final/logits/letterbox/mamba/plain_mamba_test.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:024fecaaae151dcb79390c7d784f065e7d2f5e11dd1fe9419a4e2943000291ca
3
+ size 594826
stage1v2_final/logits/letterbox/resnet/plain_resnet_oof.npz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c9275f654c778d3f95bedf7f1d4d2fac5c93b418f2a55289b6472929fe6a0791
3
+ size 2810488