Afifsudoers commited on
Commit
611b138
·
verified ·
1 Parent(s): 9692ec3

Upload USGResearch.ipynb

Browse files
Files changed (1) hide show
  1. USGResearch.ipynb +1376 -0
USGResearch.ipynb ADDED
@@ -0,0 +1,1376 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "nbformat": 4,
3
+ "nbformat_minor": 0,
4
+ "metadata": {
5
+ "colab": {
6
+ "provenance": [],
7
+ "gpuType": "T4"
8
+ },
9
+ "kernelspec": {
10
+ "name": "python3",
11
+ "display_name": "Python 3"
12
+ },
13
+ "language_info": {
14
+ "name": "python"
15
+ },
16
+ "accelerator": "GPU"
17
+ },
18
+ "cells": [
19
+ {
20
+ "cell_type": "markdown",
21
+ "source": [
22
+ "# ML tools for Thyroid Canciroma"
23
+ ],
24
+ "metadata": {
25
+ "id": "mBaMWkb6qeFV"
26
+ }
27
+ },
28
+ {
29
+ "cell_type": "code",
30
+ "execution_count": 1,
31
+ "metadata": {
32
+ "id": "M1a84OZrJkBy",
33
+ "colab": {
34
+ "base_uri": "https://localhost:8080/"
35
+ },
36
+ "outputId": "b19e9902-1b1d-4e57-eb23-6df8dcbb8bf2"
37
+ },
38
+ "outputs": [
39
+ {
40
+ "output_type": "stream",
41
+ "name": "stdout",
42
+ "text": [
43
+ "Archive: USG_db.zip\n",
44
+ " creating: USG/Benign/\n",
45
+ " inflating: USG/Benign/tiroides (60).jpg \n",
46
+ " inflating: USG/Benign/tiroides1.jpg \n",
47
+ " inflating: USG/Benign/tiroides10.jpg \n",
48
+ " inflating: USG/Benign/tiroides101.jpg \n",
49
+ " inflating: USG/Benign/tiroides103.jpg \n",
50
+ " inflating: USG/Benign/tiroides122.jpg \n",
51
+ " inflating: USG/Benign/tiroides125.jpg \n",
52
+ " inflating: USG/Benign/tiroides128.jpg \n",
53
+ " inflating: USG/Benign/tiroides13.jpg \n",
54
+ " inflating: USG/Benign/tiroides133.jpg \n",
55
+ " inflating: USG/Benign/tiroides137.jpg \n",
56
+ " inflating: USG/Benign/tiroides138.jpg \n",
57
+ " inflating: USG/Benign/tiroides144.jpg \n",
58
+ " inflating: USG/Benign/tiroides146.jpg \n",
59
+ " inflating: USG/Benign/tiroides151.jpg \n",
60
+ " inflating: USG/Benign/tiroides158.jpg \n",
61
+ " inflating: USG/Benign/tiroides16.jpg \n",
62
+ " inflating: USG/Benign/tiroides161.jpg \n",
63
+ " inflating: USG/Benign/tiroides162.jpg \n",
64
+ " inflating: USG/Benign/tiroides163.jpg \n",
65
+ " inflating: USG/Benign/tiroides164.jpg \n",
66
+ " inflating: USG/Benign/tiroides168.jpg \n",
67
+ " inflating: USG/Benign/tiroides2.jpg \n",
68
+ " inflating: USG/Benign/tiroides20.jpg \n",
69
+ " inflating: USG/Benign/tiroides276.jpg \n",
70
+ " inflating: USG/Benign/tiroides280.jpg \n",
71
+ " inflating: USG/Benign/tiroides281.jpg \n",
72
+ " inflating: USG/Benign/tiroides301.jpg \n",
73
+ " inflating: USG/Benign/tiroides31 (1).jpg \n",
74
+ " inflating: USG/Benign/tiroides31 (103).jpg \n",
75
+ " inflating: USG/Benign/tiroides31 (107).jpg \n",
76
+ " inflating: USG/Benign/tiroides31 (11).jpg \n",
77
+ " inflating: USG/Benign/tiroides31 (110).jpg \n",
78
+ " inflating: USG/Benign/tiroides31 (112).jpg \n",
79
+ " inflating: USG/Benign/tiroides31 (123).jpg \n",
80
+ " inflating: USG/Benign/tiroides31 (124).jpg \n",
81
+ " inflating: USG/Benign/tiroides31 (125).jpg \n",
82
+ " inflating: USG/Benign/tiroides31 (128).jpg \n",
83
+ " inflating: USG/Benign/tiroides31 (129).jpg \n",
84
+ " inflating: USG/Benign/tiroides31 (131).jpg \n",
85
+ " inflating: USG/Benign/tiroides31 (136).jpg \n",
86
+ " inflating: USG/Benign/tiroides31 (2).jpg \n",
87
+ " inflating: USG/Benign/tiroides31 (21).jpg \n",
88
+ " inflating: USG/Benign/tiroides31 (26).jpg \n",
89
+ " inflating: USG/Benign/tiroides31 (33).jpg \n",
90
+ " inflating: USG/Benign/tiroides31 (35).jpg \n",
91
+ " inflating: USG/Benign/tiroides31 (36).jpg \n",
92
+ " inflating: USG/Benign/tiroides31 (40).jpg \n",
93
+ " inflating: USG/Benign/tiroides31 (48).jpg \n",
94
+ " inflating: USG/Benign/tiroides31 (50).jpg \n",
95
+ " inflating: USG/Benign/tiroides31 (55).jpg \n",
96
+ " inflating: USG/Benign/tiroides31 (6).jpg \n",
97
+ " inflating: USG/Benign/tiroides31 (61).jpg \n",
98
+ " inflating: USG/Benign/tiroides31 (62).jpg \n",
99
+ " inflating: USG/Benign/tiroides31 (69).jpg \n",
100
+ " inflating: USG/Benign/tiroides31 (7).jpg \n",
101
+ " inflating: USG/Benign/tiroides31 (71).jpg \n",
102
+ " inflating: USG/Benign/tiroides31 (72).jpg \n",
103
+ " inflating: USG/Benign/tiroides31 (73).jpg \n",
104
+ " inflating: USG/Benign/tiroides31 (74).jpg \n",
105
+ " inflating: USG/Benign/tiroides31 (75).jpg \n",
106
+ " inflating: USG/Benign/tiroides31 (76).jpg \n",
107
+ " inflating: USG/Benign/tiroides31 (86).jpg \n",
108
+ " inflating: USG/Benign/tiroides31 (93).jpg \n",
109
+ " inflating: USG/Benign/tiroides31 (98).jpg \n",
110
+ " inflating: USG/Benign/tiroides32.jpg \n",
111
+ " inflating: USG/Benign/tiroides325.jpg \n",
112
+ " inflating: USG/Benign/tiroides36.jpg \n",
113
+ " inflating: USG/Benign/tiroides37.jpg \n",
114
+ " inflating: USG/Benign/tiroides39.jpg \n",
115
+ " inflating: USG/Benign/tiroides390.jpg \n",
116
+ " inflating: USG/Benign/tiroides4.jpg \n",
117
+ " inflating: USG/Benign/tiroides406.jpg \n",
118
+ " inflating: USG/Benign/tiroides42.jpg \n",
119
+ " inflating: USG/Benign/tiroides46.jpg \n",
120
+ " inflating: USG/Benign/tiroides48.jpg \n",
121
+ " inflating: USG/Benign/tiroides52.jpg \n",
122
+ " inflating: USG/Benign/tiroides57.jpg \n",
123
+ " inflating: USG/Benign/tiroides59.jpg \n",
124
+ " inflating: USG/Benign/tiroides6.jpg \n",
125
+ " inflating: USG/Benign/tiroides61.jpg \n",
126
+ " inflating: USG/Benign/tiroides63.jpg \n",
127
+ " inflating: USG/Benign/tiroides66.jpg \n",
128
+ " inflating: USG/Benign/tiroides67.jpg \n",
129
+ " inflating: USG/Benign/tiroides72.jpg \n",
130
+ " inflating: USG/Benign/tiroides73.jpg \n",
131
+ " inflating: USG/Benign/tiroides78.jpg \n",
132
+ " inflating: USG/Benign/tiroides8.jpg \n",
133
+ " inflating: USG/Benign/tiroides80.jpg \n",
134
+ " inflating: USG/Benign/tiroides96.jpg \n",
135
+ " creating: USG/FTC/\n",
136
+ " inflating: USG/FTC/B_000103587_20130527_US_1_4.png \n",
137
+ " inflating: USG/FTC/B_000875063_20140218_US_1_5.png \n",
138
+ " inflating: USG/FTC/B_000875063_20140218_US_1_7.png \n",
139
+ " inflating: USG/FTC/B_000875063_20140703_US_1_1.png \n",
140
+ " inflating: USG/FTC/B_001903385_20130424_US_1_1.png \n",
141
+ " inflating: USG/FTC/B_001903385_20130424_US_1_10.png \n",
142
+ " inflating: USG/FTC/B_001903385_20130424_US_1_9.png \n",
143
+ " inflating: USG/FTC/B_001907930_20130826_US_1_10.png \n",
144
+ " inflating: USG/FTC/B_001907930_20130826_US_1_8.png \n",
145
+ " inflating: USG/FTC/B_001907930_20130826_US_1_9.png \n",
146
+ " inflating: USG/FTC/B_002086903_20190926_US_1_1.png \n",
147
+ " inflating: USG/FTC/B_002086903_20190926_US_1_2.png \n",
148
+ " inflating: USG/FTC/B_002086903_20190926_US_1_3.png \n",
149
+ " inflating: USG/FTC/B_002086903_20190926_US_1_4.png \n",
150
+ " inflating: USG/FTC/B_002165656_20150120_US_1_1.png \n",
151
+ " inflating: USG/FTC/B_002165656_20150120_US_1_2.png \n",
152
+ " inflating: USG/FTC/B_002165656_20150120_US_1_3.png \n",
153
+ " inflating: USG/FTC/B_002165656_20150120_US_1_6.png \n",
154
+ " inflating: USG/FTC/B_002468117_20170307_US_1_1.png \n",
155
+ " inflating: USG/FTC/B_002542312_20170823_US_1_7.png \n",
156
+ " inflating: USG/FTC/B_002542312_20170823_US_1_8.png \n",
157
+ " inflating: USG/FTC/B_002542312_20170823_US_1_9.png \n",
158
+ " inflating: USG/FTC/B_002648905_20180518_US_1_1.png \n",
159
+ " inflating: USG/FTC/B_002648905_20180518_US_1_3.png \n",
160
+ " inflating: USG/FTC/B_002648905_20180518_US_1_4.png \n",
161
+ " inflating: USG/FTC/B_002648905_20180518_US_1_7.png \n",
162
+ " inflating: USG/FTC/B_100028001_20170105_US_1_3.png \n",
163
+ " inflating: USG/FTC/B_100028001_20170105_US_1_5.png \n",
164
+ " inflating: USG/FTC/B_100028001_20170105_US_1_7.png \n",
165
+ " inflating: USG/FTC/B_100400895_20140423_US_1_6.png \n",
166
+ " inflating: USG/FTC/B_100402163_20130710_US_1_3.png \n",
167
+ " inflating: USG/FTC/B_100402163_20130710_US_1_4.png \n",
168
+ " inflating: USG/FTC/B_100402163_20130710_US_1_5.png \n",
169
+ " inflating: USG/FTC/B_100448043_20130509_US_1_10.png \n",
170
+ " inflating: USG/FTC/B_100448043_20130509_US_1_11.png \n",
171
+ " inflating: USG/FTC/B_100578414_20130311_US_1_2.png \n",
172
+ " inflating: USG/FTC/B_100578414_20130311_US_1_4.png \n",
173
+ " inflating: USG/FTC/B_100578414_20130311_US_1_6.png \n",
174
+ " inflating: USG/FTC/B_100578414_20130311_US_1_7.png \n",
175
+ " inflating: USG/FTC/B_100580629_20130318_US_1_2.png \n",
176
+ " inflating: USG/FTC/B_100580629_20130318_US_1_8.png \n",
177
+ " inflating: USG/FTC/B_100580629_20130318_US_1_9.png \n",
178
+ " inflating: USG/FTC/B_100585439_20130407_US_1_1.png \n",
179
+ " inflating: USG/FTC/B_100585439_20130407_US_1_2.png \n",
180
+ " inflating: USG/FTC/B_100585439_20130407_US_1_3.png \n",
181
+ " inflating: USG/FTC/B_100585439_20130407_US_1_4.png \n",
182
+ " inflating: USG/FTC/B_300032893_20181022_US_1_3.png \n",
183
+ " inflating: USG/FTC/B_300296050_20191225_US_1_2.png \n",
184
+ " inflating: USG/FTC/B_300296050_20191225_US_1_3.png \n",
185
+ " inflating: USG/FTC/B_300296050_20191225_US_1_5.png \n",
186
+ " inflating: USG/FTC/B_300296050_20191225_US_1_6.png \n",
187
+ " inflating: USG/FTC/B_300296050_20191225_US_1_8.png \n",
188
+ " inflating: USG/FTC/B_300296050_20191225_US_1_9.png \n",
189
+ " inflating: USG/FTC/B_300321057_20201215_US_1_3.png \n",
190
+ " inflating: USG/FTC/B_600016858_20180409_US_1_14.png \n",
191
+ " inflating: USG/FTC/B_600016858_20180409_US_1_15.png \n",
192
+ " inflating: USG/FTC/B_600016858_20180409_US_1_16.png \n",
193
+ " inflating: USG/FTC/B_600022518_20140220_US_1_4.png \n",
194
+ " inflating: USG/FTC/B_600027844_20130722_US_1_11.png \n",
195
+ " inflating: USG/FTC/B_600027844_20130722_US_1_4.png \n",
196
+ " inflating: USG/FTC/B_600081125_20140121_US_1_15.png \n",
197
+ " inflating: USG/FTC/B_600087068_20140127_US_1_12.png \n",
198
+ " inflating: USG/FTC/B_600087068_20140127_US_1_5.png \n",
199
+ " inflating: USG/FTC/B_600087068_20140127_US_1_6.png \n",
200
+ " inflating: USG/FTC/B_600128535_20140616_US_1_4.png \n",
201
+ " inflating: USG/FTC/B_600128535_20140616_US_1_5.png \n",
202
+ " inflating: USG/FTC/B_600137379_20140710_US_1_6.png \n",
203
+ " inflating: USG/FTC/B_600137379_20140710_US_1_7.png \n",
204
+ " inflating: USG/FTC/B_600395375_20171012_US_1_1.png \n",
205
+ " inflating: USG/FTC/B_600395375_20171012_US_1_2.png \n",
206
+ " inflating: USG/FTC/B_600395375_20171012_US_1_4.png \n",
207
+ " inflating: USG/FTC/B_600395375_20171012_US_1_5.png \n",
208
+ " inflating: USG/FTC/B_600403531_20151207_US_1_1.png \n",
209
+ " inflating: USG/FTC/B_600403531_20151207_US_1_4.png \n",
210
+ " inflating: USG/FTC/B_600403531_20151207_US_1_5.png \n",
211
+ " inflating: USG/FTC/B_600403531_20151207_US_1_9.png \n",
212
+ " inflating: USG/FTC/B_600405616_20151210_US_0001_0000.png \n",
213
+ " inflating: USG/FTC/B_600614740_20170215_US_0001_1792.png \n",
214
+ " inflating: USG/FTC/B_600651878_20170511_US_1_10.png \n",
215
+ " inflating: USG/FTC/B_600651878_20170511_US_1_11.png \n",
216
+ " inflating: USG/FTC/B_600667771_20170614_US_1_5.png \n",
217
+ " inflating: USG/FTC/B_600750495_20171027_US_1_6.png \n",
218
+ " inflating: USG/FTC/B_600750495_20171027_US_1_8.png \n",
219
+ " inflating: USG/FTC/B_600797960_20180131_US_1_2.png \n",
220
+ " inflating: USG/FTC/B_600797960_20180131_US_1_4.png \n",
221
+ " inflating: USG/FTC/B_600798437_20180201_US_1_10.png \n",
222
+ " inflating: USG/FTC/B_600798437_20180201_US_1_2.png \n",
223
+ " inflating: USG/FTC/B_600798437_20180201_US_1_8.png \n",
224
+ " inflating: USG/FTC/B_600861957_20180625_US_1_5.png \n",
225
+ " inflating: USG/FTC/B_600861957_20180625_US_1_6.png \n",
226
+ " inflating: USG/FTC/B_600861957_20180625_US_1_7.png \n",
227
+ " inflating: USG/FTC/B_600871983_20180712_US_1_10.png \n",
228
+ " inflating: USG/FTC/B_600871983_20180712_US_1_11.png \n",
229
+ " inflating: USG/FTC/B_600871983_20180712_US_1_12.png \n",
230
+ " inflating: USG/FTC/B_600871983_20180712_US_1_13.png \n",
231
+ " inflating: USG/FTC/B_600871983_20180712_US_1_6.png \n",
232
+ " inflating: USG/FTC/B_600871983_20180712_US_1_7.png \n",
233
+ " inflating: USG/FTC/B_600903396_20180827_US_1_11.png \n",
234
+ " inflating: USG/FTC/B_600921536_20180917_US_1_14.png \n",
235
+ " inflating: USG/FTC/B_600921536_20180917_US_1_18.png \n",
236
+ " creating: USG/MTC/\n",
237
+ " inflating: USG/MTC/MTC_0000189482_0.jpg \n",
238
+ " inflating: USG/MTC/MTC_0000189482_1.jpg \n",
239
+ " inflating: USG/MTC/MTC_0000189482_10.jpg \n",
240
+ " inflating: USG/MTC/MTC_0000189482_11.jpg \n",
241
+ " inflating: USG/MTC/MTC_0000189482_12.jpg \n",
242
+ " inflating: USG/MTC/MTC_0000189482_14.jpg \n",
243
+ " inflating: USG/MTC/MTC_0000189482_15.jpg \n",
244
+ " inflating: USG/MTC/MTC_0000189482_16.jpg \n",
245
+ " inflating: USG/MTC/MTC_0000189482_17.jpg \n",
246
+ " inflating: USG/MTC/MTC_0000189482_19.jpg \n",
247
+ " inflating: USG/MTC/MTC_0000189482_2.jpg \n",
248
+ " inflating: USG/MTC/MTC_0000189482_3.jpg \n",
249
+ " inflating: USG/MTC/MTC_0000189482_5.jpg \n",
250
+ " inflating: USG/MTC/MTC_0000189482_6.jpg \n",
251
+ " inflating: USG/MTC/MTC_0000189482_8.jpg \n",
252
+ " inflating: USG/MTC/MTC_0000189482_9.jpg \n",
253
+ " inflating: USG/MTC/MTC_000252531_20181221_US_1_1.jpg \n",
254
+ " inflating: USG/MTC/MTC_000252531_20181221_US_1_17.jpg \n",
255
+ " inflating: USG/MTC/MTC_000615923_20181213_US_1_1.jpg \n",
256
+ " inflating: USG/MTC/MTC_000615923_20181213_US_1_2.jpg \n",
257
+ " inflating: USG/MTC/MTC_000615923_20181213_US_1_5.jpg \n",
258
+ " inflating: USG/MTC/MTC_000615923_20181213_US_1_6.jpg \n",
259
+ " inflating: USG/MTC/MTC_000760566_20151020_US_1_4.jpg \n",
260
+ " inflating: USG/MTC/MTC_000800215_20201022_US_1_10.jpg \n",
261
+ " inflating: USG/MTC/MTC_000800215_20201022_US_1_5.jpg \n",
262
+ " inflating: USG/MTC/MTC_000800215_20201022_US_1_6.jpg \n",
263
+ " inflating: USG/MTC/MTC_000800215_20201022_US_1_7.jpg \n",
264
+ " inflating: USG/MTC/MTC_1.2.840.113663.1500.1.397381976.3.347.20220617.95946.109.jpg \n",
265
+ " inflating: USG/MTC/MTC_1.2.840.113663.1500.1.397381976.3.348.20220617.95952.953.jpg \n",
266
+ " inflating: USG/MTC/MTC_1.2.840.113663.1500.1.397381976.3.349.20220617.100004.406.jpg \n",
267
+ " inflating: USG/MTC/MTC_1.2.840.113663.1500.1.397381976.3.350.20220617.100017.281.jpg \n",
268
+ " inflating: USG/MTC/MTC_1.2.840.113663.1500.1.397381976.3.351.20220617.100029.890.jpg \n",
269
+ " inflating: USG/MTC/MTC_1.2.840.113663.1500.1.397381976.3.352.20220617.100055.484.jpg \n",
270
+ " inflating: USG/MTC/MTC_1.2.840.113663.1500.1.397381976.3.353.20220617.100105.296.jpg \n",
271
+ " inflating: USG/MTC/MTC_1.2.840.113663.1500.1.397381976.3.354.20220617.100116.796.jpg \n",
272
+ " inflating: USG/MTC/MTC_3074ef37dfc3fbc588ce7532eff8bde.jpg \n",
273
+ " inflating: USG/MTC/MTC_5de5e6ec7b7f10e5cc9541710840bf9.jpg \n",
274
+ " inflating: USG/MTC/MTC_636794304377500000.jpg \n",
275
+ " inflating: USG/MTC/MTC_636794304498125000.jpg \n",
276
+ " inflating: USG/MTC/MTC_636794304549218750.jpg \n",
277
+ " inflating: USG/MTC/MTC_636794304588281250.jpg \n",
278
+ " inflating: USG/MTC/MTC_636820165127812500.jpg \n",
279
+ " inflating: USG/MTC/MTC_636820166051718750.jpg \n",
280
+ " inflating: USG/MTC/MTC_636820166231406250.jpg \n",
281
+ " inflating: USG/MTC/MTC_636820166551093750.jpg \n",
282
+ " inflating: USG/MTC/MTC_636820167186562500.jpg \n",
283
+ " inflating: USG/MTC/MTC_636825604143523275.jpg \n",
284
+ " inflating: USG/MTC/MTC_636825604305062515.jpg \n",
285
+ " inflating: USG/MTC/MTC_636825604367246071.jpg \n",
286
+ " inflating: USG/MTC/MTC_636825604825892305.jpg \n",
287
+ " inflating: USG/MTC/MTC_636825605032124100.jpg \n",
288
+ " inflating: USG/MTC/MTC_636825605132589847.jpg \n",
289
+ " inflating: USG/MTC/MTC_636825605244206231.jpg \n",
290
+ " inflating: USG/MTC/MTC_636825605365733182.jpg \n",
291
+ " inflating: USG/MTC/MTC_636825605424086519.jpg \n",
292
+ " inflating: USG/MTC/MTC_636825605537413001.jpg \n",
293
+ " inflating: USG/MTC/MTC_636825605672390721.jpg \n",
294
+ " inflating: USG/MTC/MTC_636825605955446911.jpg \n",
295
+ " inflating: USG/MTC/MTC_636825606241973300.jpg \n",
296
+ " inflating: USG/MTC/MTC_636825606346659287.jpg \n",
297
+ " inflating: USG/MTC/MTC_636825606435674379.jpg \n",
298
+ " inflating: USG/MTC/MTC_636825606512488772.jpg \n",
299
+ " inflating: USG/MTC/MTC_636825606626685304.jpg \n",
300
+ " inflating: USG/MTC/MTC_636825606794864923.jpg \n",
301
+ " inflating: USG/MTC/MTC_636825607097802250.jpg \n",
302
+ " inflating: USG/MTC/MTC_636928246285226522.jpg \n",
303
+ " inflating: USG/MTC/MTC_636928246507689246.jpg \n",
304
+ " inflating: USG/MTC/MTC_636928246564262482.jpg \n",
305
+ " inflating: USG/MTC/MTC_636928246613795315.jpg \n",
306
+ " inflating: USG/MTC/MTC_636928246673328720.jpg \n",
307
+ " inflating: USG/MTC/MTC_636928246700400269.jpg \n",
308
+ " inflating: USG/MTC/MTC_636928246759903672.jpg \n",
309
+ " inflating: USG/MTC/MTC_636928246804896246.jpg \n",
310
+ " inflating: USG/MTC/MTC_636928246841578344.jpg \n",
311
+ " inflating: USG/MTC/MTC_636928246911782359.jpg \n",
312
+ " inflating: USG/MTC/MTC_636928246957784990.jpg \n",
313
+ " inflating: USG/MTC/MTC_636928247087702421.jpg \n",
314
+ " inflating: USG/MTC/MTC_636928247209689399.jpg \n",
315
+ " inflating: USG/MTC/MTC_636928247264552536.jpg \n",
316
+ " inflating: USG/MTC/MTC_636928247318705634.jpg \n",
317
+ " inflating: USG/MTC/MTC_636930060694375000.jpg \n",
318
+ " inflating: USG/MTC/MTC_636930060874531250.jpg \n",
319
+ " inflating: USG/MTC/MTC_636930060924218750.jpg \n",
320
+ " inflating: USG/MTC/MTC_636930061144062500.jpg \n",
321
+ " inflating: USG/MTC/MTC_636930061226406250.jpg \n",
322
+ " inflating: USG/MTC/MTC_636930061287187500.jpg \n",
323
+ " inflating: USG/MTC/MTC_636935260437187500.jpg \n",
324
+ " inflating: USG/MTC/MTC_636935261555312500.jpg \n",
325
+ " inflating: USG/MTC/MTC_636935263982500000.jpg \n",
326
+ " inflating: USG/MTC/MTC_636935264064218750.jpg \n",
327
+ " inflating: USG/MTC/MTC_636947155801178819.jpg \n",
328
+ " inflating: USG/MTC/MTC_636947155997480047.jpg \n",
329
+ " inflating: USG/MTC/MTC_636947156186860879.jpg \n",
330
+ " inflating: USG/MTC/MTC_636947156520189944.jpg \n",
331
+ " inflating: USG/MTC/MTC_636971645042850640.jpg \n",
332
+ " inflating: USG/MTC/MTC_636971645195689382.jpg \n",
333
+ " inflating: USG/MTC/MTC_636971645270463659.jpg \n",
334
+ " inflating: USG/MTC/MTC_636971645464224742.jpg \n",
335
+ " inflating: USG/MTC/MTC_636971645642764954.jpg \n",
336
+ " creating: USG/PTC/\n",
337
+ " inflating: USG/PTC/A_013001-TIRADS4A-03-L-V-2.png \n",
338
+ " inflating: USG/PTC/A_091912-TIRADS4C-01-L-V-2.png \n",
339
+ " inflating: USG/PTC/A_093002-TIRADS4A-03-L-V-2.png \n",
340
+ " inflating: USG/PTC/A_101004-TIRADS4B-01-R-V-2.png \n",
341
+ " inflating: USG/PTC/A_110506-TIRADS4A-01-L-V-2.png \n",
342
+ " inflating: USG/PTC/A_110715-TIRADS4A-01-L-V-2.png \n",
343
+ " inflating: USG/PTC/A_111213-TIRADS4A-01-R-V-2.png \n",
344
+ " inflating: USG/PTC/A_111301-TIRADS4B-01-R-V-2.png \n",
345
+ " inflating: USG/PTC/A_111903-TIRADS4B-01-R-V-2.png \n",
346
+ " inflating: USG/PTC/A_120303-TIRADS5-01-X-V-2.png \n",
347
+ " inflating: USG/PTC/A_120908-TIRADS5-01-L-V-2.png \n",
348
+ " inflating: USG/PTC/A_122204-TIRADS5-01-R-V-2.png \n",
349
+ " inflating: USG/PTC/A_b17170109135813.png \n",
350
+ " inflating: USG/PTC/A_b17170110072746.png \n",
351
+ " inflating: USG/PTC/A_b17170110075828.png \n",
352
+ " inflating: USG/PTC/A_b17170110080622.png \n",
353
+ " inflating: USG/PTC/A_b17170110083358.png \n",
354
+ " inflating: USG/PTC/A_b17170110083444.png \n",
355
+ " inflating: USG/PTC/A_b17170110083527.png \n",
356
+ " inflating: USG/PTC/A_b17170110084327.png \n",
357
+ " inflating: USG/PTC/A_b17170110084425.png \n",
358
+ " inflating: USG/PTC/A_b17170112072149.png \n",
359
+ " inflating: USG/PTC/A_b17170112133310.png \n",
360
+ " inflating: USG/PTC/A_b17170112133625.png \n",
361
+ " inflating: USG/PTC/A_b17170112134637.png \n",
362
+ " inflating: USG/PTC/A_b17170112134701.png \n",
363
+ " inflating: USG/PTC/A_b17170112134749.png \n",
364
+ " inflating: USG/PTC/A_b17170117080854.png \n",
365
+ " inflating: USG/PTC/A_b17170117080912.png \n",
366
+ " inflating: USG/PTC/A_b17170117081007.png \n",
367
+ " inflating: USG/PTC/A_b17170209084245.png \n",
368
+ " inflating: USG/PTC/A_b17170308073111.png \n",
369
+ " inflating: USG/PTC/A_b17170406090806.png \n",
370
+ " inflating: USG/PTC/A_b17170522075032.png \n",
371
+ " inflating: USG/PTC/A_b17170608090324.png \n",
372
+ " inflating: USG/PTC/A_b17170908153837.png \n",
373
+ " inflating: USG/PTC/A_b17171010085802.png \n",
374
+ " inflating: USG/PTC/A_b17171010085928.png \n",
375
+ " inflating: USG/PTC/A_b17171011074315.png \n",
376
+ " inflating: USG/PTC/A_b17171011081947.png \n",
377
+ " inflating: USG/PTC/A_b17171011091207.png \n",
378
+ " inflating: USG/PTC/A_b17171011091244.png \n",
379
+ " inflating: USG/PTC/A_b17171011091533.png \n",
380
+ " inflating: USG/PTC/A_b17171011092647.png \n",
381
+ " inflating: USG/PTC/A_b17171011092717.png \n",
382
+ " inflating: USG/PTC/A_b17171011093018.png \n",
383
+ " inflating: USG/PTC/A_b17171011093834.png \n",
384
+ " inflating: USG/PTC/A_b17171011093956.png \n",
385
+ " inflating: USG/PTC/A_b17171011095957.png \n",
386
+ " inflating: USG/PTC/A_b17171011100259.png \n",
387
+ " inflating: USG/PTC/A_b17171011100319.png \n",
388
+ " inflating: USG/PTC/A_b17171012075630.png \n",
389
+ " inflating: USG/PTC/A_b17171012075850.png \n",
390
+ " inflating: USG/PTC/A_b17171012075919.png \n",
391
+ " inflating: USG/PTC/A_b17171012081602.png \n",
392
+ " inflating: USG/PTC/A_b17171012084011.png \n",
393
+ " inflating: USG/PTC/A_b17171012084427.png \n",
394
+ " inflating: USG/PTC/A_b17171012142230.png \n",
395
+ " inflating: USG/PTC/A_b17171012142256.png \n",
396
+ " inflating: USG/PTC/A_b17171012144234.png \n",
397
+ " inflating: USG/PTC/A_b17171012144421.png \n",
398
+ " inflating: USG/PTC/A_b17171016073541.png \n",
399
+ " inflating: USG/PTC/A_b17171016073735.png \n",
400
+ " inflating: USG/PTC/A_b17171016074619.png \n",
401
+ " inflating: USG/PTC/A_b17171016100654.png \n",
402
+ " inflating: USG/PTC/A_b17171017073834.png \n",
403
+ " inflating: USG/PTC/A_b17171017073909.png \n",
404
+ " inflating: USG/PTC/A_b17171017073959.png \n",
405
+ " inflating: USG/PTC/A_b17171017075151.png \n",
406
+ " inflating: USG/PTC/A_b17171017081042.png \n",
407
+ " inflating: USG/PTC/A_b17171017081122.png \n",
408
+ " inflating: USG/PTC/A_b17171017085025.png \n",
409
+ " inflating: USG/PTC/A_b17171017085114.png \n",
410
+ " inflating: USG/PTC/A_b17171017085139.png \n",
411
+ " inflating: USG/PTC/A_b17171017091203.png \n",
412
+ " inflating: USG/PTC/A_b17171017091250.png \n",
413
+ " inflating: USG/PTC/A_b17171017091328.png \n",
414
+ " inflating: USG/PTC/A_b17171018073349.png \n",
415
+ " inflating: USG/PTC/A_b17171018074030.png \n",
416
+ " inflating: USG/PTC/A_b17171018074055.png \n",
417
+ " inflating: USG/PTC/A_b17171018074117.png \n",
418
+ " inflating: USG/PTC/A_b17171018103941.png \n",
419
+ " inflating: USG/PTC/A_b17171018155334.png \n",
420
+ " inflating: USG/PTC/A_b17171018155546.png \n",
421
+ " inflating: USG/PTC/A_b17171019074311.png \n",
422
+ " inflating: USG/PTC/A_b17171019075456.png \n",
423
+ " inflating: USG/PTC/A_b17171019075543.png \n",
424
+ " inflating: USG/PTC/A_b17171019075801.png \n",
425
+ " inflating: USG/PTC/A_b17171019092726.png \n",
426
+ " inflating: USG/PTC/A_b17171019092848.png \n",
427
+ " inflating: USG/PTC/A_b17171021112137.png \n",
428
+ " inflating: USG/PTC/A_b17171021112331.png \n",
429
+ " inflating: USG/PTC/A_b17171023083335.png \n",
430
+ " inflating: USG/PTC/A_b17171023083403.png \n",
431
+ " inflating: USG/PTC/A_b17171023085148.png \n",
432
+ " inflating: USG/PTC/A_b17171023085247.png \n",
433
+ " inflating: USG/PTC/A_b17171024083510.png \n",
434
+ " inflating: USG/PTC/A_b17171024083633.png \n",
435
+ " inflating: USG/PTC/A_b17171026073152.png \n"
436
+ ]
437
+ }
438
+ ],
439
+ "source": [
440
+ "!unzip USG_db.zip"
441
+ ]
442
+ },
443
+ {
444
+ "cell_type": "markdown",
445
+ "source": [
446
+ "# Data Preprocessing\n",
447
+ "\n",
448
+ "This dataset and research is all about thyroid cancer detection. We have gathered 3(three) types of ultrasonography image .\n",
449
+ "\n",
450
+ "1. **FTC (Follicular Thyroid Carcinoma) – 100 images**\n",
451
+ "\n",
452
+ "2. **PTC (Papillary Thyroid Carcinoma) – 99 images**\n",
453
+ "\n",
454
+ "3. **MTC (Medullary Thyroid Carcinoma) – 99 images**\n",
455
+ "\n",
456
+ "4. **Benign (Normal Thyroid) - 90 images**"
457
+ ],
458
+ "metadata": {
459
+ "id": "AoeGM3-NKDwS"
460
+ }
461
+ },
462
+ {
463
+ "cell_type": "code",
464
+ "source": [
465
+ "import os\n",
466
+ "import random\n",
467
+ "from PIL import Image, ImageEnhance, ImageOps\n",
468
+ "import shutil\n",
469
+ "\n",
470
+ "\n",
471
+ "base_dir = \"USG\"\n",
472
+ "output_dir = \"thyroid_preprocessed\"\n",
473
+ "os.makedirs(output_dir, exist_ok=True)\n",
474
+ "\n",
475
+ "classes = [\"FTC\", \"PTC\", \"MTC\",\"Benign\"]\n",
476
+ "all_images = []\n",
477
+ "\n",
478
+ "for cls in classes:\n",
479
+ " img_dir = os.path.join(base_dir, cls)\n",
480
+ " imgs = [os.path.join(img_dir, f) for f in os.listdir(img_dir) if f.endswith((\".png\", \".jpg\", \".jpeg\"))]\n",
481
+ " all_images.extend([(img, cls) for img in imgs])\n",
482
+ "\n",
483
+ "random.shuffle(all_images)\n",
484
+ "\n",
485
+ "n = len(all_images)\n",
486
+ "train_split, val_split = int(0.7 * n), int(0.9 * n)\n",
487
+ "\n",
488
+ "train_data = all_images[:train_split]\n",
489
+ "val_data = all_images[train_split:val_split]\n",
490
+ "test_data = all_images[val_split:]\n",
491
+ "\n",
492
+ "def augment_image(img):\n",
493
+ " # Random brightness, contrast, and flips\n",
494
+ " if random.random() < 0.5:\n",
495
+ " img = ImageEnhance.Brightness(img).enhance(random.uniform(0.7, 1.3))\n",
496
+ " if random.random() < 0.5:\n",
497
+ " img = ImageEnhance.Contrast(img).enhance(random.uniform(0.7, 1.3))\n",
498
+ " if random.random() < 0.5:\n",
499
+ " img = ImageOps.mirror(img)\n",
500
+ " if random.random() < 0.5:\n",
501
+ " img = img.rotate(random.choice([90, 180, 270]))\n",
502
+ " return img\n",
503
+ "\n",
504
+ "# Save helper\n",
505
+ "def save_image(img, dest_dir, cls, fname):\n",
506
+ " os.makedirs(os.path.join(dest_dir, cls), exist_ok=True)\n",
507
+ " img.save(os.path.join(dest_dir, cls, fname))\n",
508
+ "\n",
509
+ "# Copy and augment\n",
510
+ "def process_dataset(data, dest_dir, apply_aug=False):\n",
511
+ " for img_path, cls in data:\n",
512
+ " img = Image.open(img_path).convert(\"RGB\")\n",
513
+ " fname = os.path.basename(img_path)\n",
514
+ " save_image(img, dest_dir, cls, fname)\n",
515
+ "\n",
516
+ " if apply_aug:\n",
517
+ " num_aug = int(0.3 * len(data)) # augment 30%\n",
518
+ " aug_samples = random.sample(data, num_aug)\n",
519
+ " for img_path, cls in aug_samples:\n",
520
+ " img = Image.open(img_path).convert(\"RGB\")\n",
521
+ " img = augment_image(img)\n",
522
+ " fname = \"aug_\" + os.path.basename(img_path)\n",
523
+ " save_image(img, dest_dir, cls, fname)\n",
524
+ "\n",
525
+ "process_dataset(train_data, os.path.join(output_dir, \"train\"), apply_aug=True)\n",
526
+ "process_dataset(val_data, os.path.join(output_dir, \"val\"), apply_aug=False)\n",
527
+ "process_dataset(test_data, os.path.join(output_dir, \"test\"), apply_aug=True)\n",
528
+ "\n",
529
+ "print(f\"Total images: {n}\")\n",
530
+ "print(f\"Train: {len(train_data)}, Val: {len(val_data)}, Test: {len(test_data)}\")\n",
531
+ "print(f\"Augmented (train): {int(0.3 * len(train_data))}, (test): {int(0.3 * len(test_data))}\")\n"
532
+ ],
533
+ "metadata": {
534
+ "colab": {
535
+ "base_uri": "https://localhost:8080/"
536
+ },
537
+ "id": "mFoil1duKt90",
538
+ "outputId": "85cb36bc-42b7-47ae-e74f-d124001bca55"
539
+ },
540
+ "execution_count": 2,
541
+ "outputs": [
542
+ {
543
+ "output_type": "stream",
544
+ "name": "stdout",
545
+ "text": [
546
+ "Total images: 388\n",
547
+ "Train: 271, Val: 78, Test: 39\n",
548
+ "Augmented (train): 81, (test): 11\n"
549
+ ]
550
+ }
551
+ ]
552
+ },
553
+ {
554
+ "cell_type": "code",
555
+ "source": [
556
+ "from torchvision import datasets, transforms\n",
557
+ "from torch.utils.data import DataLoader\n",
558
+ "\n",
559
+ "normalize = transforms.Compose([\n",
560
+ " transforms.Resize((224,224)),\n",
561
+ " transforms.ToTensor(),\n",
562
+ " transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])\n",
563
+ "])\n",
564
+ "\n",
565
+ "train_dataset = datasets.ImageFolder(\"thyroid_preprocessed/train\", transform=normalize)\n",
566
+ "val_dataset = datasets.ImageFolder(\"thyroid_preprocessed/val\", transform=normalize)\n",
567
+ "test_dataset = datasets.ImageFolder(\"thyroid_preprocessed/test\", transform=normalize)\n",
568
+ "\n",
569
+ "train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True, num_workers=2)\n",
570
+ "val_loader = DataLoader(val_dataset, batch_size=16, shuffle=False, num_workers=2)\n",
571
+ "test_loader = DataLoader(test_dataset, batch_size=16, shuffle=False, num_workers=2)\n"
572
+ ],
573
+ "metadata": {
574
+ "id": "yoeePErHLOdN"
575
+ },
576
+ "execution_count": 1,
577
+ "outputs": []
578
+ },
579
+ {
580
+ "cell_type": "code",
581
+ "source": [
582
+ "import torch.nn as nn\n",
583
+ "from torch.utils.checkpoint import checkpoint_sequential\n",
584
+ "\n",
585
+ "chunks = 2 # how many chunks for checkpointing\n",
586
+ "\n",
587
+ "class CheckpointedAlexNet(nn.Module):\n",
588
+ " def __init__(self, num_classes=4):\n",
589
+ " super().__init__()\n",
590
+ " self.features = nn.Sequential(\n",
591
+ " nn.Conv2d(3, 64, 11, stride=4, padding=2),\n",
592
+ " nn.ReLU(inplace=True),\n",
593
+ " nn.MaxPool2d(3, stride=2),\n",
594
+ " nn.Conv2d(64,192,5,padding=2),\n",
595
+ " nn.ReLU(inplace=True),\n",
596
+ " nn.MaxPool2d(3,stride=2),\n",
597
+ " nn.Conv2d(192,384,3,padding=1),\n",
598
+ " nn.ReLU(inplace=True),\n",
599
+ " nn.Conv2d(384,256,3,padding=1),\n",
600
+ " nn.ReLU(inplace=True),\n",
601
+ " nn.Conv2d(256,256,3,padding=1),\n",
602
+ " nn.ReLU(inplace=True),\n",
603
+ " nn.MaxPool2d(3,stride=2)\n",
604
+ " )\n",
605
+ " self.avgpool = nn.AdaptiveAvgPool2d((6,6))\n",
606
+ " self.classifier = nn.Sequential(\n",
607
+ " nn.Dropout(),\n",
608
+ " nn.Linear(256*6*6,4096),\n",
609
+ " nn.ReLU(inplace=True),\n",
610
+ " nn.Dropout(),\n",
611
+ " nn.Linear(4096,4096),\n",
612
+ " nn.ReLU(inplace=True),\n",
613
+ " nn.Linear(4096,num_classes)\n",
614
+ " )\n",
615
+ "\n",
616
+ " def forward(self,x):\n",
617
+ " x = checkpoint_sequential(self.features, chunks, x, use_reentrant=False)\n",
618
+ " x = self.avgpool(x)\n",
619
+ " x = x.view(x.size(0), 256*6*6)\n",
620
+ " x = self.classifier(x)\n",
621
+ " return x\n"
622
+ ],
623
+ "metadata": {
624
+ "id": "rFz09FESNQYs"
625
+ },
626
+ "execution_count": 2,
627
+ "outputs": []
628
+ },
629
+ {
630
+ "cell_type": "code",
631
+ "source": [
632
+ "import torch\n",
633
+ "\n",
634
+ "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
635
+ "model = CheckpointedAlexNet(num_classes=4).to(device)\n",
636
+ "\n",
637
+ "criterion = nn.CrossEntropyLoss()\n",
638
+ "optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)\n"
639
+ ],
640
+ "metadata": {
641
+ "id": "9QODqeToNTgo"
642
+ },
643
+ "execution_count": 3,
644
+ "outputs": []
645
+ },
646
+ {
647
+ "cell_type": "code",
648
+ "source": [
649
+ "num_epochs = 20\n",
650
+ "\n",
651
+ "for epoch in range(num_epochs):\n",
652
+ " model.train()\n",
653
+ " running_loss = 0.0\n",
654
+ " for imgs, labels in train_loader:\n",
655
+ " imgs, labels = imgs.to(device), labels.to(device)\n",
656
+ " optimizer.zero_grad()\n",
657
+ " outputs = model(imgs)\n",
658
+ " loss = criterion(outputs, labels)\n",
659
+ " loss.backward()\n",
660
+ " optimizer.step()\n",
661
+ " running_loss += loss.item() * imgs.size(0)\n",
662
+ "\n",
663
+ " epoch_loss = running_loss / len(train_loader.dataset)\n",
664
+ " print(f\"Epoch {epoch+1}/{num_epochs}, Loss: {epoch_loss:.4f}\")\n",
665
+ "\n",
666
+ " # optionally, validation accuracy\n",
667
+ " model.eval()\n",
668
+ " correct = 0\n",
669
+ " total = 0\n",
670
+ " with torch.no_grad():\n",
671
+ " for imgs, labels in val_loader:\n",
672
+ " imgs, labels = imgs.to(device), labels.to(device)\n",
673
+ " outputs = model(imgs)\n",
674
+ " _, preds = torch.max(outputs,1)\n",
675
+ " correct += (preds==labels).sum().item()\n",
676
+ " total += labels.size(0)\n",
677
+ " val_acc = correct/total\n",
678
+ " print(f\"Validation Accuracy: {val_acc:.4f}\")\n",
679
+ " torch.save(model.state_dict(), f\"model_{epoch}.pth\")\n"
680
+ ],
681
+ "metadata": {
682
+ "colab": {
683
+ "base_uri": "https://localhost:8080/"
684
+ },
685
+ "id": "snr2aZmqNWFc",
686
+ "outputId": "2e82853d-c35d-42e7-b16e-09498ad144a8"
687
+ },
688
+ "execution_count": 4,
689
+ "outputs": [
690
+ {
691
+ "output_type": "stream",
692
+ "name": "stdout",
693
+ "text": [
694
+ "Epoch 1/20, Loss: 1.3756\n",
695
+ "Validation Accuracy: 0.3590\n",
696
+ "Epoch 2/20, Loss: 1.1746\n",
697
+ "Validation Accuracy: 0.6026\n",
698
+ "Epoch 3/20, Loss: 0.9701\n",
699
+ "Validation Accuracy: 0.6538\n",
700
+ "Epoch 4/20, Loss: 0.8224\n",
701
+ "Validation Accuracy: 0.6923\n",
702
+ "Epoch 5/20, Loss: 0.6945\n",
703
+ "Validation Accuracy: 0.6026\n",
704
+ "Epoch 6/20, Loss: 0.5991\n",
705
+ "Validation Accuracy: 0.7436\n",
706
+ "Epoch 7/20, Loss: 0.5588\n",
707
+ "Validation Accuracy: 0.7949\n",
708
+ "Epoch 8/20, Loss: 0.4317\n",
709
+ "Validation Accuracy: 0.8462\n",
710
+ "Epoch 9/20, Loss: 0.3715\n",
711
+ "Validation Accuracy: 0.8590\n",
712
+ "Epoch 10/20, Loss: 0.4791\n",
713
+ "Validation Accuracy: 0.8333\n",
714
+ "Epoch 11/20, Loss: 0.3604\n",
715
+ "Validation Accuracy: 0.8333\n",
716
+ "Epoch 12/20, Loss: 0.2914\n",
717
+ "Validation Accuracy: 0.8718\n",
718
+ "Epoch 13/20, Loss: 0.2471\n",
719
+ "Validation Accuracy: 0.8077\n",
720
+ "Epoch 14/20, Loss: 0.2251\n",
721
+ "Validation Accuracy: 0.8718\n",
722
+ "Epoch 15/20, Loss: 0.1646\n",
723
+ "Validation Accuracy: 0.7821\n",
724
+ "Epoch 16/20, Loss: 0.1744\n",
725
+ "Validation Accuracy: 0.8590\n",
726
+ "Epoch 17/20, Loss: 0.1534\n",
727
+ "Validation Accuracy: 0.9103\n",
728
+ "Epoch 18/20, Loss: 0.1267\n",
729
+ "Validation Accuracy: 0.8590\n",
730
+ "Epoch 19/20, Loss: 0.1756\n",
731
+ "Validation Accuracy: 0.8077\n",
732
+ "Epoch 20/20, Loss: 0.0903\n",
733
+ "Validation Accuracy: 0.8590\n"
734
+ ]
735
+ }
736
+ ]
737
+ },
738
+ {
739
+ "cell_type": "code",
740
+ "source": [
741
+ "import torch\n",
742
+ "import os\n",
743
+ "from sklearn.metrics import classification_report, confusion_matrix\n",
744
+ "\n",
745
+ "def evaluate_all_models(model_class, test_loader, classes, model_dir=\".\", device=\"cuda\" if torch.cuda.is_available() else \"cpu\"):\n",
746
+ " model_files = sorted([f for f in os.listdir(model_dir) if f.startswith(\"model_\") and f.endswith(\".pth\")])\n",
747
+ " if not model_files:\n",
748
+ " print(\"No model_*.pth files found.\")\n",
749
+ " return\n",
750
+ "\n",
751
+ " for model_file in model_files:\n",
752
+ " path = os.path.join(model_dir, model_file)\n",
753
+ " print(f\"\\nEvaluating {model_file} ...\")\n",
754
+ "\n",
755
+ " model = model_class(num_classes=len(classes)).to(device)\n",
756
+ " model.load_state_dict(torch.load(path, map_location=device))\n",
757
+ " model.eval()\n",
758
+ "\n",
759
+ " all_preds, all_labels = [], []\n",
760
+ " with torch.no_grad():\n",
761
+ " for imgs, labels in test_loader:\n",
762
+ " imgs, labels = imgs.to(device), labels.to(device)\n",
763
+ " outputs = model(imgs)\n",
764
+ " _, preds = torch.max(outputs, 1)\n",
765
+ " all_preds.extend(preds.cpu().numpy())\n",
766
+ " all_labels.extend(labels.cpu().numpy())\n",
767
+ "\n",
768
+ " print(\"\\n=== Classification Report ===\")\n",
769
+ " print(classification_report(all_labels, all_preds, target_names=classes))\n",
770
+ " print(\"\\n=== Confusion Matrix ===\")\n",
771
+ " print(confusion_matrix(all_labels, all_preds))\n",
772
+ " print(\"=============================================\")\n"
773
+ ],
774
+ "metadata": {
775
+ "id": "hjamtIpkN2bS"
776
+ },
777
+ "execution_count": 5,
778
+ "outputs": []
779
+ },
780
+ {
781
+ "cell_type": "code",
782
+ "source": [
783
+ "classes = [\"FTC\", \"PTC\", \"MTC\",\"Benign\"]\n",
784
+ "evaluate_all_models(CheckpointedAlexNet, test_loader, classes, model_dir=\".\", device=device)\n"
785
+ ],
786
+ "metadata": {
787
+ "colab": {
788
+ "base_uri": "https://localhost:8080/"
789
+ },
790
+ "id": "53tkura8voG_",
791
+ "outputId": "9ef59975-8dd0-4d9a-be33-46437110b631"
792
+ },
793
+ "execution_count": 6,
794
+ "outputs": [
795
+ {
796
+ "output_type": "stream",
797
+ "name": "stdout",
798
+ "text": [
799
+ "\n",
800
+ "Evaluating model_0.pth ...\n",
801
+ "\n",
802
+ "=== Classification Report ===\n",
803
+ " precision recall f1-score support\n",
804
+ "\n",
805
+ " FTC 0.86 0.40 0.55 15\n",
806
+ " PTC 0.00 0.00 0.00 10\n",
807
+ " MTC 0.17 0.10 0.12 10\n",
808
+ " Benign 0.41 1.00 0.58 15\n",
809
+ "\n",
810
+ " accuracy 0.44 50\n",
811
+ " macro avg 0.36 0.38 0.31 50\n",
812
+ "weighted avg 0.41 0.44 0.36 50\n",
813
+ "\n",
814
+ "\n",
815
+ "=== Confusion Matrix ===\n",
816
+ "[[ 6 0 5 4]\n",
817
+ " [ 1 0 0 9]\n",
818
+ " [ 0 0 1 9]\n",
819
+ " [ 0 0 0 15]]\n",
820
+ "=============================================\n",
821
+ "\n",
822
+ "Evaluating model_1.pth ...\n"
823
+ ]
824
+ },
825
+ {
826
+ "output_type": "stream",
827
+ "name": "stderr",
828
+ "text": [
829
+ "/usr/local/lib/python3.12/dist-packages/sklearn/metrics/_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
830
+ " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
831
+ "/usr/local/lib/python3.12/dist-packages/sklearn/metrics/_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
832
+ " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
833
+ "/usr/local/lib/python3.12/dist-packages/sklearn/metrics/_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
834
+ " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n"
835
+ ]
836
+ },
837
+ {
838
+ "output_type": "stream",
839
+ "name": "stdout",
840
+ "text": [
841
+ "\n",
842
+ "=== Classification Report ===\n",
843
+ " precision recall f1-score support\n",
844
+ "\n",
845
+ " FTC 0.82 0.60 0.69 15\n",
846
+ " PTC 0.46 0.60 0.52 10\n",
847
+ " MTC 0.29 0.20 0.24 10\n",
848
+ " Benign 0.68 0.87 0.76 15\n",
849
+ "\n",
850
+ " accuracy 0.60 50\n",
851
+ " macro avg 0.56 0.57 0.55 50\n",
852
+ "weighted avg 0.60 0.60 0.59 50\n",
853
+ "\n",
854
+ "\n",
855
+ "=== Confusion Matrix ===\n",
856
+ "[[ 9 0 5 1]\n",
857
+ " [ 1 6 0 3]\n",
858
+ " [ 0 6 2 2]\n",
859
+ " [ 1 1 0 13]]\n",
860
+ "=============================================\n",
861
+ "\n",
862
+ "Evaluating model_10.pth ...\n",
863
+ "\n",
864
+ "=== Classification Report ===\n",
865
+ " precision recall f1-score support\n",
866
+ "\n",
867
+ " FTC 0.88 0.93 0.90 15\n",
868
+ " PTC 0.53 0.80 0.64 10\n",
869
+ " MTC 0.67 0.40 0.50 10\n",
870
+ " Benign 1.00 0.87 0.93 15\n",
871
+ "\n",
872
+ " accuracy 0.78 50\n",
873
+ " macro avg 0.77 0.75 0.74 50\n",
874
+ "weighted avg 0.80 0.78 0.78 50\n",
875
+ "\n",
876
+ "\n",
877
+ "=== Confusion Matrix ===\n",
878
+ "[[14 0 1 0]\n",
879
+ " [ 1 8 1 0]\n",
880
+ " [ 1 5 4 0]\n",
881
+ " [ 0 2 0 13]]\n",
882
+ "=============================================\n",
883
+ "\n",
884
+ "Evaluating model_11.pth ...\n",
885
+ "\n",
886
+ "=== Classification Report ===\n",
887
+ " precision recall f1-score support\n",
888
+ "\n",
889
+ " FTC 0.74 0.93 0.82 15\n",
890
+ " PTC 0.73 0.80 0.76 10\n",
891
+ " MTC 0.75 0.60 0.67 10\n",
892
+ " Benign 1.00 0.80 0.89 15\n",
893
+ "\n",
894
+ " accuracy 0.80 50\n",
895
+ " macro avg 0.80 0.78 0.79 50\n",
896
+ "weighted avg 0.82 0.80 0.80 50\n",
897
+ "\n",
898
+ "\n",
899
+ "=== Confusion Matrix ===\n",
900
+ "[[14 0 1 0]\n",
901
+ " [ 1 8 1 0]\n",
902
+ " [ 2 2 6 0]\n",
903
+ " [ 2 1 0 12]]\n",
904
+ "=============================================\n",
905
+ "\n",
906
+ "Evaluating model_12.pth ...\n",
907
+ "\n",
908
+ "=== Classification Report ===\n",
909
+ " precision recall f1-score support\n",
910
+ "\n",
911
+ " FTC 1.00 0.73 0.85 15\n",
912
+ " PTC 0.75 0.90 0.82 10\n",
913
+ " MTC 0.60 0.60 0.60 10\n",
914
+ " Benign 0.88 1.00 0.94 15\n",
915
+ "\n",
916
+ " accuracy 0.82 50\n",
917
+ " macro avg 0.81 0.81 0.80 50\n",
918
+ "weighted avg 0.83 0.82 0.82 50\n",
919
+ "\n",
920
+ "\n",
921
+ "=== Confusion Matrix ===\n",
922
+ "[[11 0 3 1]\n",
923
+ " [ 0 9 1 0]\n",
924
+ " [ 0 3 6 1]\n",
925
+ " [ 0 0 0 15]]\n",
926
+ "=============================================\n",
927
+ "\n",
928
+ "Evaluating model_13.pth ...\n",
929
+ "\n",
930
+ "=== Classification Report ===\n",
931
+ " precision recall f1-score support\n",
932
+ "\n",
933
+ " FTC 1.00 0.73 0.85 15\n",
934
+ " PTC 0.73 0.80 0.76 10\n",
935
+ " MTC 0.60 0.90 0.72 10\n",
936
+ " Benign 1.00 0.87 0.93 15\n",
937
+ "\n",
938
+ " accuracy 0.82 50\n",
939
+ " macro avg 0.83 0.82 0.81 50\n",
940
+ "weighted avg 0.87 0.82 0.83 50\n",
941
+ "\n",
942
+ "\n",
943
+ "=== Confusion Matrix ===\n",
944
+ "[[11 0 4 0]\n",
945
+ " [ 0 8 2 0]\n",
946
+ " [ 0 1 9 0]\n",
947
+ " [ 0 2 0 13]]\n",
948
+ "=============================================\n",
949
+ "\n",
950
+ "Evaluating model_14.pth ...\n",
951
+ "\n",
952
+ "=== Classification Report ===\n",
953
+ " precision recall f1-score support\n",
954
+ "\n",
955
+ " FTC 0.88 0.93 0.90 15\n",
956
+ " PTC 0.86 0.60 0.71 10\n",
957
+ " MTC 0.69 0.90 0.78 10\n",
958
+ " Benign 0.93 0.87 0.90 15\n",
959
+ "\n",
960
+ " accuracy 0.84 50\n",
961
+ " macro avg 0.84 0.82 0.82 50\n",
962
+ "weighted avg 0.85 0.84 0.84 50\n",
963
+ "\n",
964
+ "\n",
965
+ "=== Confusion Matrix ===\n",
966
+ "[[14 0 1 0]\n",
967
+ " [ 1 6 3 0]\n",
968
+ " [ 0 0 9 1]\n",
969
+ " [ 1 1 0 13]]\n",
970
+ "=============================================\n",
971
+ "\n",
972
+ "Evaluating model_15.pth ...\n",
973
+ "\n",
974
+ "=== Classification Report ===\n",
975
+ " precision recall f1-score support\n",
976
+ "\n",
977
+ " FTC 0.88 0.93 0.90 15\n",
978
+ " PTC 0.80 0.80 0.80 10\n",
979
+ " MTC 0.80 0.80 0.80 10\n",
980
+ " Benign 0.93 0.87 0.90 15\n",
981
+ "\n",
982
+ " accuracy 0.86 50\n",
983
+ " macro avg 0.85 0.85 0.85 50\n",
984
+ "weighted avg 0.86 0.86 0.86 50\n",
985
+ "\n",
986
+ "\n",
987
+ "=== Confusion Matrix ===\n",
988
+ "[[14 0 1 0]\n",
989
+ " [ 1 8 1 0]\n",
990
+ " [ 0 1 8 1]\n",
991
+ " [ 1 1 0 13]]\n",
992
+ "=============================================\n",
993
+ "\n",
994
+ "Evaluating model_16.pth ...\n",
995
+ "\n",
996
+ "=== Classification Report ===\n",
997
+ " precision recall f1-score support\n",
998
+ "\n",
999
+ " FTC 1.00 0.93 0.97 15\n",
1000
+ " PTC 0.56 0.90 0.69 10\n",
1001
+ " MTC 0.71 0.50 0.59 10\n",
1002
+ " Benign 1.00 0.87 0.93 15\n",
1003
+ "\n",
1004
+ " accuracy 0.82 50\n",
1005
+ " macro avg 0.82 0.80 0.79 50\n",
1006
+ "weighted avg 0.86 0.82 0.82 50\n",
1007
+ "\n",
1008
+ "\n",
1009
+ "=== Confusion Matrix ===\n",
1010
+ "[[14 0 1 0]\n",
1011
+ " [ 0 9 1 0]\n",
1012
+ " [ 0 5 5 0]\n",
1013
+ " [ 0 2 0 13]]\n",
1014
+ "=============================================\n",
1015
+ "\n",
1016
+ "Evaluating model_17.pth ...\n",
1017
+ "\n",
1018
+ "=== Classification Report ===\n",
1019
+ " precision recall f1-score support\n",
1020
+ "\n",
1021
+ " FTC 0.93 0.93 0.93 15\n",
1022
+ " PTC 0.88 0.70 0.78 10\n",
1023
+ " MTC 0.80 0.80 0.80 10\n",
1024
+ " Benign 0.88 1.00 0.94 15\n",
1025
+ "\n",
1026
+ " accuracy 0.88 50\n",
1027
+ " macro avg 0.87 0.86 0.86 50\n",
1028
+ "weighted avg 0.88 0.88 0.88 50\n",
1029
+ "\n",
1030
+ "\n",
1031
+ "=== Confusion Matrix ===\n",
1032
+ "[[14 0 1 0]\n",
1033
+ " [ 1 7 1 1]\n",
1034
+ " [ 0 1 8 1]\n",
1035
+ " [ 0 0 0 15]]\n",
1036
+ "=============================================\n",
1037
+ "\n",
1038
+ "Evaluating model_18.pth ...\n",
1039
+ "\n",
1040
+ "=== Classification Report ===\n",
1041
+ " precision recall f1-score support\n",
1042
+ "\n",
1043
+ " FTC 1.00 0.60 0.75 15\n",
1044
+ " PTC 0.90 0.90 0.90 10\n",
1045
+ " MTC 0.57 0.80 0.67 10\n",
1046
+ " Benign 0.88 1.00 0.94 15\n",
1047
+ "\n",
1048
+ " accuracy 0.82 50\n",
1049
+ " macro avg 0.84 0.82 0.81 50\n",
1050
+ "weighted avg 0.86 0.82 0.82 50\n",
1051
+ "\n",
1052
+ "\n",
1053
+ "=== Confusion Matrix ===\n",
1054
+ "[[ 9 0 5 1]\n",
1055
+ " [ 0 9 1 0]\n",
1056
+ " [ 0 1 8 1]\n",
1057
+ " [ 0 0 0 15]]\n",
1058
+ "=============================================\n",
1059
+ "\n",
1060
+ "Evaluating model_19.pth ...\n",
1061
+ "\n",
1062
+ "=== Classification Report ===\n",
1063
+ " precision recall f1-score support\n",
1064
+ "\n",
1065
+ " FTC 0.88 0.93 0.90 15\n",
1066
+ " PTC 0.80 0.80 0.80 10\n",
1067
+ " MTC 0.78 0.70 0.74 10\n",
1068
+ " Benign 0.93 0.93 0.93 15\n",
1069
+ "\n",
1070
+ " accuracy 0.86 50\n",
1071
+ " macro avg 0.85 0.84 0.84 50\n",
1072
+ "weighted avg 0.86 0.86 0.86 50\n",
1073
+ "\n",
1074
+ "\n",
1075
+ "=== Confusion Matrix ===\n",
1076
+ "[[14 0 1 0]\n",
1077
+ " [ 1 8 1 0]\n",
1078
+ " [ 1 1 7 1]\n",
1079
+ " [ 0 1 0 14]]\n",
1080
+ "=============================================\n",
1081
+ "\n",
1082
+ "Evaluating model_2.pth ...\n",
1083
+ "\n",
1084
+ "=== Classification Report ===\n",
1085
+ " precision recall f1-score support\n",
1086
+ "\n",
1087
+ " FTC 0.93 0.93 0.93 15\n",
1088
+ " PTC 1.00 0.40 0.57 10\n",
1089
+ " MTC 0.75 0.90 0.82 10\n",
1090
+ " Benign 0.74 0.93 0.82 15\n",
1091
+ "\n",
1092
+ " accuracy 0.82 50\n",
1093
+ " macro avg 0.86 0.79 0.79 50\n",
1094
+ "weighted avg 0.85 0.82 0.80 50\n",
1095
+ "\n",
1096
+ "\n",
1097
+ "=== Confusion Matrix ===\n",
1098
+ "[[14 0 0 1]\n",
1099
+ " [ 1 4 2 3]\n",
1100
+ " [ 0 0 9 1]\n",
1101
+ " [ 0 0 1 14]]\n",
1102
+ "=============================================\n",
1103
+ "\n",
1104
+ "Evaluating model_3.pth ...\n",
1105
+ "\n",
1106
+ "=== Classification Report ===\n",
1107
+ " precision recall f1-score support\n",
1108
+ "\n",
1109
+ " FTC 0.93 0.93 0.93 15\n",
1110
+ " PTC 0.75 0.30 0.43 10\n",
1111
+ " MTC 0.56 1.00 0.71 10\n",
1112
+ " Benign 1.00 0.87 0.93 15\n",
1113
+ "\n",
1114
+ " accuracy 0.80 50\n",
1115
+ " macro avg 0.81 0.78 0.75 50\n",
1116
+ "weighted avg 0.84 0.80 0.79 50\n",
1117
+ "\n",
1118
+ "\n",
1119
+ "=== Confusion Matrix ===\n",
1120
+ "[[14 0 1 0]\n",
1121
+ " [ 1 3 6 0]\n",
1122
+ " [ 0 0 10 0]\n",
1123
+ " [ 0 1 1 13]]\n",
1124
+ "=============================================\n",
1125
+ "\n",
1126
+ "Evaluating model_4.pth ...\n",
1127
+ "\n",
1128
+ "=== Classification Report ===\n",
1129
+ " precision recall f1-score support\n",
1130
+ "\n",
1131
+ " FTC 0.64 0.93 0.76 15\n",
1132
+ " PTC 1.00 0.40 0.57 10\n",
1133
+ " MTC 0.86 0.60 0.71 10\n",
1134
+ " Benign 0.82 0.93 0.88 15\n",
1135
+ "\n",
1136
+ " accuracy 0.76 50\n",
1137
+ " macro avg 0.83 0.72 0.73 50\n",
1138
+ "weighted avg 0.81 0.76 0.74 50\n",
1139
+ "\n",
1140
+ "\n",
1141
+ "=== Confusion Matrix ===\n",
1142
+ "[[14 0 0 1]\n",
1143
+ " [ 4 4 1 1]\n",
1144
+ " [ 3 0 6 1]\n",
1145
+ " [ 1 0 0 14]]\n",
1146
+ "=============================================\n",
1147
+ "\n",
1148
+ "Evaluating model_5.pth ...\n",
1149
+ "\n",
1150
+ "=== Classification Report ===\n",
1151
+ " precision recall f1-score support\n",
1152
+ "\n",
1153
+ " FTC 0.94 1.00 0.97 15\n",
1154
+ " PTC 0.67 0.80 0.73 10\n",
1155
+ " MTC 0.89 0.80 0.84 10\n",
1156
+ " Benign 1.00 0.87 0.93 15\n",
1157
+ "\n",
1158
+ " accuracy 0.88 50\n",
1159
+ " macro avg 0.87 0.87 0.87 50\n",
1160
+ "weighted avg 0.89 0.88 0.88 50\n",
1161
+ "\n",
1162
+ "\n",
1163
+ "=== Confusion Matrix ===\n",
1164
+ "[[15 0 0 0]\n",
1165
+ " [ 1 8 1 0]\n",
1166
+ " [ 0 2 8 0]\n",
1167
+ " [ 0 2 0 13]]\n",
1168
+ "=============================================\n",
1169
+ "\n",
1170
+ "Evaluating model_6.pth ...\n",
1171
+ "\n",
1172
+ "=== Classification Report ===\n",
1173
+ " precision recall f1-score support\n",
1174
+ "\n",
1175
+ " FTC 0.92 0.80 0.86 15\n",
1176
+ " PTC 0.70 0.70 0.70 10\n",
1177
+ " MTC 0.57 0.80 0.67 10\n",
1178
+ " Benign 1.00 0.87 0.93 15\n",
1179
+ "\n",
1180
+ " accuracy 0.80 50\n",
1181
+ " macro avg 0.80 0.79 0.79 50\n",
1182
+ "weighted avg 0.83 0.80 0.81 50\n",
1183
+ "\n",
1184
+ "\n",
1185
+ "=== Confusion Matrix ===\n",
1186
+ "[[12 0 3 0]\n",
1187
+ " [ 1 7 2 0]\n",
1188
+ " [ 0 2 8 0]\n",
1189
+ " [ 0 1 1 13]]\n",
1190
+ "=============================================\n",
1191
+ "\n",
1192
+ "Evaluating model_7.pth ...\n",
1193
+ "\n",
1194
+ "=== Classification Report ===\n",
1195
+ " precision recall f1-score support\n",
1196
+ "\n",
1197
+ " FTC 0.87 0.87 0.87 15\n",
1198
+ " PTC 0.57 0.80 0.67 10\n",
1199
+ " MTC 0.56 0.50 0.53 10\n",
1200
+ " Benign 1.00 0.80 0.89 15\n",
1201
+ "\n",
1202
+ " accuracy 0.76 50\n",
1203
+ " macro avg 0.75 0.74 0.74 50\n",
1204
+ "weighted avg 0.79 0.76 0.77 50\n",
1205
+ "\n",
1206
+ "\n",
1207
+ "=== Confusion Matrix ===\n",
1208
+ "[[13 0 2 0]\n",
1209
+ " [ 1 8 1 0]\n",
1210
+ " [ 0 5 5 0]\n",
1211
+ " [ 1 1 1 12]]\n",
1212
+ "=============================================\n",
1213
+ "\n",
1214
+ "Evaluating model_8.pth ...\n",
1215
+ "\n",
1216
+ "=== Classification Report ===\n",
1217
+ " precision recall f1-score support\n",
1218
+ "\n",
1219
+ " FTC 1.00 0.87 0.93 15\n",
1220
+ " PTC 0.73 0.80 0.76 10\n",
1221
+ " MTC 0.58 0.70 0.64 10\n",
1222
+ " Benign 0.93 0.87 0.90 15\n",
1223
+ "\n",
1224
+ " accuracy 0.82 50\n",
1225
+ " macro avg 0.81 0.81 0.81 50\n",
1226
+ "weighted avg 0.84 0.82 0.83 50\n",
1227
+ "\n",
1228
+ "\n",
1229
+ "=== Confusion Matrix ===\n",
1230
+ "[[13 0 2 0]\n",
1231
+ " [ 0 8 2 0]\n",
1232
+ " [ 0 2 7 1]\n",
1233
+ " [ 0 1 1 13]]\n",
1234
+ "=============================================\n",
1235
+ "\n",
1236
+ "Evaluating model_9.pth ...\n",
1237
+ "\n",
1238
+ "=== Classification Report ===\n",
1239
+ " precision recall f1-score support\n",
1240
+ "\n",
1241
+ " FTC 0.83 1.00 0.91 15\n",
1242
+ " PTC 0.67 0.80 0.73 10\n",
1243
+ " MTC 0.71 0.50 0.59 10\n",
1244
+ " Benign 1.00 0.87 0.93 15\n",
1245
+ "\n",
1246
+ " accuracy 0.82 50\n",
1247
+ " macro avg 0.80 0.79 0.79 50\n",
1248
+ "weighted avg 0.83 0.82 0.81 50\n",
1249
+ "\n",
1250
+ "\n",
1251
+ "=== Confusion Matrix ===\n",
1252
+ "[[15 0 0 0]\n",
1253
+ " [ 0 8 2 0]\n",
1254
+ " [ 2 3 5 0]\n",
1255
+ " [ 1 1 0 13]]\n",
1256
+ "=============================================\n"
1257
+ ]
1258
+ }
1259
+ ]
1260
+ },
1261
+ {
1262
+ "cell_type": "markdown",
1263
+ "source": [
1264
+ "## Best model is:``model_17.pth``"
1265
+ ],
1266
+ "metadata": {
1267
+ "id": "4oPsGo7TDShu"
1268
+ }
1269
+ },
1270
+ {
1271
+ "cell_type": "code",
1272
+ "source": [
1273
+ "import torch\n",
1274
+ "import torch.nn as nn\n",
1275
+ "from sklearn.metrics import confusion_matrix, classification_report\n",
1276
+ "import seaborn as sns\n",
1277
+ "import matplotlib.pyplot as plt\n",
1278
+ "\n",
1279
+ "# === Config ===\n",
1280
+ "model_path = \"model_17.pth\"\n",
1281
+ "classes = [\"FTC\", \"PTC\", \"MTC\",\"Benign\"] # adjust if you have 4 classes\n",
1282
+ "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
1283
+ "\n",
1284
+ "# === Recreate model architecture ===\n",
1285
+ "model = CheckpointedAlexNet(num_classes=len(classes)).to(device)\n",
1286
+ "\n",
1287
+ "# === Load state dict ===\n",
1288
+ "model.load_state_dict(torch.load(model_path, map_location=device))\n",
1289
+ "model.eval()\n",
1290
+ "\n",
1291
+ "# === Collect predictions ===\n",
1292
+ "all_preds, all_labels = [], []\n",
1293
+ "with torch.no_grad():\n",
1294
+ " for imgs, labels in test_loader:\n",
1295
+ " imgs, labels = imgs.to(device), labels.to(device)\n",
1296
+ " outputs = model(imgs)\n",
1297
+ " _, preds = torch.max(outputs, 1)\n",
1298
+ " all_preds.extend(preds.cpu().numpy())\n",
1299
+ " all_labels.extend(labels.cpu().numpy())\n",
1300
+ "\n",
1301
+ "# === Confusion Matrix ===\n",
1302
+ "cm = confusion_matrix(all_labels, all_preds)\n",
1303
+ "\n",
1304
+ "plt.figure(figsize=(6, 5))\n",
1305
+ "sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\",\n",
1306
+ " xticklabels=classes, yticklabels=classes)\n",
1307
+ "plt.xlabel(\"Predicted\")\n",
1308
+ "plt.ylabel(\"True\")\n",
1309
+ "plt.title(\"Confusion Matrix - model_17.pth\")\n",
1310
+ "plt.tight_layout()\n",
1311
+ "plt.show()\n",
1312
+ "\n",
1313
+ "# === Classification report ===\n",
1314
+ "print(\"Classification Report:\\n\")\n",
1315
+ "print(classification_report(all_labels, all_preds, target_names=classes))\n"
1316
+ ],
1317
+ "metadata": {
1318
+ "colab": {
1319
+ "base_uri": "https://localhost:8080/",
1320
+ "height": 733
1321
+ },
1322
+ "id": "P35hNwjvDXFU",
1323
+ "outputId": "5316101a-156b-4dc0-ee7a-114997260275"
1324
+ },
1325
+ "execution_count": 8,
1326
+ "outputs": [
1327
+ {
1328
+ "output_type": "display_data",
1329
+ "data": {
1330
+ "text/plain": [
1331
+ "<Figure size 600x500 with 2 Axes>"
1332
+ ],
1333
+ "image/png": "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adOm2rRpk2nnyKwiAACQrqSkJCUlJTm12e122e32NNuePn1aKSkpKliwoFN7wYIFtXfvXtNi8sjExc/DziopKUlRUVGKjIxM94cF1uMauQdPvE4Jv820OgRTeeI1yk5m//0b/2qUJkyY4NQ2btw4jR8/3twDZYHNMAzDsqMjUy5cuKDg4GDFxcUpKCjI6nCQDq6Re+A6uT6ukWvJSsXlypUryp07tz799FO1b9/e0R4REaHz58/r888/NyUmxrgAAIB02e12BQUFOS0ZVcJ8fX1Vq1YtrV692tGWmpqq1atXq169eqbF5GGdKgAAwCpDhw5VRESEateurfvuu09Tp07VpUuX1KtXL9OOQeICAABM8cQTT+jUqVN6+eWXdeLECVWvXl3ffvttmgG7d4LExQ3Y7XaNGzeOgWoujGvkHrhOro9r5P4GDRqkQYMG3bX9MzgXAAC4DQbnAgAAt0HiAgAA3AaJCwDAZYWHh2vq1KlWhwEXQuJioZ49e8pms2V5Wbt2rSTps88+U6NGjRQcHKw8efKoatWqmjhxos6ePWvtiXmQ66+Rr6+vSpcurYkTJ6pHjx43vUbh4eGS/r2Z1pgxY1S+fHn5+fmpUKFCatq0qZYuXSqGl92Za9emf//+adYNHDhQNpstU9+xa3cA/e233/T444+rYMGC8vPzU5kyZdSnTx/t378/m8/MPdz42YaGhqply5bauXOnqcfZsmWL+vbta+o+4d5IXCzWsmVLHT9+3LEcPnxYf//9t+N1586d02zzwAMPaMyYMXriiSdUp04dffPNN/r999/15ptvaseOHZo/f77Vp+VRrn3+MTExGjZsmMaPH68yZco4XRNJmjNnjuP1li1bdP78eT3wwAP66KOPFBkZqW3btmndunV64oknNHLkSMXFxVl8Zu6vaNGiWrRokRISEhxtiYmJWrBggYoVKyZJTtdp6tSpCgoKcmobPny4VqxYofvvv19JSUmKjo7Wnj179PHHHys4OFhjx4616vRc3vW/m1avXq2cOXOqTZs2ph6jQIECyp07t6n7hJszYJmIiAijXbt2Wd5m8+bNhiRj6tSp6b7n3Llz5gSIdD//Zs2aGffff79TmyRj2bJlTm3PPvusERAQYBw9ejTNfi9evGgkJyebHa5XuXZtKleubHz88ceO9ujoaKNq1apGu3btjIiICKf3zJkzxwgODnZqu3TpkpE/f36jffv26R6H71P60vturF+/3pBknDx50jAMwzhy5Ijx+OOPG8HBwUZISIjRtm1b49ChQ2n28cYbbxiFChUy8uXLZwwYMMC4cuWKY5vixYsbU6ZMcbzes2ePUb9+fcNutxsVKlQwVq1a5fT9O3TokCHJ+Oyzz4xGjRoZ/v7+RtWqVY2ffvrpbn0UyGZUXNxQdHS08uTJowEDBqS7Pm/evNkbkJfx9/fXlStXbrpNamqqFi1apO7du6tIkSJp1ufJk0c5c3IbJTP07t1bc+bMcbz+8MMPs3SXzpUrV+r06dMaOXJkuuv5PmVOfHy8Pv74Y5UuXVqhoaFKTk5WixYtFBgYqPXr12vjxo3KkyePWrZs6fT9WbNmjQ4cOKA1a9Zo3rx5mjt3rubOnZvuMVJSUtS+fXvlzp1bmzdv1nvvvacxY8aku+2YMWM0fPhwbd++XWXLllXXrl119erVu3HqyGYkLhZbsWKF8uTJ41gef/zxW74nJiZGJUuWVK5cubIhQlxjGIa+//57rVy5Ug8//PBNtz19+rTOnTun8uXLZ1N03qtHjx7asGGDDh8+rMOHD2vjxo3q0aNHpt8fExMjSVyr23D976/AwEB98cUXWrx4sXx8fLR48WKlpqbq/fffV5UqVVShQgXNmTNHR44ccYzTk6SQkBDNnDlT5cuXV5s2bdS6dWunZ91cb9WqVTpw4IA++ugjVatWTQ8++KBee+21dLcdPny4WrdurbJly2rChAk6fPiwYmNj78bHgGzGP/ks1rhxY73zzjuO1wEBAbd8j8Ggzmx17ZdzcnKyUlNT1a1bt1s+0p1rlH0KFCig1q1ba+7cuTIMQ61bt1b+/Pkz/X6u1e27/vfXuXPn9Pbbb6tVq1b65ZdftGPHDsXGxiowMNDpPYmJiTpw4IDjdaVKlZQjRw7H68KFC2vXrl3pHm/fvn0qWrSoChUq5Gi777770t22atWqTvuUpJMnT5KgegASF4sFBASodOnSWXpP2bJltWHDBiUnJ1N1yQbXfjn7+vqqSJEimeriKVCggPLmzau9e/dmQ4To3bu34xbjs2bNytJ7y5YtK0nau3evqU+w9QY3/v56//33FRwcrP/973+Kj49XrVq1FB0dneZ9BQoUcPz3jb/DbDabUlNT7zi26/drs9kkyZT9wnp0Fbmhbt26KT4+Xm+//Xa668+fP5+9AXm4a7+cixUrlulxKT4+PurSpYuio6N17NixNOvj4+PpbzfRtXET18ZVZEXz5s2VP39+TZ48Od31fJ8yz2azycfHRwkJCapZs6ZiYmIUFham0qVLOy3BwcG3tf9y5crpr7/+0j///ONo27Jli1nhw02QuLihunXrauTIkRo2bJhGjhypTZs26fDhw1q9erUef/xxzZs3z+oQIem1115T0aJFVbduXX300UfavXu3YmJi9OGHH6pGjRqKj4+3OkSPkSNHDu3Zs0e7d+926nbIjICAAL3//vv66quv1LZtW33//ff6888/tXXrVo0cOTLd+8TgX0lJSTpx4oROnDihPXv26LnnnlN8fLweffRRde/eXfnz51e7du20fv16HTp0SGvXrtXgwYP1999/39bxmjVrplKlSikiIkI7d+7Uxo0b9dJLL0n6/1UVeD4SFzf1+uuva8GCBdq8ebNatGihSpUqaejQoapataoiIiKsDg+S8uXLp59//lk9evTQq6++qho1auihhx7SwoUL9cYbb9z2vzqRvqCgIAUFBd3We9u1a6effvpJuXLlUrdu3VS+fHl17dpVcXFxevXVV02O1HN8++23Kly4sAoXLqy6detqy5YtWrJkiRo1aqTcuXNr3bp1KlasmDp27KgKFSro6aefVmJi4m1fpxw5cmj58uWKj49XnTp19MwzzzhmFfn5+Zl5anBhPB0aAOC2Nm7cqAcffFCxsbEqVaqU1eEgG5C4AADcxrJly5QnTx6VKVNGsbGxGjJkiEJCQrRhwwarQ0M2YVYRAMBtXLx4UaNGjdKRI0eUP39+NW3aVG+++abVYSEbUXEBAABug8G5AADAbZC4AAAAt0HiAgAA3AaJCwAAcBskLgAAwG2QuACQJPXs2VPt27d3vG7UqJGef/75bI9j7dq1stlsPCMIQLpIXAAX17NnT9lsNtlsNvn6+qp06dKaOHHiXX9I49KlS/XKK69kaluSDQDZhRvQAW6gZcuWmjNnjpKSkvT1119r4MCBypUrlyIjI522u3Llinx9fU05Zr58+UzZDwCYiYoL4AbsdrsKFSqk4sWL69lnn1XTpk31xRdfOLp3XnvtNRUpUkTlypWTJP3111/q3Lmz8ubNq3z58qldu3b6888/HftLSUnR0KFDlTdvXoWGhmrkyJG68V6UN3YVJSUladSoUSpatKjsdrtKly6tDz74QH/++acaN24sSQoJCZHNZlPPnj0lSampqYqKilKJEiXk7++vatWq6dNPP3U6ztdff62yZcvK399fjRs3dooTAG5E4gK4IX9/f125ckWStHr1au3bt0+rVq3SihUrlJycrBYtWigwMFDr16/Xxo0blSdPHrVs2dLxnjfffFNz587Vhx9+qA0bNujs2bNatmzZTY/51FNPaeHChZo+fbr27Nmjd999V3ny5FHRokX12WefSZL27dun48ePa9q0aZKkqKgoffTRR5o9e7b++OMPvfDCC+rRo4d+/PFHSf8mWB07dtSjjz6q7du365lnntHo0aPv1scGwBMYAFxaRESE0a5dO8MwDCM1NdVYtWqVYbfbjeHDhxsRERFGwYIFjaSkJMf28+fPN8qVK2ekpqY62pKSkgx/f39j5cqVhmEYRuHChY3Jkyc71icnJxv33nuv4ziGYRgNGzY0hgwZYhiGYezbt8+QZKxatSrdGNesWWNIMs6dO+doS0xMNHLnzm389NNPTts+/fTTRteuXQ3DMIzIyEijYsWKTutHjRqVZl8AcA1jXAA3sGLFCuXJk0fJyclKTU1Vt27dNH78eA0cOFBVqlRxGteyY8cOxcbGKjAw0GkfiYmJOnDggOLi4nT8+HHVrVvXsS5nzpyqXbt2mu6ia7Zv364cOXKoYcOGmY45NjZWly9fVrNmzZzar1y5oho1akiS9uzZ4xSHJNWrVy/TxwDgfUhcADfQuHFjvfPOO/L19VWRIkWUM+f//+oGBAQ4bRsfH69atWopOjo6zX4KFChwW8f39/fP8nvi4+MlSV999ZXuuecep3V2u/224gAAEhfADQQEBKh06dKZ2rZmzZpavHixwsLCFBQUlO42hQsX1ubNm9WgQQNJ0tWrV/Xrr7+qZs2a6W5fpUoVpaam6scff1TTpk3TrL9W8UlJSXG0VaxYUXa7XUeOHMmwUlOhQgV98cUXTm0///zzrU8SgNdicC7gYbp37678+fOrXbt2Wr9+vQ4dOqS1a9dq8ODB+vvvvyVJQ4YM0X/+8x8tX75ce/fu1YABA256D5bw8HBFRESod+/eWr58uWOfn3zyiSSpePHistlsWrFihU6dOqX4+HgFBgZq+PDheuGFFzRv3jwdOHBA27Zt04wZMzRv3jxJUv/+/RUTE6MRI0Zo3759WrBggebOnXu3PyIAbozEBfAwuXPn1rp161SsWDF17NhRFSpU0NNPP63ExERHBWbYsGF68sknFRERoXr16ikwMFAdOnS46X7feecdderUSQMGDFD58uXVp08fXbp0SZJ0zz33aMKECRo9erQKFiyoQYMGSZJeeeUVjR07VlFRUapQoYJatmypr776SiVKlJAkFStWTJ999pmWL1+uatWqafbs2Zo0adJd/HQAuDubkdFoPAAAABdDxQUAALgNEhcAAOA2SFwAAIDbIHEBAABug8QFAAC4DRIXAADgNkhcAACA2yBxAQAAboPEBQAAuA0SFwAA4DZIXAAAgNsgcQEAAG7j/wHWqSARFaOrSQAAAABJRU5ErkJggg==\n"
1334
+ },
1335
+ "metadata": {}
1336
+ },
1337
+ {
1338
+ "output_type": "stream",
1339
+ "name": "stdout",
1340
+ "text": [
1341
+ "Classification Report:\n",
1342
+ "\n",
1343
+ " precision recall f1-score support\n",
1344
+ "\n",
1345
+ " FTC 0.93 0.93 0.93 15\n",
1346
+ " PTC 0.88 0.70 0.78 10\n",
1347
+ " MTC 0.80 0.80 0.80 10\n",
1348
+ " Benign 0.88 1.00 0.94 15\n",
1349
+ "\n",
1350
+ " accuracy 0.88 50\n",
1351
+ " macro avg 0.87 0.86 0.86 50\n",
1352
+ "weighted avg 0.88 0.88 0.88 50\n",
1353
+ "\n"
1354
+ ]
1355
+ }
1356
+ ]
1357
+ },
1358
+ {
1359
+ "cell_type": "markdown",
1360
+ "source": [
1361
+ "## Final Report\n",
1362
+ "\n",
1363
+ "Benign: perfect classification (15/15)\n",
1364
+ "\n",
1365
+ "FTC: only one misclassified\n",
1366
+ "\n",
1367
+ "PTC: 2 misclassified (one as FTC, one as Benign)\n",
1368
+ "\n",
1369
+ "MTC: also strong, only a few mislabels"
1370
+ ],
1371
+ "metadata": {
1372
+ "id": "gAzSMUGnEF5u"
1373
+ }
1374
+ }
1375
+ ]
1376
+ }