cloudlyte commited on
Commit
fc41719
Β·
1 Parent(s): 4e24843

code files

Browse files
Files changed (8) hide show
  1. README.md +7 -0
  2. default.py +97 -0
  3. dog.png +0 -0
  4. gd-dog.jpg +0 -0
  5. imagenet-classes.txt +1000 -0
  6. inference.ipynb +295 -0
  7. mini.py +6 -0
  8. resnet-50-imagenet.ipynb +1 -0
README.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # ResNet-50 on ImageNet Mini
2
+
3
+ ```
4
+ Dataset Link:
5
+
6
+ https://www.kaggle.com/datasets/ifigotin/imagenetmini-1000
7
+ ```
default.py ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Load the ResNet50 model
2
+ def ResNet50(num_classes, channels=3):
3
+ return ResNet(Bottleneck, [3,4,6,3], num_classes, channels)
4
+
5
+ model = ResNet50(num_classes=1000)
6
+
7
+ # Parallelize training across multiple GPUs
8
+ # model = torch.nn.DataParallel(model)
9
+
10
+ # Set the model to run on the device
11
+ model = model.to(device)
12
+
13
+ # Define the loss function and optimizer
14
+ criterion = torch.nn.CrossEntropyLoss()
15
+ optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
16
+
17
+ # Function to evaluate the model
18
+ def evaluate_model(model, val_loader, criterion):
19
+ model.eval()
20
+ val_loss = 0.0
21
+ correct = 0
22
+ total = 0
23
+ class_correct = [0] * len(val_dataset.classes)
24
+ class_total = [0] * len(val_dataset.classes)
25
+
26
+ with torch.no_grad():
27
+ for inputs, labels in tqdm(val_loader, desc="Validating"):
28
+ inputs, labels = inputs.to(device), labels.to(device)
29
+
30
+ outputs = model(inputs)
31
+ loss = criterion(outputs, labels)
32
+ val_loss += loss.item()
33
+
34
+ _, predicted = torch.max(outputs, 1)
35
+ correct += (predicted == labels).sum().item()
36
+ total += labels.size(0)
37
+
38
+ for i in range(len(labels)):
39
+ label = labels[i]
40
+ class_correct[label] += (predicted[i] == label).item()
41
+ class_total[label] += 1
42
+
43
+ val_loss /= len(val_loader)
44
+ accuracy = 100.0 * correct / total
45
+ per_class_accuracy = {
46
+ val_dataset.classes[i]: 100.0 * class_correct[i] / class_total[i]
47
+ for i in range(len(val_dataset.classes))
48
+ if class_total[i] > 0
49
+ }
50
+ return val_loss, accuracy, per_class_accuracy
51
+
52
+ # Train the model
53
+ print(f'Training the model on ImageNet')
54
+ for epoch in range(num_epochs):
55
+ model.train()
56
+ running_loss = 0.0
57
+ correct = 0
58
+ total = 0
59
+
60
+ for inputs, labels in tqdm(train_loader, desc=f"Epoch {epoch+1}/{num_epochs}"):
61
+ inputs, labels = inputs.to(device), labels.to(device)
62
+
63
+ # Zero out the optimizer
64
+ optimizer.zero_grad()
65
+
66
+ # Forward pass
67
+ outputs = model(inputs)
68
+ loss = criterion(outputs, labels)
69
+
70
+ # Backward pass
71
+ loss.backward()
72
+ optimizer.step()
73
+
74
+ running_loss += loss.item()
75
+
76
+ # Calculate accuracy during training
77
+ _, predicted = torch.max(outputs, 1)
78
+ correct += (predicted == labels).sum().item()
79
+ total += labels.size(0)
80
+
81
+ # Average loss and accuracy for the epoch
82
+ train_loss = running_loss / len(train_loader)
83
+ train_accuracy = 100.0 * correct / total
84
+
85
+ print(f"Epoch {epoch+1}/{num_epochs} - Training Loss: {train_loss:.4f}, Training Accuracy: {train_accuracy:.2f}%")
86
+
87
+ # Run validation after all epochs
88
+ print(f"Validating the model on unseen data after training...")
89
+ val_loss, val_accuracy, per_class_accuracy = evaluate_model(model, val_loader, criterion)
90
+ print(f"Validation Loss: {val_loss:.4f}, Validation Accuracy: {val_accuracy:.2f}%")
91
+ print("Per-class Accuracy:")
92
+ for class_name, acc in per_class_accuracy.items():
93
+ print(f"{class_name}: {acc:.2f}%")
94
+
95
+ # Save the model at the end of training
96
+ torch.save(model.state_dict(), "resnet50_imagenet.pth")
97
+ print("Model saved as resnet50_imagenet_last_epoch.pth")
dog.png ADDED
gd-dog.jpg ADDED
imagenet-classes.txt ADDED
@@ -0,0 +1,1000 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ tench, Tinca tinca
2
+ goldfish, Carassius auratus
3
+ great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias
4
+ tiger shark, Galeocerdo cuvieri
5
+ hammerhead, hammerhead shark
6
+ electric ray, crampfish, numbfish, torpedo
7
+ stingray
8
+ cock
9
+ hen
10
+ ostrich, Struthio camelus
11
+ brambling, Fringilla montifringilla
12
+ goldfinch, Carduelis carduelis
13
+ house finch, linnet, Carpodacus mexicanus
14
+ junco, snowbird
15
+ indigo bunting, indigo finch, indigo bird, Passerina cyanea
16
+ robin, American robin, Turdus migratorius
17
+ bulbul
18
+ jay
19
+ magpie
20
+ chickadee
21
+ water ouzel, dipper
22
+ kite
23
+ bald eagle, American eagle, Haliaeetus leucocephalus
24
+ vulture
25
+ great grey owl, great gray owl, Strix nebulosa
26
+ European fire salamander, Salamandra salamandra
27
+ common newt, Triturus vulgaris
28
+ eft
29
+ spotted salamander, Ambystoma maculatum
30
+ axolotl, mud puppy, Ambystoma mexicanum
31
+ bullfrog, Rana catesbeiana
32
+ tree frog, tree-frog
33
+ tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui
34
+ loggerhead, loggerhead turtle, Caretta caretta
35
+ leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea
36
+ mud turtle
37
+ terrapin
38
+ box turtle, box tortoise
39
+ banded gecko
40
+ common iguana, iguana, Iguana iguana
41
+ American chameleon, anole, Anolis carolinensis
42
+ whiptail, whiptail lizard
43
+ agama
44
+ frilled lizard, Chlamydosaurus kingi
45
+ alligator lizard
46
+ Gila monster, Heloderma suspectum
47
+ green lizard, Lacerta viridis
48
+ African chameleon, Chamaeleo chamaeleon
49
+ Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis
50
+ African crocodile, Nile crocodile, Crocodylus niloticus
51
+ American alligator, Alligator mississipiensis
52
+ triceratops
53
+ thunder snake, worm snake, Carphophis amoenus
54
+ ringneck snake, ring-necked snake, ring snake
55
+ hognose snake, puff adder, sand viper
56
+ green snake, grass snake
57
+ king snake, kingsnake
58
+ garter snake, grass snake
59
+ water snake
60
+ vine snake
61
+ night snake, Hypsiglena torquata
62
+ boa constrictor, Constrictor constrictor
63
+ rock python, rock snake, Python sebae
64
+ Indian cobra, Naja naja
65
+ green mamba
66
+ sea snake
67
+ horned viper, cerastes, sand viper, horned asp, Cerastes cornutus
68
+ diamondback, diamondback rattlesnake, Crotalus adamanteus
69
+ sidewinder, horned rattlesnake, Crotalus cerastes
70
+ trilobite
71
+ harvestman, daddy longlegs, Phalangium opilio
72
+ scorpion
73
+ black and gold garden spider, Argiope aurantia
74
+ barn spider, Araneus cavaticus
75
+ garden spider, Aranea diademata
76
+ black widow, Latrodectus mactans
77
+ tarantula
78
+ wolf spider, hunting spider
79
+ tick
80
+ centipede
81
+ black grouse
82
+ ptarmigan
83
+ ruffed grouse, partridge, Bonasa umbellus
84
+ prairie chicken, prairie grouse, prairie fowl
85
+ peacock
86
+ quail
87
+ partridge
88
+ African grey, African gray, Psittacus erithacus
89
+ macaw
90
+ sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita
91
+ lorikeet
92
+ coucal
93
+ bee eater
94
+ hornbill
95
+ hummingbird
96
+ jacamar
97
+ toucan
98
+ drake
99
+ red-breasted merganser, Mergus serrator
100
+ goose
101
+ black swan, Cygnus atratus
102
+ tusker
103
+ echidna, spiny anteater, anteater
104
+ platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus
105
+ wallaby, brush kangaroo
106
+ koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus
107
+ wombat
108
+ jellyfish
109
+ sea anemone, anemone
110
+ brain coral
111
+ flatworm, platyhelminth
112
+ nematode, nematode worm, roundworm
113
+ conch
114
+ snail
115
+ slug
116
+ sea slug, nudibranch
117
+ chiton, coat-of-mail shell, sea cradle, polyplacophore
118
+ chambered nautilus, pearly nautilus, nautilus
119
+ Dungeness crab, Cancer magister
120
+ rock crab, Cancer irroratus
121
+ fiddler crab
122
+ king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica
123
+ American lobster, Northern lobster, Maine lobster, Homarus americanus
124
+ spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish
125
+ crayfish, crawfish, crawdad, crawdaddy
126
+ hermit crab
127
+ isopod
128
+ white stork, Ciconia ciconia
129
+ black stork, Ciconia nigra
130
+ spoonbill
131
+ flamingo
132
+ little blue heron, Egretta caerulea
133
+ American egret, great white heron, Egretta albus
134
+ bittern
135
+ crane
136
+ limpkin, Aramus pictus
137
+ European gallinule, Porphyrio porphyrio
138
+ American coot, marsh hen, mud hen, water hen, Fulica americana
139
+ bustard
140
+ ruddy turnstone, Arenaria interpres
141
+ red-backed sandpiper, dunlin, Erolia alpina
142
+ redshank, Tringa totanus
143
+ dowitcher
144
+ oystercatcher, oyster catcher
145
+ pelican
146
+ king penguin, Aptenodytes patagonica
147
+ albatross, mollymawk
148
+ grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus
149
+ killer whale, killer, orca, grampus, sea wolf, Orcinus orca
150
+ dugong, Dugong dugon
151
+ sea lion
152
+ Chihuahua
153
+ Japanese spaniel
154
+ Maltese dog, Maltese terrier, Maltese
155
+ Pekinese, Pekingese, Peke
156
+ Shih-Tzu
157
+ Blenheim spaniel
158
+ papillon
159
+ toy terrier
160
+ Rhodesian ridgeback
161
+ Afghan hound, Afghan
162
+ basset, basset hound
163
+ beagle
164
+ bloodhound, sleuthhound
165
+ bluetick
166
+ black-and-tan coonhound
167
+ Walker hound, Walker foxhound
168
+ English foxhound
169
+ redbone
170
+ borzoi, Russian wolfhound
171
+ Irish wolfhound
172
+ Italian greyhound
173
+ whippet
174
+ Ibizan hound, Ibizan Podenco
175
+ Norwegian elkhound, elkhound
176
+ otterhound, otter hound
177
+ Saluki, gazelle hound
178
+ Scottish deerhound, deerhound
179
+ Weimaraner
180
+ Staffordshire bullterrier, Staffordshire bull terrier
181
+ American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier
182
+ Bedlington terrier
183
+ Border terrier
184
+ Kerry blue terrier
185
+ Irish terrier
186
+ Norfolk terrier
187
+ Norwich terrier
188
+ Yorkshire terrier
189
+ wire-haired fox terrier
190
+ Lakeland terrier
191
+ Sealyham terrier, Sealyham
192
+ Airedale, Airedale terrier
193
+ cairn, cairn terrier
194
+ Australian terrier
195
+ Dandie Dinmont, Dandie Dinmont terrier
196
+ Boston bull, Boston terrier
197
+ miniature schnauzer
198
+ giant schnauzer
199
+ standard schnauzer
200
+ Scotch terrier, Scottish terrier, Scottie
201
+ Tibetan terrier, chrysanthemum dog
202
+ silky terrier, Sydney silky
203
+ soft-coated wheaten terrier
204
+ West Highland white terrier
205
+ Lhasa, Lhasa apso
206
+ flat-coated retriever
207
+ curly-coated retriever
208
+ golden retriever
209
+ Labrador retriever
210
+ Chesapeake Bay retriever
211
+ German short-haired pointer
212
+ vizsla, Hungarian pointer
213
+ English setter
214
+ Irish setter, red setter
215
+ Gordon setter
216
+ Brittany spaniel
217
+ clumber, clumber spaniel
218
+ English springer, English springer spaniel
219
+ Welsh springer spaniel
220
+ cocker spaniel, English cocker spaniel, cocker
221
+ Sussex spaniel
222
+ Irish water spaniel
223
+ kuvasz
224
+ schipperke
225
+ groenendael
226
+ malinois
227
+ briard
228
+ kelpie
229
+ komondor
230
+ Old English sheepdog, bobtail
231
+ Shetland sheepdog, Shetland sheep dog, Shetland
232
+ collie
233
+ Border collie
234
+ Bouvier des Flandres, Bouviers des Flandres
235
+ Rottweiler
236
+ German shepherd, German shepherd dog, German police dog, alsatian
237
+ Doberman, Doberman pinscher
238
+ miniature pinscher
239
+ Greater Swiss Mountain dog
240
+ Bernese mountain dog
241
+ Appenzeller
242
+ EntleBucher
243
+ boxer
244
+ bull mastiff
245
+ Tibetan mastiff
246
+ French bulldog
247
+ Great Dane
248
+ Saint Bernard, St Bernard
249
+ Eskimo dog, husky
250
+ malamute, malemute, Alaskan malamute
251
+ Siberian husky
252
+ dalmatian, coach dog, carriage dog
253
+ affenpinscher, monkey pinscher, monkey dog
254
+ basenji
255
+ pug, pug-dog
256
+ Leonberg
257
+ Newfoundland, Newfoundland dog
258
+ Great Pyrenees
259
+ Samoyed, Samoyede
260
+ Pomeranian
261
+ chow, chow chow
262
+ keeshond
263
+ Brabancon griffon
264
+ Pembroke, Pembroke Welsh corgi
265
+ Cardigan, Cardigan Welsh corgi
266
+ toy poodle
267
+ miniature poodle
268
+ standard poodle
269
+ Mexican hairless
270
+ timber wolf, grey wolf, gray wolf, Canis lupus
271
+ white wolf, Arctic wolf, Canis lupus tundrarum
272
+ red wolf, maned wolf, Canis rufus, Canis niger
273
+ coyote, prairie wolf, brush wolf, Canis latrans
274
+ dingo, warrigal, warragal, Canis dingo
275
+ dhole, Cuon alpinus
276
+ African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus
277
+ hyena, hyaena
278
+ red fox, Vulpes vulpes
279
+ kit fox, Vulpes macrotis
280
+ Arctic fox, white fox, Alopex lagopus
281
+ grey fox, gray fox, Urocyon cinereoargenteus
282
+ tabby, tabby cat
283
+ tiger cat
284
+ Persian cat
285
+ Siamese cat, Siamese
286
+ Egyptian cat
287
+ cougar, puma, catamount, mountain lion, painter, panther, Felis concolor
288
+ lynx, catamount
289
+ leopard, Panthera pardus
290
+ snow leopard, ounce, Panthera uncia
291
+ jaguar, panther, Panthera onca, Felis onca
292
+ lion, king of beasts, Panthera leo
293
+ tiger, Panthera tigris
294
+ cheetah, chetah, Acinonyx jubatus
295
+ brown bear, bruin, Ursus arctos
296
+ American black bear, black bear, Ursus americanus, Euarctos americanus
297
+ ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus
298
+ sloth bear, Melursus ursinus, Ursus ursinus
299
+ mongoose
300
+ meerkat, mierkat
301
+ tiger beetle
302
+ ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle
303
+ ground beetle, carabid beetle
304
+ long-horned beetle, longicorn, longicorn beetle
305
+ leaf beetle, chrysomelid
306
+ dung beetle
307
+ rhinoceros beetle
308
+ weevil
309
+ fly
310
+ bee
311
+ ant, emmet, pismire
312
+ grasshopper, hopper
313
+ cricket
314
+ walking stick, walkingstick, stick insect
315
+ cockroach, roach
316
+ mantis, mantid
317
+ cicada, cicala
318
+ leafhopper
319
+ lacewing, lacewing fly
320
+ dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk
321
+ damselfly
322
+ admiral
323
+ ringlet, ringlet butterfly
324
+ monarch, monarch butterfly, milkweed butterfly, Danaus plexippus
325
+ cabbage butterfly
326
+ sulphur butterfly, sulfur butterfly
327
+ lycaenid, lycaenid butterfly
328
+ starfish, sea star
329
+ sea urchin
330
+ sea cucumber, holothurian
331
+ wood rabbit, cottontail, cottontail rabbit
332
+ hare
333
+ Angora, Angora rabbit
334
+ hamster
335
+ porcupine, hedgehog
336
+ fox squirrel, eastern fox squirrel, Sciurus niger
337
+ marmot
338
+ beaver
339
+ guinea pig, Cavia cobaya
340
+ sorrel
341
+ zebra
342
+ hog, pig, grunter, squealer, Sus scrofa
343
+ wild boar, boar, Sus scrofa
344
+ warthog
345
+ hippopotamus, hippo, river horse, Hippopotamus amphibius
346
+ ox
347
+ water buffalo, water ox, Asiatic buffalo, Bubalus bubalis
348
+ bison
349
+ ram, tup
350
+ bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis
351
+ ibex, Capra ibex
352
+ hartebeest
353
+ impala, Aepyceros melampus
354
+ gazelle
355
+ Arabian camel, dromedary, Camelus dromedarius
356
+ llama
357
+ weasel
358
+ mink
359
+ polecat, fitch, foulmart, foumart, Mustela putorius
360
+ black-footed ferret, ferret, Mustela nigripes
361
+ otter
362
+ skunk, polecat, wood pussy
363
+ badger
364
+ armadillo
365
+ three-toed sloth, ai, Bradypus tridactylus
366
+ orangutan, orang, orangutang, Pongo pygmaeus
367
+ gorilla, Gorilla gorilla
368
+ chimpanzee, chimp, Pan troglodytes
369
+ gibbon, Hylobates lar
370
+ siamang, Hylobates syndactylus, Symphalangus syndactylus
371
+ guenon, guenon monkey
372
+ patas, hussar monkey, Erythrocebus patas
373
+ baboon
374
+ macaque
375
+ langur
376
+ colobus, colobus monkey
377
+ proboscis monkey, Nasalis larvatus
378
+ marmoset
379
+ capuchin, ringtail, Cebus capucinus
380
+ howler monkey, howler
381
+ titi, titi monkey
382
+ spider monkey, Ateles geoffroyi
383
+ squirrel monkey, Saimiri sciureus
384
+ Madagascar cat, ring-tailed lemur, Lemur catta
385
+ indri, indris, Indri indri, Indri brevicaudatus
386
+ Indian elephant, Elephas maximus
387
+ African elephant, Loxodonta africana
388
+ lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens
389
+ giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca
390
+ barracouta, snoek
391
+ eel
392
+ coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch
393
+ rock beauty, Holocanthus tricolor
394
+ anemone fish
395
+ sturgeon
396
+ gar, garfish, garpike, billfish, Lepisosteus osseus
397
+ lionfish
398
+ puffer, pufferfish, blowfish, globefish
399
+ abacus
400
+ abaya
401
+ academic gown, academic robe, judge's robe
402
+ accordion, piano accordion, squeeze box
403
+ acoustic guitar
404
+ aircraft carrier, carrier, flattop, attack aircraft carrier
405
+ airliner
406
+ airship, dirigible
407
+ altar
408
+ ambulance
409
+ amphibian, amphibious vehicle
410
+ analog clock
411
+ apiary, bee house
412
+ apron
413
+ ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin
414
+ assault rifle, assault gun
415
+ backpack, back pack, knapsack, packsack, rucksack, haversack
416
+ bakery, bakeshop, bakehouse
417
+ balance beam, beam
418
+ balloon
419
+ ballpoint, ballpoint pen, ballpen, Biro
420
+ Band Aid
421
+ banjo
422
+ bannister, banister, balustrade, balusters, handrail
423
+ barbell
424
+ barber chair
425
+ barbershop
426
+ barn
427
+ barometer
428
+ barrel, cask
429
+ barrow, garden cart, lawn cart, wheelbarrow
430
+ baseball
431
+ basketball
432
+ bassinet
433
+ bassoon
434
+ bathing cap, swimming cap
435
+ bath towel
436
+ bathtub, bathing tub, bath, tub
437
+ beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon
438
+ beacon, lighthouse, beacon light, pharos
439
+ beaker
440
+ bearskin, busby, shako
441
+ beer bottle
442
+ beer glass
443
+ bell cote, bell cot
444
+ bib
445
+ bicycle-built-for-two, tandem bicycle, tandem
446
+ bikini, two-piece
447
+ binder, ring-binder
448
+ binoculars, field glasses, opera glasses
449
+ birdhouse
450
+ boathouse
451
+ bobsled, bobsleigh, bob
452
+ bolo tie, bolo, bola tie, bola
453
+ bonnet, poke bonnet
454
+ bookcase
455
+ bookshop, bookstore, bookstall
456
+ bottlecap
457
+ bow
458
+ bow tie, bow-tie, bowtie
459
+ brass, memorial tablet, plaque
460
+ brassiere, bra, bandeau
461
+ breakwater, groin, groyne, mole, bulwark, seawall, jetty
462
+ breastplate, aegis, egis
463
+ broom
464
+ bucket, pail
465
+ buckle
466
+ bulletproof vest
467
+ bullet train, bullet
468
+ butcher shop, meat market
469
+ cab, hack, taxi, taxicab
470
+ caldron, cauldron
471
+ candle, taper, wax light
472
+ cannon
473
+ canoe
474
+ can opener, tin opener
475
+ cardigan
476
+ car mirror
477
+ carousel, carrousel, merry-go-round, roundabout, whirligig
478
+ carpenter's kit, tool kit
479
+ carton
480
+ car wheel
481
+ cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM
482
+ cassette
483
+ cassette player
484
+ castle
485
+ catamaran
486
+ CD player
487
+ cello, violoncello
488
+ cellular telephone, cellular phone, cellphone, cell, mobile phone
489
+ chain
490
+ chainlink fence
491
+ chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour
492
+ chain saw, chainsaw
493
+ chest
494
+ chiffonier, commode
495
+ chime, bell, gong
496
+ china cabinet, china closet
497
+ Christmas stocking
498
+ church, church building
499
+ cinema, movie theater, movie theatre, movie house, picture palace
500
+ cleaver, meat cleaver, chopper
501
+ cliff dwelling
502
+ cloak
503
+ clog, geta, patten, sabot
504
+ cocktail shaker
505
+ coffee mug
506
+ coffeepot
507
+ coil, spiral, volute, whorl, helix
508
+ combination lock
509
+ computer keyboard, keypad
510
+ confectionery, confectionary, candy store
511
+ container ship, containership, container vessel
512
+ convertible
513
+ corkscrew, bottle screw
514
+ cornet, horn, trumpet, trump
515
+ cowboy boot
516
+ cowboy hat, ten-gallon hat
517
+ cradle
518
+ crane
519
+ crash helmet
520
+ crate
521
+ crib, cot
522
+ Crock Pot
523
+ croquet ball
524
+ crutch
525
+ cuirass
526
+ dam, dike, dyke
527
+ desk
528
+ desktop computer
529
+ dial telephone, dial phone
530
+ diaper, nappy, napkin
531
+ digital clock
532
+ digital watch
533
+ dining table, board
534
+ dishrag, dishcloth
535
+ dishwasher, dish washer, dishwashing machine
536
+ disk brake, disc brake
537
+ dock, dockage, docking facility
538
+ dogsled, dog sled, dog sleigh
539
+ dome
540
+ doormat, welcome mat
541
+ drilling platform, offshore rig
542
+ drum, membranophone, tympan
543
+ drumstick
544
+ dumbbell
545
+ Dutch oven
546
+ electric fan, blower
547
+ electric guitar
548
+ electric locomotive
549
+ entertainment center
550
+ envelope
551
+ espresso maker
552
+ face powder
553
+ feather boa, boa
554
+ file, file cabinet, filing cabinet
555
+ fireboat
556
+ fire engine, fire truck
557
+ fire screen, fireguard
558
+ flagpole, flagstaff
559
+ flute, transverse flute
560
+ folding chair
561
+ football helmet
562
+ forklift
563
+ fountain
564
+ fountain pen
565
+ four-poster
566
+ freight car
567
+ French horn, horn
568
+ frying pan, frypan, skillet
569
+ fur coat
570
+ garbage truck, dustcart
571
+ gasmask, respirator, gas helmet
572
+ gas pump, gasoline pump, petrol pump, island dispenser
573
+ goblet
574
+ go-kart
575
+ golf ball
576
+ golfcart, golf cart
577
+ gondola
578
+ gong, tam-tam
579
+ gown
580
+ grand piano, grand
581
+ greenhouse, nursery, glasshouse
582
+ grille, radiator grille
583
+ grocery store, grocery, food market, market
584
+ guillotine
585
+ hair slide
586
+ hair spray
587
+ half track
588
+ hammer
589
+ hamper
590
+ hand blower, blow dryer, blow drier, hair dryer, hair drier
591
+ hand-held computer, hand-held microcomputer
592
+ handkerchief, hankie, hanky, hankey
593
+ hard disc, hard disk, fixed disk
594
+ harmonica, mouth organ, harp, mouth harp
595
+ harp
596
+ harvester, reaper
597
+ hatchet
598
+ holster
599
+ home theater, home theatre
600
+ honeycomb
601
+ hook, claw
602
+ hoopskirt, crinoline
603
+ horizontal bar, high bar
604
+ horse cart, horse-cart
605
+ hourglass
606
+ iPod
607
+ iron, smoothing iron
608
+ jack-o'-lantern
609
+ jean, blue jean, denim
610
+ jeep, landrover
611
+ jersey, T-shirt, tee shirt
612
+ jigsaw puzzle
613
+ jinrikisha, ricksha, rickshaw
614
+ joystick
615
+ kimono
616
+ knee pad
617
+ knot
618
+ lab coat, laboratory coat
619
+ ladle
620
+ lampshade, lamp shade
621
+ laptop, laptop computer
622
+ lawn mower, mower
623
+ lens cap, lens cover
624
+ letter opener, paper knife, paperknife
625
+ library
626
+ lifeboat
627
+ lighter, light, igniter, ignitor
628
+ limousine, limo
629
+ liner, ocean liner
630
+ lipstick, lip rouge
631
+ Loafer
632
+ lotion
633
+ loudspeaker, speaker, speaker unit, loudspeaker system, speaker system
634
+ loupe, jeweler's loupe
635
+ lumbermill, sawmill
636
+ magnetic compass
637
+ mailbag, postbag
638
+ mailbox, letter box
639
+ maillot
640
+ maillot, tank suit
641
+ manhole cover
642
+ maraca
643
+ marimba, xylophone
644
+ mask
645
+ matchstick
646
+ maypole
647
+ maze, labyrinth
648
+ measuring cup
649
+ medicine chest, medicine cabinet
650
+ megalith, megalithic structure
651
+ microphone, mike
652
+ microwave, microwave oven
653
+ military uniform
654
+ milk can
655
+ minibus
656
+ miniskirt, mini
657
+ minivan
658
+ missile
659
+ mitten
660
+ mixing bowl
661
+ mobile home, manufactured home
662
+ Model T
663
+ modem
664
+ monastery
665
+ monitor
666
+ moped
667
+ mortar
668
+ mortarboard
669
+ mosque
670
+ mosquito net
671
+ motor scooter, scooter
672
+ mountain bike, all-terrain bike, off-roader
673
+ mountain tent
674
+ mouse, computer mouse
675
+ mousetrap
676
+ moving van
677
+ muzzle
678
+ nail
679
+ neck brace
680
+ necklace
681
+ nipple
682
+ notebook, notebook computer
683
+ obelisk
684
+ oboe, hautboy, hautbois
685
+ ocarina, sweet potato
686
+ odometer, hodometer, mileometer, milometer
687
+ oil filter
688
+ organ, pipe organ
689
+ oscilloscope, scope, cathode-ray oscilloscope, CRO
690
+ overskirt
691
+ oxcart
692
+ oxygen mask
693
+ packet
694
+ paddle, boat paddle
695
+ paddlewheel, paddle wheel
696
+ padlock
697
+ paintbrush
698
+ pajama, pyjama, pj's, jammies
699
+ palace
700
+ panpipe, pandean pipe, syrinx
701
+ paper towel
702
+ parachute, chute
703
+ parallel bars, bars
704
+ park bench
705
+ parking meter
706
+ passenger car, coach, carriage
707
+ patio, terrace
708
+ pay-phone, pay-station
709
+ pedestal, plinth, footstall
710
+ pencil box, pencil case
711
+ pencil sharpener
712
+ perfume, essence
713
+ Petri dish
714
+ photocopier
715
+ pick, plectrum, plectron
716
+ pickelhaube
717
+ picket fence, paling
718
+ pickup, pickup truck
719
+ pier
720
+ piggy bank, penny bank
721
+ pill bottle
722
+ pillow
723
+ ping-pong ball
724
+ pinwheel
725
+ pirate, pirate ship
726
+ pitcher, ewer
727
+ plane, carpenter's plane, woodworking plane
728
+ planetarium
729
+ plastic bag
730
+ plate rack
731
+ plow, plough
732
+ plunger, plumber's helper
733
+ Polaroid camera, Polaroid Land camera
734
+ pole
735
+ police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria
736
+ poncho
737
+ pool table, billiard table, snooker table
738
+ pop bottle, soda bottle
739
+ pot, flowerpot
740
+ potter's wheel
741
+ power drill
742
+ prayer rug, prayer mat
743
+ printer
744
+ prison, prison house
745
+ projectile, missile
746
+ projector
747
+ puck, hockey puck
748
+ punching bag, punch bag, punching ball, punchball
749
+ purse
750
+ quill, quill pen
751
+ quilt, comforter, comfort, puff
752
+ racer, race car, racing car
753
+ racket, racquet
754
+ radiator
755
+ radio, wireless
756
+ radio telescope, radio reflector
757
+ rain barrel
758
+ recreational vehicle, RV, R.V.
759
+ reel
760
+ reflex camera
761
+ refrigerator, icebox
762
+ remote control, remote
763
+ restaurant, eating house, eating place, eatery
764
+ revolver, six-gun, six-shooter
765
+ rifle
766
+ rocking chair, rocker
767
+ rotisserie
768
+ rubber eraser, rubber, pencil eraser
769
+ rugby ball
770
+ rule, ruler
771
+ running shoe
772
+ safe
773
+ safety pin
774
+ saltshaker, salt shaker
775
+ sandal
776
+ sarong
777
+ sax, saxophone
778
+ scabbard
779
+ scale, weighing machine
780
+ school bus
781
+ schooner
782
+ scoreboard
783
+ screen, CRT screen
784
+ screw
785
+ screwdriver
786
+ seat belt, seatbelt
787
+ sewing machine
788
+ shield, buckler
789
+ shoe shop, shoe-shop, shoe store
790
+ shoji
791
+ shopping basket
792
+ shopping cart
793
+ shovel
794
+ shower cap
795
+ shower curtain
796
+ ski
797
+ ski mask
798
+ sleeping bag
799
+ slide rule, slipstick
800
+ sliding door
801
+ slot, one-armed bandit
802
+ snorkel
803
+ snowmobile
804
+ snowplow, snowplough
805
+ soap dispenser
806
+ soccer ball
807
+ sock
808
+ solar dish, solar collector, solar furnace
809
+ sombrero
810
+ soup bowl
811
+ space bar
812
+ space heater
813
+ space shuttle
814
+ spatula
815
+ speedboat
816
+ spider web, spider's web
817
+ spindle
818
+ sports car, sport car
819
+ spotlight, spot
820
+ stage
821
+ steam locomotive
822
+ steel arch bridge
823
+ steel drum
824
+ stethoscope
825
+ stole
826
+ stone wall
827
+ stopwatch, stop watch
828
+ stove
829
+ strainer
830
+ streetcar, tram, tramcar, trolley, trolley car
831
+ stretcher
832
+ studio couch, day bed
833
+ stupa, tope
834
+ submarine, pigboat, sub, U-boat
835
+ suit, suit of clothes
836
+ sundial
837
+ sunglass
838
+ sunglasses, dark glasses, shades
839
+ sunscreen, sunblock, sun blocker
840
+ suspension bridge
841
+ swab, swob, mop
842
+ sweatshirt
843
+ swimming trunks, bathing trunks
844
+ swing
845
+ switch, electric switch, electrical switch
846
+ syringe
847
+ table lamp
848
+ tank, army tank, armored combat vehicle, armoured combat vehicle
849
+ tape player
850
+ teapot
851
+ teddy, teddy bear
852
+ television, television system
853
+ tennis ball
854
+ thatch, thatched roof
855
+ theater curtain, theatre curtain
856
+ thimble
857
+ thresher, thrasher, threshing machine
858
+ throne
859
+ tile roof
860
+ toaster
861
+ tobacco shop, tobacconist shop, tobacconist
862
+ toilet seat
863
+ torch
864
+ totem pole
865
+ tow truck, tow car, wrecker
866
+ toyshop
867
+ tractor
868
+ trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi
869
+ tray
870
+ trench coat
871
+ tricycle, trike, velocipede
872
+ trimaran
873
+ tripod
874
+ triumphal arch
875
+ trolleybus, trolley coach, trackless trolley
876
+ trombone
877
+ tub, vat
878
+ turnstile
879
+ typewriter keyboard
880
+ umbrella
881
+ unicycle, monocycle
882
+ upright, upright piano
883
+ vacuum, vacuum cleaner
884
+ vase
885
+ vault
886
+ velvet
887
+ vending machine
888
+ vestment
889
+ viaduct
890
+ violin, fiddle
891
+ volleyball
892
+ waffle iron
893
+ wall clock
894
+ wallet, billfold, notecase, pocketbook
895
+ wardrobe, closet, press
896
+ warplane, military plane
897
+ washbasin, handbasin, washbowl, lavabo, wash-hand basin
898
+ washer, automatic washer, washing machine
899
+ water bottle
900
+ water jug
901
+ water tower
902
+ whiskey jug
903
+ whistle
904
+ wig
905
+ window screen
906
+ window shade
907
+ Windsor tie
908
+ wine bottle
909
+ wing
910
+ wok
911
+ wooden spoon
912
+ wool, woolen, woollen
913
+ worm fence, snake fence, snake-rail fence, Virginia fence
914
+ wreck
915
+ yawl
916
+ yurt
917
+ web site, website, internet site, site
918
+ comic book
919
+ crossword puzzle, crossword
920
+ street sign
921
+ traffic light, traffic signal, stoplight
922
+ book jacket, dust cover, dust jacket, dust wrapper
923
+ menu
924
+ plate
925
+ guacamole
926
+ consomme
927
+ hot pot, hotpot
928
+ trifle
929
+ ice cream, icecream
930
+ ice lolly, lolly, lollipop, popsicle
931
+ French loaf
932
+ bagel, beigel
933
+ pretzel
934
+ cheeseburger
935
+ hotdog, hot dog, red hot
936
+ mashed potato
937
+ head cabbage
938
+ broccoli
939
+ cauliflower
940
+ zucchini, courgette
941
+ spaghetti squash
942
+ acorn squash
943
+ butternut squash
944
+ cucumber, cuke
945
+ artichoke, globe artichoke
946
+ bell pepper
947
+ cardoon
948
+ mushroom
949
+ Granny Smith
950
+ strawberry
951
+ orange
952
+ lemon
953
+ fig
954
+ pineapple, ananas
955
+ banana
956
+ jackfruit, jak, jack
957
+ custard apple
958
+ pomegranate
959
+ hay
960
+ carbonara
961
+ chocolate sauce, chocolate syrup
962
+ dough
963
+ meat loaf, meatloaf
964
+ pizza, pizza pie
965
+ potpie
966
+ burrito
967
+ red wine
968
+ espresso
969
+ cup
970
+ eggnog
971
+ alp
972
+ bubble
973
+ cliff, drop, drop-off
974
+ coral reef
975
+ geyser
976
+ lakeside, lakeshore
977
+ promontory, headland, head, foreland
978
+ sandbar, sand bar
979
+ seashore, coast, seacoast, sea-coast
980
+ valley, vale
981
+ volcano
982
+ ballplayer, baseball player
983
+ groom, bridegroom
984
+ scuba diver
985
+ rapeseed
986
+ daisy
987
+ yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum
988
+ corn
989
+ acorn
990
+ hip, rose hip, rosehip
991
+ buckeye, horse chestnut, conker
992
+ coral fungus
993
+ agaric
994
+ gyromitra
995
+ stinkhorn, carrion fungus
996
+ earthstar
997
+ hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa
998
+ bolete
999
+ ear, spike, capitulum
1000
+ toilet tissue, toilet paper, bathroom tissue
inference.ipynb ADDED
@@ -0,0 +1,295 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "device=\"cuda:0\""
10
+ ]
11
+ },
12
+ {
13
+ "cell_type": "code",
14
+ "execution_count": 2,
15
+ "metadata": {},
16
+ "outputs": [],
17
+ "source": [
18
+ "import torch\n",
19
+ "import torch.nn as nn\n",
20
+ "import torch.nn.functional as F\n",
21
+ "\n",
22
+ "\n",
23
+ "class Bottleneck(nn.Module):\n",
24
+ " expansion = 4\n",
25
+ " def __init__(self, in_channels, out_channels, i_downsample=None, stride=1):\n",
26
+ " super(Bottleneck, self).__init__()\n",
27
+ " \n",
28
+ " self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0)\n",
29
+ " self.batch_norm1 = nn.BatchNorm2d(out_channels)\n",
30
+ " \n",
31
+ " self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=stride, padding=1)\n",
32
+ " self.batch_norm2 = nn.BatchNorm2d(out_channels)\n",
33
+ " \n",
34
+ " self.conv3 = nn.Conv2d(out_channels, out_channels*self.expansion, kernel_size=1, stride=1, padding=0)\n",
35
+ " self.batch_norm3 = nn.BatchNorm2d(out_channels*self.expansion)\n",
36
+ " \n",
37
+ " self.i_downsample = i_downsample\n",
38
+ " self.stride = stride\n",
39
+ " self.relu = nn.ReLU()\n",
40
+ " \n",
41
+ " def forward(self, x):\n",
42
+ " identity = x.clone()\n",
43
+ " x = self.relu(self.batch_norm1(self.conv1(x)))\n",
44
+ " \n",
45
+ " x = self.relu(self.batch_norm2(self.conv2(x)))\n",
46
+ " \n",
47
+ " x = self.conv3(x)\n",
48
+ " x = self.batch_norm3(x)\n",
49
+ " \n",
50
+ " #downsample if needed\n",
51
+ " if self.i_downsample is not None:\n",
52
+ " identity = self.i_downsample(identity)\n",
53
+ " #add identity\n",
54
+ " x+=identity\n",
55
+ " x=self.relu(x)\n",
56
+ " \n",
57
+ " return x\n",
58
+ "\n",
59
+ "class Block(nn.Module):\n",
60
+ " expansion = 1\n",
61
+ " def __init__(self, in_channels, out_channels, i_downsample=None, stride=1):\n",
62
+ " super(Block, self).__init__()\n",
63
+ " \n",
64
+ "\n",
65
+ " self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1, stride=stride, bias=False)\n",
66
+ " self.batch_norm1 = nn.BatchNorm2d(out_channels)\n",
67
+ " self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1, stride=stride, bias=False)\n",
68
+ " self.batch_norm2 = nn.BatchNorm2d(out_channels)\n",
69
+ "\n",
70
+ " self.i_downsample = i_downsample\n",
71
+ " self.stride = stride\n",
72
+ " self.relu = nn.ReLU()\n",
73
+ "\n",
74
+ " def forward(self, x):\n",
75
+ " identity = x.clone()\n",
76
+ "\n",
77
+ " x = self.relu(self.batch_norm2(self.conv1(x)))\n",
78
+ " x = self.batch_norm2(self.conv2(x))\n",
79
+ "\n",
80
+ " if self.i_downsample is not None:\n",
81
+ " identity = self.i_downsample(identity)\n",
82
+ " print(x.shape)\n",
83
+ " print(identity.shape)\n",
84
+ " x += identity\n",
85
+ " x = self.relu(x)\n",
86
+ " return x\n",
87
+ "\n",
88
+ "\n",
89
+ " \n",
90
+ " \n",
91
+ "class ResNet(nn.Module):\n",
92
+ " def __init__(self, ResBlock, layer_list, num_classes, num_channels=3):\n",
93
+ " super(ResNet, self).__init__()\n",
94
+ " self.in_channels = 64\n",
95
+ " \n",
96
+ " self.conv1 = nn.Conv2d(num_channels, 64, kernel_size=7, stride=2, padding=3, bias=False)\n",
97
+ " self.batch_norm1 = nn.BatchNorm2d(64)\n",
98
+ " self.relu = nn.ReLU()\n",
99
+ " self.max_pool = nn.MaxPool2d(kernel_size = 3, stride=2, padding=1)\n",
100
+ " \n",
101
+ " self.layer1 = self._make_layer(ResBlock, layer_list[0], planes=64)\n",
102
+ " self.layer2 = self._make_layer(ResBlock, layer_list[1], planes=128, stride=2)\n",
103
+ " self.layer3 = self._make_layer(ResBlock, layer_list[2], planes=256, stride=2)\n",
104
+ " self.layer4 = self._make_layer(ResBlock, layer_list[3], planes=512, stride=2)\n",
105
+ " \n",
106
+ " self.avgpool = nn.AdaptiveAvgPool2d((1,1))\n",
107
+ " self.fc = nn.Linear(512*ResBlock.expansion, num_classes)\n",
108
+ " \n",
109
+ " def forward(self, x):\n",
110
+ " x = self.relu(self.batch_norm1(self.conv1(x)))\n",
111
+ " x = self.max_pool(x)\n",
112
+ "\n",
113
+ " x = self.layer1(x)\n",
114
+ " x = self.layer2(x)\n",
115
+ " x = self.layer3(x)\n",
116
+ " x = self.layer4(x)\n",
117
+ " \n",
118
+ " x = self.avgpool(x)\n",
119
+ " x = x.reshape(x.shape[0], -1)\n",
120
+ " x = self.fc(x)\n",
121
+ " \n",
122
+ " return x\n",
123
+ " \n",
124
+ " def _make_layer(self, ResBlock, blocks, planes, stride=1):\n",
125
+ " ii_downsample = None\n",
126
+ " layers = []\n",
127
+ " \n",
128
+ " if stride != 1 or self.in_channels != planes*ResBlock.expansion:\n",
129
+ " ii_downsample = nn.Sequential(\n",
130
+ " nn.Conv2d(self.in_channels, planes*ResBlock.expansion, kernel_size=1, stride=stride),\n",
131
+ " nn.BatchNorm2d(planes*ResBlock.expansion)\n",
132
+ " )\n",
133
+ " \n",
134
+ " layers.append(ResBlock(self.in_channels, planes, i_downsample=ii_downsample, stride=stride))\n",
135
+ " self.in_channels = planes*ResBlock.expansion\n",
136
+ " \n",
137
+ " for i in range(blocks-1):\n",
138
+ " layers.append(ResBlock(self.in_channels, planes))\n",
139
+ " \n",
140
+ " return nn.Sequential(*layers)\n",
141
+ "\n",
142
+ " \n",
143
+ " \n",
144
+ "def ResNet50(num_classes, channels=3):\n",
145
+ " return ResNet(Bottleneck, [3,4,6,3], num_classes, channels)\n",
146
+ " \n",
147
+ "def ResNet101(num_classes, channels=3):\n",
148
+ " return ResNet(Bottleneck, [3,4,23,3], num_classes, channels)\n",
149
+ "\n",
150
+ "def ResNet152(num_classes, channels=3):\n",
151
+ " return ResNet(Bottleneck, [3,8,36,3], num_classes, channels)"
152
+ ]
153
+ },
154
+ {
155
+ "cell_type": "code",
156
+ "execution_count": 3,
157
+ "metadata": {},
158
+ "outputs": [],
159
+ "source": [
160
+ "model = ResNet50(num_classes=1000).to(\"cuda:0\")"
161
+ ]
162
+ },
163
+ {
164
+ "cell_type": "code",
165
+ "execution_count": 4,
166
+ "metadata": {},
167
+ "outputs": [
168
+ {
169
+ "name": "stderr",
170
+ "output_type": "stream",
171
+ "text": [
172
+ "/tmp/ipykernel_978058/872111556.py:6: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n",
173
+ " model.load_state_dict(torch.load('/home/jovyan/Tharun/Kaggle/resnet50_imagenet_bs64_ep120.pth')) # Path to your saved model\n"
174
+ ]
175
+ },
176
+ {
177
+ "name": "stdout",
178
+ "output_type": "stream",
179
+ "text": [
180
+ "Predicted class index: 339\n"
181
+ ]
182
+ }
183
+ ],
184
+ "source": [
185
+ "import torch\n",
186
+ "from torchvision import models, transforms\n",
187
+ "from PIL import Image\n",
188
+ "\n",
189
+ "# Load the saved model\n",
190
+ "model.load_state_dict(torch.load('/home/jovyan/Tharun/Kaggle/resnet50_imagenet_bs64_ep120.pth')) # Path to your saved model\n",
191
+ "model = model.to(\"cuda:0\") # Move model to the device (CPU or GPU)\n",
192
+ "model.eval() # Set the model to evaluation mode\n",
193
+ "\n",
194
+ "# Preprocess the input image\n",
195
+ "def preprocess_image(image_path):\n",
196
+ " # Define the transformations to apply to the image\n",
197
+ " transform = transforms.Compose([\n",
198
+ " transforms.Resize(256), # Resize image to 256px\n",
199
+ " transforms.CenterCrop(224), # Crop the center 224x224px\n",
200
+ " transforms.ToTensor(), # Convert image to a tensor\n",
201
+ " transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # Normalize\n",
202
+ " ])\n",
203
+ " \n",
204
+ " # Load the image\n",
205
+ " image = Image.open(image_path)\n",
206
+ " \n",
207
+ " # Ensure the image has 3 channels (RGB)\n",
208
+ " image = image.convert(\"RGB\") # Convert image to RGB if it's not\n",
209
+ " \n",
210
+ " # Apply transformations\n",
211
+ " image = transform(image)\n",
212
+ " \n",
213
+ " # Add batch dimension and move image to the appropriate device\n",
214
+ " image = image.unsqueeze(0).to(device)\n",
215
+ " \n",
216
+ " return image\n",
217
+ "\n",
218
+ "# Function to make predictions\n",
219
+ "def predict_image(image_path):\n",
220
+ " image = preprocess_image(image_path) # Preprocess the input image\n",
221
+ " \n",
222
+ " # Forward pass to get predictions\n",
223
+ " with torch.no_grad():\n",
224
+ " outputs = model(image)\n",
225
+ " \n",
226
+ " # Get the predicted class index\n",
227
+ " _, predicted_class = torch.max(outputs, 1)\n",
228
+ " \n",
229
+ " # Get the predicted class label (you should have a label-to-class mapping for ImageNet)\n",
230
+ " predicted_class = predicted_class.item()\n",
231
+ " \n",
232
+ " # Optionally, if you have the ImageNet class labels, you can map the predicted index to a class name\n",
233
+ " # Example: ImageNet class labels can be downloaded or are available in a text file\n",
234
+ " return predicted_class\n",
235
+ "\n",
236
+ "# Path to the image you want to predict\n",
237
+ "image_path = \"/home/jovyan/Tharun/Kaggle/gd-dog.jpg\" # Replace with your image path\n",
238
+ "\n",
239
+ "# Get the prediction\n",
240
+ "predicted_class = predict_image(image_path)\n",
241
+ "print(f\"Predicted class index: {predicted_class}\")\n"
242
+ ]
243
+ },
244
+ {
245
+ "cell_type": "code",
246
+ "execution_count": 5,
247
+ "metadata": {},
248
+ "outputs": [
249
+ {
250
+ "name": "stdout",
251
+ "output_type": "stream",
252
+ "text": [
253
+ "Predicted class: sorrel\n"
254
+ ]
255
+ }
256
+ ],
257
+ "source": [
258
+ "# Assuming you have a list of ImageNet class labels (for example, `imagenet_classes` list)\n",
259
+ "imagenet_classes = [line.strip() for line in open('/home/jovyan/Tharun/Kaggle/imagenet-classes.txt')] # Load class names from file\n",
260
+ "\n",
261
+ "# Get class name\n",
262
+ "predicted_class_name = imagenet_classes[predicted_class]\n",
263
+ "print(f\"Predicted class: {predicted_class_name}\")"
264
+ ]
265
+ },
266
+ {
267
+ "cell_type": "code",
268
+ "execution_count": null,
269
+ "metadata": {},
270
+ "outputs": [],
271
+ "source": []
272
+ }
273
+ ],
274
+ "metadata": {
275
+ "kernelspec": {
276
+ "display_name": "env",
277
+ "language": "python",
278
+ "name": "python3"
279
+ },
280
+ "language_info": {
281
+ "codemirror_mode": {
282
+ "name": "ipython",
283
+ "version": 3
284
+ },
285
+ "file_extension": ".py",
286
+ "mimetype": "text/x-python",
287
+ "name": "python",
288
+ "nbconvert_exporter": "python",
289
+ "pygments_lexer": "ipython3",
290
+ "version": "3.10.12"
291
+ }
292
+ },
293
+ "nbformat": 4,
294
+ "nbformat_minor": 2
295
+ }
mini.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import kagglehub
2
+
3
+ # Download latest version
4
+ path = kagglehub.dataset_download("ifigotin/imagenetmini-1000")
5
+
6
+ print("Path to dataset files:", path)
resnet-50-imagenet.ipynb ADDED
@@ -0,0 +1 @@
 
 
1
+ {"cells":[{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Number of CUDA devices: 1\n","Device 0: NVIDIA H100 PCIe\n"]}],"source":["import torch\n","\n","if torch.cuda.is_available():\n"," print(f\"Number of CUDA devices: {torch.cuda.device_count()}\")\n"," for i in range(torch.cuda.device_count()):\n"," print(f\"Device {i}: {torch.cuda.get_device_name(i)}\")\n","else:\n"," print(\"No CUDA devices available\")\n"]},{"cell_type":"code","execution_count":2,"metadata":{"execution":{"iopub.execute_input":"2024-12-22T02:50:01.688084Z","iopub.status.busy":"2024-12-22T02:50:01.687777Z","iopub.status.idle":"2024-12-22T02:50:50.139225Z","shell.execute_reply":"2024-12-22T02:50:50.138526Z","shell.execute_reply.started":"2024-12-22T02:50:01.688056Z"},"trusted":true},"outputs":[{"name":"stdout","output_type":"stream","text":["Loading the ImageNet dataset from /home/jovyan/.cache/kagglehub/datasets/ifigotin/imagenetmini-1000/versions/1/imagenet-mini/train\n","Loading the validation dataset from /home/jovyan/.cache/kagglehub/datasets/ifigotin/imagenetmini-1000/versions/1/imagenet-mini/val\n"]}],"source":["import torch\n","import torchvision\n","import torchvision.transforms as transforms\n","from tqdm import tqdm # For progress bar\n","import os\n","\n","# Set device\n","device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n","\n","# Set hyperparameters\n","num_epochs = 120\n","batch_size = 64\n","learning_rate = 3e-4\n","\n","# Initialize transformations for data augmentation\n","transform_train = transforms.Compose([\n"," transforms.Resize(256),\n"," transforms.RandomHorizontalFlip(),\n"," transforms.RandomVerticalFlip(),\n"," transforms.RandomRotation(degrees=45),\n"," transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5),\n"," transforms.CenterCrop(224),\n"," transforms.ToTensor(),\n"," transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n","])\n","\n","transform_val = transforms.Compose([\n"," transforms.Resize(256),\n"," transforms.CenterCrop(224),\n"," transforms.ToTensor(),\n"," transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n","])\n","\n","# Load the ImageNet Object Localization Challenge dataset\n","# train_dataset_path = '/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC/train'\n","# val_dataset_path = '/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC/val'\n","train_dataset_path = '/home/jovyan/.cache/kagglehub/datasets/ifigotin/imagenetmini-1000/versions/1/imagenet-mini/train'\n","val_dataset_path = '/home/jovyan/.cache/kagglehub/datasets/ifigotin/imagenetmini-1000/versions/1/imagenet-mini/val'\n","\n","print(f'Loading the ImageNet dataset from {train_dataset_path}')\n","train_dataset = torchvision.datasets.ImageFolder(\n"," root=train_dataset_path,\n"," transform=transform_train\n",")\n","\n","print(f'Loading the validation dataset from {val_dataset_path}')\n","val_dataset = torchvision.datasets.ImageFolder(\n"," root=val_dataset_path,\n"," transform=transform_val\n",")\n","\n","train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=os.cpu_count()-1)\n","val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=batch_size, shuffle=False, num_workers=os.cpu_count()-1)"]},{"cell_type":"code","execution_count":3,"metadata":{"execution":{"iopub.execute_input":"2024-12-22T02:50:50.140765Z","iopub.status.busy":"2024-12-22T02:50:50.140326Z","iopub.status.idle":"2024-12-22T02:50:50.156435Z","shell.execute_reply":"2024-12-22T02:50:50.155604Z","shell.execute_reply.started":"2024-12-22T02:50:50.140736Z"},"trusted":true},"outputs":[],"source":["import torch\n","import torch.nn as nn\n","import torch.nn.functional as F\n","\n","\n","class Bottleneck(nn.Module):\n"," expansion = 4\n"," def __init__(self, in_channels, out_channels, i_downsample=None, stride=1):\n"," super(Bottleneck, self).__init__()\n"," \n"," self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0)\n"," self.batch_norm1 = nn.BatchNorm2d(out_channels)\n"," \n"," self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=stride, padding=1)\n"," self.batch_norm2 = nn.BatchNorm2d(out_channels)\n"," \n"," self.conv3 = nn.Conv2d(out_channels, out_channels*self.expansion, kernel_size=1, stride=1, padding=0)\n"," self.batch_norm3 = nn.BatchNorm2d(out_channels*self.expansion)\n"," \n"," self.i_downsample = i_downsample\n"," self.stride = stride\n"," self.relu = nn.ReLU()\n"," \n"," def forward(self, x):\n"," identity = x.clone()\n"," x = self.relu(self.batch_norm1(self.conv1(x)))\n"," \n"," x = self.relu(self.batch_norm2(self.conv2(x)))\n"," \n"," x = self.conv3(x)\n"," x = self.batch_norm3(x)\n"," \n"," #downsample if needed\n"," if self.i_downsample is not None:\n"," identity = self.i_downsample(identity)\n"," #add identity\n"," x+=identity\n"," x=self.relu(x)\n"," \n"," return x\n","\n","class Block(nn.Module):\n"," expansion = 1\n"," def __init__(self, in_channels, out_channels, i_downsample=None, stride=1):\n"," super(Block, self).__init__()\n"," \n","\n"," self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1, stride=stride, bias=False)\n"," self.batch_norm1 = nn.BatchNorm2d(out_channels)\n"," self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1, stride=stride, bias=False)\n"," self.batch_norm2 = nn.BatchNorm2d(out_channels)\n","\n"," self.i_downsample = i_downsample\n"," self.stride = stride\n"," self.relu = nn.ReLU()\n","\n"," def forward(self, x):\n"," identity = x.clone()\n","\n"," x = self.relu(self.batch_norm2(self.conv1(x)))\n"," x = self.batch_norm2(self.conv2(x))\n","\n"," if self.i_downsample is not None:\n"," identity = self.i_downsample(identity)\n"," print(x.shape)\n"," print(identity.shape)\n"," x += identity\n"," x = self.relu(x)\n"," return x\n","\n","\n"," \n"," \n","class ResNet(nn.Module):\n"," def __init__(self, ResBlock, layer_list, num_classes, num_channels=3):\n"," super(ResNet, self).__init__()\n"," self.in_channels = 64\n"," \n"," self.conv1 = nn.Conv2d(num_channels, 64, kernel_size=7, stride=2, padding=3, bias=False)\n"," self.batch_norm1 = nn.BatchNorm2d(64)\n"," self.relu = nn.ReLU()\n"," self.max_pool = nn.MaxPool2d(kernel_size = 3, stride=2, padding=1)\n"," \n"," self.layer1 = self._make_layer(ResBlock, layer_list[0], planes=64)\n"," self.layer2 = self._make_layer(ResBlock, layer_list[1], planes=128, stride=2)\n"," self.layer3 = self._make_layer(ResBlock, layer_list[2], planes=256, stride=2)\n"," self.layer4 = self._make_layer(ResBlock, layer_list[3], planes=512, stride=2)\n"," \n"," self.avgpool = nn.AdaptiveAvgPool2d((1,1))\n"," self.fc = nn.Linear(512*ResBlock.expansion, num_classes)\n"," \n"," def forward(self, x):\n"," x = self.relu(self.batch_norm1(self.conv1(x)))\n"," x = self.max_pool(x)\n","\n"," x = self.layer1(x)\n"," x = self.layer2(x)\n"," x = self.layer3(x)\n"," x = self.layer4(x)\n"," \n"," x = self.avgpool(x)\n"," x = x.reshape(x.shape[0], -1)\n"," x = self.fc(x)\n"," \n"," return x\n"," \n"," def _make_layer(self, ResBlock, blocks, planes, stride=1):\n"," ii_downsample = None\n"," layers = []\n"," \n"," if stride != 1 or self.in_channels != planes*ResBlock.expansion:\n"," ii_downsample = nn.Sequential(\n"," nn.Conv2d(self.in_channels, planes*ResBlock.expansion, kernel_size=1, stride=stride),\n"," nn.BatchNorm2d(planes*ResBlock.expansion)\n"," )\n"," \n"," layers.append(ResBlock(self.in_channels, planes, i_downsample=ii_downsample, stride=stride))\n"," self.in_channels = planes*ResBlock.expansion\n"," \n"," for i in range(blocks-1):\n"," layers.append(ResBlock(self.in_channels, planes))\n"," \n"," return nn.Sequential(*layers)\n","\n"," \n"," \n","def ResNet50(num_classes, channels=3):\n"," return ResNet(Bottleneck, [3,4,6,3], num_classes, channels)\n"," \n","def ResNet101(num_classes, channels=3):\n"," return ResNet(Bottleneck, [3,4,23,3], num_classes, channels)\n","\n","def ResNet152(num_classes, channels=3):\n"," return ResNet(Bottleneck, [3,8,36,3], num_classes, channels)"]},{"cell_type":"code","execution_count":4,"metadata":{},"outputs":[],"source":["model = ResNet50(num_classes=1000).to(device)"]},{"cell_type":"code","execution_count":5,"metadata":{},"outputs":[{"name":"stderr","output_type":"stream","text":["/home/jovyan/env/lib/python3.10/site-packages/torch_lr_finder/lr_finder.py:5: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n"," from tqdm.autonotebook import tqdm\n"]},{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"15d815b5e96e4c64b45066bfb73e84bd","version_major":2,"version_minor":0},"text/plain":[" 0%| | 0/200 [00:00<?, ?it/s]"]},"metadata":{},"output_type":"display_data"},{"name":"stdout","output_type":"stream","text":["Stopping early, the loss has diverged\n","Learning rate search finished. See the graph with {finder_name}.plot()\n","LR suggestion: steepest gradient\n","Suggested LR: 8.11E-03\n"]},{"data":{"image/png":"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/PLLeuSRRxr8GrHP7h//+Ifat29fa9/BC556PJ7477FKvpFIpMGvDQCJFo7UJDPOxFYnZwBwfXXrJnXtKtW1rLzDET2nW7dGC8HhcOj73/++7r33Xn322WdKSkrSW2+9JUlKSkpSOByudfxpp52mDRs2qG3btvre975X6+Hz+ZSbm6v8/Hx98803h+w/OMn45JNP4r+HQiGtWLFCvXr1ir/Ol19+qS5duhxynVhiUd/YD9atWzd5PB59+umn8W0lJSVav379MT+3JUuWqHPnzpo+fboGDRqk7t27a8uWLbWO6dWrl5YuXXrE93yw3r17y+v1auvWrYe8544dOx4zppi6vHcAsJpgOPoPMreLZMZenE7pppvqd85NNzVaReClS5fqf//3f7V8+XJt3bpVb775pnbv3h1PKLp06aLPP/9c69at0549exQMBjVhwgS1bt1a48aN04cffqiCggItXLhQN910k7799ltJ0r333qsZM2bo8ccf1/r16/XFF19o9uzZevTRR2u9/qxZs/TWW2/p66+/1uTJk7Vv3z5dc801kqILhxYVFenyyy/Xp59+qk2bNundd9/V1VdfrXA43KDYD5aRkaGJEyfqtttu04IFC/Tll19q0qRJcjqdx1y3qHv37tq6datefvllbdq0SY8//ng8kYq5+eab9ec//1mzZ8/W+vXrdffdd+vLL7884jUzMjJ066236he/+IXmzp2rTZs2aeXKlXriiSc0d+7cY/zX3K9Lly4qKCjQqlWrtGfPHgUCgTqfCwCJErJINxMDgBsymNLvN6Z7d2Pc7qMP+nW7jTn55OjxjeSrr74yo0aNMm3atDFer9ecfPLJ5oknnojv37Vrlzn33HNNenq6kWQWLFhgjDFm+/bt5sorrzStW7c2Xq/XdOvWzfz0pz+t9bm8+OKLZsCAASYpKcm0atXKnHXWWebNN980xuwfAPzSSy+ZwYMHm6SkJNO7d2/zn//8p1Z869evN+PHjzdZWVkmJSXF9OzZ00yZMsVEIpEGx34wv99vfvzjH5vU1FSTl5dnHn30UTN48GBzxx13xI/p3Lmzeeyxxw4597bbbjM5OTkmPT3dXHbZZeaxxx4zPp+v1jH333+/ad26tUlPTzcTJ040v/zlL486mykSiZiZM2eaHj16GI/HY9q0aWNGjRplPvjgA2PM/gHA+/bti5/z2WefGUmmoKDAGBMdSHzxxRebrKwsI8nMnj37sO+dAcAArGTSnE9N59v/bl5auqXRr12fAcAOY+qw2qON+f1++Xw+lZSU1BroKUUHwBYUFKhr165KTk6u34ULC6MF8TZujD4/8GOMtRB07y69/75Uj+4Gq9q8ebO6du2qzz77zHKVasvLy9W+fXs98sgjmjRpUqLDaVLHdc8CQCO7avYyLVy3Ww9d0k//M6hxv+uO9v19MLqZGqpjR2nFCunRR6UuXWrv69o1umbT8uUtIpGxms8++0x//etf4106EyZMkCSNGzcuwZEBwIkl1s3kYTaTjWVkSFOmRMfEsGp2s3r44Ye1bt06JSUlaeDAgfrwww/VunXrRIcFACeUUM2MTFeCZzORzDQGpzO6cnYL1qVLF1mlR/LUU0/VihUrEh0GAJzw9rfMMJsJAADYUDBeZyax6QTJjGSZFgfgWLhXAVhJONbNRMtM4sQqslZUVCQ4EqBuYvfqgdWEASBR4t1MCW6ZOaHHzLhcLmVlZWnXrl2SpNTU1GMWXgMSwRijiooK7dq1S1lZWfVaZgIAmopVKgCf0MmMJOXl5UlSPKEBrCwrKyt+zwJAolllbaYTPplxOBxq166d2rZte9jy+YBVeDweWmQAWAqrZluMy+XiiwIAgHqI1ZlJdMvMCT0AGAAANFy8m4nZTAAAwI7i3UzUmQEAAHYUqpnNRAVgAABgS6GabqZEr81EMgMAABoklswketVskhkAAFBvxhjL1JkhmQEAAPUWa5WRGAAMAABsKLYuk8TUbAAAYEPBmoJ5EskMAACwoXCYbiYAAGBjsZYZh4Op2QAAwIZiY2Y8CW6VkUhmAABAA4QtUjBPIpkBAAANEKxZyiDRg38lkhkAANAAVqn+K5HMAACABoiNmaGbCQAA2FKoZjaTh2QGAADYUbCmZcZNNxMAALAjqywyKSU4mVm0aJHGjh2r/Px8ORwOzZs3r9b+srIy3XDDDerQoYNSUlLUu3dvPfXUU4kJFgAAxIWYzRRVXl6u/v37a9asWYfdP3XqVL3zzjv6y1/+orVr12rKlCm64YYb9PbbbzdzpAAA4EDBeMtM4jt53Il88TFjxmjMmDFH3L9kyRJNnDhRw4cPlyRde+21+tOf/qRly5bpggsuaKYoAQDAwcIRWmbqZNiwYXr77bf13XffyRijBQsWaP369TrvvPOOeE4gEJDf76/1AAAAjSs+APhEHzNzLE888YR69+6tDh06KCkpSaNHj9asWbN01llnHfGcGTNmyOfzxR8dO3ZsxogBADgxhJjNVDdPPPGEPvnkE7399ttasWKFHnnkEU2ePFnvv//+Ec+ZNm2aSkpK4o/CwsJmjBgAgBNDrM6MFVpmEjpm5mgqKyv1q1/9Sm+99ZbOP/98SVK/fv20atUqPfzwwxo5cuRhz/N6vfJ6vc0ZKgAAJxxaZuogGAwqGAzKedAoaZfLpUhNNggAABLDShWAE9oyU1ZWpo0bN8afFxQUaNWqVcrOzlanTp109tln67bbblNKSoo6d+6sDz74QM8//7weffTRBEYNAABiC01aYW2mhCYzy5cv14gRI+LPp06dKkmaOHGi5syZo5dfflnTpk3ThAkTVFRUpM6dO+v+++/Xz372s0SFDAAAtL+byQqrZic0mRk+fLiMMUfcn5eXp9mzZzdjRAAAoC6CVAAGAAB2FrZQNxPJDAAAqLfYmBmPBZYzSHwEAADAduhmAgAAthaOsJwBAACwsSBF8wAAgJ2F6GYCAAB2FqKbCQAA2Nn+hSYTn0okPgIAAGA7+ysA0zIDAABsaP/aTIlPJRIfAQAAsJ3YAGBaZgAAgC0FGQAMAADsLFwzZsZFnRkAAGBHsdlMHlpmAACAHVEBGAAA2BprMwEAAFtj1WwAAGBr+5czSHwqkfgIAACA7bA2EwAAsDVWzQYAALa2f22mxKcSiY8AAADYTqzOjItuJgAAYEexMTOszQQAAGwp1s3EbCYAAGBLdDMBAABbYwAwAACwNSoAAwAAW2NtJgAAYGvBCKtmAwAAG4tVAPbQMgMAAOwmEjGqaZhhNhMAALCfWME8iW4mAABgQ7EaMxIVgAEAgA0d2DJDNxMAALCdWME8SfKwnAEAALCb2Ewmp0Ny0jIDAADsJhSxziKTEskMAACop/iK2RYY/CuRzAAAgHoK1sxmssJSBhLJDAAAqKewhZYykEhmAABAPcVXzKZlBgAA2FFszIyHlhkAAGBHsdlMViiYJyU4mVm0aJHGjh2r/Px8ORwOzZs375Bj1q5dqwsuuEA+n09paWk6/fTTtXXr1uYPFgAASNpfZ4bZTJLKy8vVv39/zZo167D7N23apDPOOEM9e/bUwoUL9fnnn+vOO+9UcnJyM0cKAABiYi0zVqj+K0nuRL74mDFjNGbMmCPunz59un74wx/qd7/7XXzbSSeddNRrBgIBBQKB+HO/33/8gQIAgDi6meooEonoH//4h04++WSNGjVKbdu21ZAhQw7bFXWgGTNmyOfzxR8dO3ZsnoABADhBxLqZrLBitmThZGbXrl0qKyvTAw88oNGjR+u9997T+PHjddFFF+mDDz444nnTpk1TSUlJ/FFYWNiMUQMA0PIFw9aqM5PQbqajidRUFxw3bpx+8YtfSJIGDBigJUuW6KmnntLZZ5992PO8Xq+8Xm+zxQkAwIkmTDdT3bRu3Vput1u9e/eutb1Xr17MZgIAIIFCEbqZ6iQpKUmnn3661q1bV2v7+vXr1blz5wRFBQAA4t1MzGaSysrKtHHjxvjzgoICrVq1StnZ2erUqZNuu+02XXbZZTrrrLM0YsQIvfPOO/q///s/LVy4MHFBAwBwggtbbKHJhCYzy5cv14gRI+LPp06dKkmaOHGi5syZo/Hjx+upp57SjBkzdNNNN6lHjx564403dMYZZyQqZAAATnj7BwCTzGj48OEyxhz1mGuuuUbXXHNNM0UEAACOZX8FYGt0M1kjCgAAYBuxonlW6WYimQEAAPWyP5mxRhphjSgAAIBtUAEYAADYGmszAQAAWwvVzGbyMAAYAADYUdBidWZIZgAAQL2Ea1pmXIyZAQAAdhQbM+NhNhMAALCjYLxoHi0zAADAhsIUzQMAAHa2f20ma6QR1ogCAADYRojZTAAAwM5YmwkAANgaq2YDAABb218BmJYZAABgQ/vXZrJGGmGNKAAAgG3EBgDTMgMAAGwpPjWblhkAAGBH4Xg3Ey0zAADAhmKzmehmAgAAthTrZqJlBgAA2FKsm8lDnRkAAGBHQZYzAAAAdhaKLzRJMgMAAGwoHGFqNgAAsLFgfG0mWmYAAIANhWiZAQAAdhaiZQYAANhZrGXGQ8sMAACwo9hsJhctMwAAwI7iq2ZTZwYAANhNJGJU08skNxWAAQCA3cSq/0qszQQAAGwoVjBPYtVsAABgQ7EVsyXqzAAAABuK1ZiRWGgSAADYUKybyemQnCQzAADAboKxpQwsMpNJIpkBAAD1EF/KwCKtMhLJDAAAqIf9i0ySzAAAABuKLWXgoZsJAADYUbCmm8kqBfOkBCczixYt0tixY5Wfny+Hw6F58+Yd8dif/exncjgcmjlzZrPFBwAAaovNZqJlpkZ5ebn69++vWbNmHfW4t956S5988ony8/ObKTIAAHA4sUUm3Rap/itJ7kS++JgxYzRmzJijHvPdd9/pxhtv1Lvvvqvzzz//mNcMBAIKBALx536//7jjBAAAUbEKwHQz1VEkEtEVV1yh2267TX369KnTOTNmzJDP54s/Onbs2MRRAgBw4oh3M1lkKQPJ4snMgw8+KLfbrZtuuqnO50ybNk0lJSXxR2FhYRNGCADAiSU2AJhupjpYsWKFfv/732vlypVyOOr+gXm9Xnm93iaMDACAE1dsajZ1Zurgww8/1K5du9SpUye53W653W5t2bJFt9xyi7p06ZLo8AAAOCGFLLicgWVbZq644gqNHDmy1rZRo0bpiiuu0NVXX52gqAAAOLHFZzNZqGUmoclMWVmZNm7cGH9eUFCgVatWKTs7W506dVJOTk6t4z0ej/Ly8tSjR4/mDhUAAOiAbibGzEQtX75cI0aMiD+fOnWqJGnixImaM2dOgqICAABHsn9tJrqZJEnDhw+XMabOx2/evLnpggEAAMcUWzXbY6GWGeukVQAAwPKCkRZSNK+wsFDffvtt/PmyZcs0ZcoUPf30040WGAAAsJ5wvM6MddpDGhTJj3/8Yy1YsECStGPHDp177rlatmyZpk+frt/85jeNGiAAALCOULwCsM1bZtasWaPBgwdLkl599VX17dtXS5Ys0YsvvsjAXQAAWrD9azPZvGUmGAzGq+y+//77uuCCCyRJPXv21Pbt2xsvOgAAYCnhSAsZANynTx899dRT+vDDD/Xvf/9bo0ePliRt27btkNowAACg5QhasM5Mg5KZBx98UH/60580fPhwXX755erfv78k6e233453PwEAgJZnfwVg63QzNajOzPDhw7Vnzx75/X61atUqvv3aa69VampqowUHAACsZX/RPJu3zFRWVioQCMQTmS1btmjmzJlat26d2rZt26gBAgAA69i/nIF1WmYaFMm4ceP0/PPPS5KKi4s1ZMgQPfLII7rwwgv15JNPNmqAAADAOmIVgG3fMrNy5UqdeeaZkqTXX39dubm52rJli55//nk9/vjjjRogAACwjng3k90HAFdUVCgjI0OS9N577+miiy6S0+nUf/3Xf2nLli2NGiAAALCOWDeTx+7dTN/73vc0b948FRYW6t1339V5550nSdq1a5cy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03pduz7n1OXYYx1ztP2H2+f3+9WxY0cVFhYqMzOzTnEmQkM+++a+fkOvUdfzGus47pHEXb8l/g2RuEca8/ot8R5pyvvDGKPS0lLl5+fL6Tz6qJgW3zLjdDrVoUOHYx7ncrnq/R+iPufU5dhjHXO0/Ufbl5mZaek/Qg357Jv7+g29Rl3Pa6zjuEcSd/2W/DdE4h7hHknM35BjtcjEMAC4xuTJk5v0nLoce6xjjra/IfFbRVPH3hjXb+g16npeYx3HPZK46/M3JLG4R07se6TFdzOdyPx+v3w+n0pKSiz9LyokDvcIjoV7BEdjlfuDlpkWzOv16u6775bX6010KLAo7hEcC/cIjsYq9wctMwAAwNZomQEAALZGMgMAAGyNZAYAANgayQwAALA1khkAAGBrJDNQcXGxBg0apAEDBqhv37565plnEh0SLKawsFDDhw9X79691a9fP7322muJDgkWNH78eLVq1UqXXHJJokOBRfz9739Xjx491L17dz377LNN9jpMzYbC4bACgYBSU1NVXl6uvn37avny5crJyUl0aLCI7du3a+fOnRowYIB27NihgQMHav369UpLS0t0aLCQhQsXqrS0VHPnztXrr7+e6HCQYKFQSL1799aCBQvk8/k0cOBALVmypEm+W2iZgVwul1JTUyVJgUBAxpg6LbmOE0e7du00YMAASVJeXp5at26toqKixAYFyxk+fLgyMjISHQYsYtmyZerTp4/at2+v9PR0jRkzRu+9916TvBbJjA0sWrRIY8eOVX5+vhwOh+bNm3fIMbNmzVKXLl2UnJysIUOGaNmyZfV6jeLiYvXv318dOnTQbbfdptatWzdS9GgOzXGPxKxYsULhcFgdO3Y8zqjRnJrzHkHLcLz3zLZt29S+ffv48/bt2+u7775rklhJZmygvLxc/fv316xZsw67/5VXXtHUqVN19913a+XKlerfv79GjRqlXbt2xY+JjYc5+LFt2zZJUlZWllavXq2CggK99NJL2rlzZ7O8NzSO5rhHJKmoqEhXXnmlnn766SZ/T2hczXWPoOVojHum2RjYiiTz1ltv1do2ePBgM3ny5PjzcDhs8vPzzYwZMxr0Gj//+c/Na6+9djxhIoGa6h6pqqoyZ555pnn++ecbK1QkSFP+HVmwYIG5+OKLGyNMWEhD7pnFixebCy+8ML7/5ptvNi+++GKTxEfLjM1VV1drxYoVGjlyZHyb0+nUyJEj9fHHH9fpGjt37lRpaakkqaSkRIsWLVKPHj2aJF40v8a4R4wxuuqqq/SDH/xAV1xxRVOFigRpjHsEJ5a63DODBw/WmjVr9N1336msrEz/+te/NGrUqCaJx90kV0Wz2bNnj8LhsHJzc2ttz83N1ddff12na2zZskXXXnttfODvjTfeqFNOOaUpwkUCNMY9snjxYr3yyivq169fvN/8hRde4D5pIRrjHpGkkSNHavXq1SovL1eHDh302muvaejQoY0dLiygLveM2+3WI488ohEjRigSieiXv/xlk82SJZmBBg8erFWrViU6DFjYGWecoUgkkugwYHHvv/9+okOAxVxwwQW64IILmvx16GayudatW8vlch0yYHfnzp3Ky8tLUFSwEu4RHAv3COrLavcMyYzNJSUlaeDAgZo/f358WyQS0fz582nehSTuERwb9wjqy2r3DN1MNlBWVqaNGzfGnxcUFGjVqlXKzs5Wp06dNHXqVE2cOFGDBg3S4MGDNXPmTJWXl+vqq69OYNRoTtwjOBbuEdSXre6ZJpkjhUa1YMECI+mQx8SJE+PHPPHEE6ZTp04mKSnJDB482HzyySeJCxjNjnsEx8I9gvqy0z3D2kwAAMDWGDMDAABsjWQGAADYGskMAACwNZIZAABgayQzAADA1khmAACArZHMAAAAWyOZAQAAtkYyAwAAbI1kBoDldenSRTNnzkx0GAAsiuUMAEiSrrrqKhUXF2vevHmJDuUQu3fvVlpamlJTUxMdymFZ+bMDTgS0zABImGAwWKfj2rRpk5BEpq7xAUgskhkAdbJmzRqNGTNG6enpys3N1RVXXKE9e/bE97/zzjs644wzlJWVpZycHP33f/+3Nm3aFN+/efNmORwOvfLKKzr77LOVnJysF198UVdddZUuvPBCPfzww2rXrp1ycnI0efLkWonEwd1MDodDzz77rMaPH6/U1FR1795db7/9dq143377bXXv3l3JyckaMWKE5s6dK4fDoeLi4iO+R4fDoSeffFIXXHCB0tLSdP/99yscDmvSpEnq2rWrUlJS1KNHD/3+97+Pn3PPPfdo7ty5+tvf/iaHwyGHw6GFCxdKkgoLC3XppZcqKytL2dnZGjdunDZv3tyw/wAAjohkBsAxFRcX6wc/+IFOPfVULV++XO+884527typSy+9NH5MeXm5pk6dquXLl2v+/PlyOp0aP368IpFIrWvdcccduvnmm7V27VqNGjVKkrRgwQJt2rRJCxYs0Ny5czVnzhzNmTPnqDHde++9uvTSS/X555/rhz/8oSZMmKCioiJJUkFBgS655BJdeOGFWr16ta677jpNnz69Tu/1nnvu0fjx4/XFF1/ommuuUSQSUYcOHfTaa6/pq6++0l133aVf/epXevXVVyVJt956qy699FKNHj1a27dv1/bt2zVs2DAFg0GNGjVKGRkZ+vDDD7V48WKlp6dr9OjRqq6urutHD6AuDAAYYyZOnGjGjRt32H333XefOe+882ptKywsNJLMunXrDnvO7t27jSTzxRdfGGOMKSgoMJLMzJkzD3ndzp07m1AoFN/2P//zP+ayyy6LP+/cubN57LHH4s8lmV//+tfx52VlZUaS+de//mWMMeb22283ffv2rfU606dPN5LMvn37Dv8B1Fx3ypQpR9wfM3nyZHPxxRfXeg8Hf3YvvPCC6dGjh4lEIvFtgUDApKSkmHffffeYrwGg7miZAXBMq1ev1oIFC5Senh5/9OzZU5LiXUkbNmzQ5Zdfrm7duikzM1NdunSRJG3durXWtQYNGnTI9fv06SOXyxV/3q5dO+3ateuoMfXr1y/+e1pamjIzM+PnrFu3Tqeffnqt4wcPHlyn93q4+GbNmqWBAweqTZs2Sk9P19NPP33I+zrY6tWrtXHjRmVkZMQ/s+zsbFVVVdXqfgNw/NyJDgCA9ZWVlWns2LF68MEHD9nXrl07SdLYsWPVuXNnPfPMM8rPz1ckElHfvn0P6VJJS0s75Boej6fWc4fDcUj3VGOcUxcHx/fyyy/r1ltv1SOPPKKhQ4cqIyNDDz30kJYuXXrU65SVlWngwIF68cUXD9nXpk2b444TwH4kMwCO6bTTTtMbb7yhLl26yO0+9M/G3r17tW7dOj3zzDM688wzJUkfffRRc4cZ16NHD/3zn/+ste3TTz9t0LUWL16sYcOG6frrr49vO7hlJSkpSeFwuNa20047Ta+88oratm2rzMzMBr02gLqhmwlAXElJiVatWlXrUVhYqMmTJ6uoqEiXX365Pv30U23atEnvvvuurr76aoXDYbVq1Uo5OTl6+umntXHjRv3nP//R1KlTE/Y+rrvuOn399de6/fbbtX79er366qvxAcUOh6Ne1+revbuWL1+ud999V+vXr9edd955SGLUpUsXff7551q3bp327NmjYDCoCRMmqHXr1ho3bpw+/PBDFRQUaOHChbrpppv07bffNtZbBSCSGQAHWLhwoU499dRaj3vvvVf5+flavHixwuGwzjvvPJ1yyimaMmWKsrKy5HQ65XQ69fLLL2vFihXq27evfvGLX+ihhx5K2Pvo2rWrXn/9db355pvq16+fnnzyyfhsJq/XW69rXXfddbrooot02WWXaciQIdq7d2+tVhpJ+ulPf6oePXpo0KBBatOmjRYvXqzU1FQtWrRInTp10kUXXaRevXpp0qRJqqqqoqUGaGRUAAZwQrj//vv11FNPqbCwMNGhAGhkjJkB0CL98Y9/1Omnn66cnBwtXrxYDz30kG644YZEhwWgCZDMAGiRNmzYoN/+9rcqKipSp06ddMstt2jatGmJDgtAE6CbCQAA2BoDgAEAgK2RzAAAAFsjmQEAALZGMgMAAGyNZAYAANgayQwAALA1khkAAGBrJDMAAMDW/j/KaEQt6wgcxAAAAABJRU5ErkJggg==","text/plain":["<Figure size 640x480 with 1 Axes>"]},"metadata":{},"output_type":"display_data"}],"source":["from torch_lr_finder import LRFinder\n","optimizer = torch.optim.Adam(model.parameters(), lr=3e-4, weight_decay=1e-4)\n","criterion = nn.CrossEntropyLoss()\n","lr_finder = LRFinder(model, optimizer, criterion, device=\"cuda\")\n","lr_finder.range_test(train_loader, end_lr=10, num_iter=200, step_mode=\"exp\")\n","_ , best_lr = lr_finder.plot() # to inspect the loss-learning rate graph\n","lr_finder.reset()"]},{"cell_type":"code","execution_count":6,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Training the model on ImageNet\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 1/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.82it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 1/120 - Training Loss: 6.9605, Training Accuracy: 0.24%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 2/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.59it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 2/120 - Training Loss: 6.8293, Training Accuracy: 0.34%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 3/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.46it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 3/120 - Training Loss: 6.7652, Training Accuracy: 0.40%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 4/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.54it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 4/120 - Training Loss: 6.6984, Training Accuracy: 0.54%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 5/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.72it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 5/120 - Training Loss: 6.6378, Training Accuracy: 0.64%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 6/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.81it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 6/120 - Training Loss: 6.5298, Training Accuracy: 0.87%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 7/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.58it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 7/120 - Training Loss: 6.3680, Training Accuracy: 1.24%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 8/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.56it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 8/120 - Training Loss: 6.2427, Training Accuracy: 1.56%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 9/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.76it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 9/120 - Training Loss: 6.1240, Training Accuracy: 1.94%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 10/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.76it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 10/120 - Training Loss: 6.0081, Training Accuracy: 2.43%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 11/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.72it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 11/120 - Training Loss: 5.8858, Training Accuracy: 2.87%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 12/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.80it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 12/120 - Training Loss: 5.7630, Training Accuracy: 3.44%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 13/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.63it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 13/120 - Training Loss: 5.6355, Training Accuracy: 4.35%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 14/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.69it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 14/120 - Training Loss: 5.5218, Training Accuracy: 4.92%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 15/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.83it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 15/120 - Training Loss: 5.4045, Training Accuracy: 5.76%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 16/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.47it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 16/120 - Training Loss: 5.2993, Training Accuracy: 6.64%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 17/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.54it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 17/120 - Training Loss: 5.1903, Training Accuracy: 7.39%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 18/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.77it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 18/120 - Training Loss: 5.0770, Training Accuracy: 8.36%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 19/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:24<00:00, 6.45it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 19/120 - Training Loss: 4.9620, Training Accuracy: 9.24%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 20/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:27<00:00, 6.22it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 20/120 - Training Loss: 4.8556, Training Accuracy: 10.39%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 21/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:24<00:00, 6.39it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 21/120 - Training Loss: 4.7491, Training Accuracy: 11.45%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 22/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.63it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 22/120 - Training Loss: 4.6427, Training Accuracy: 12.27%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 23/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.79it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 23/120 - Training Loss: 4.5412, Training Accuracy: 13.50%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 24/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.79it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 24/120 - Training Loss: 4.4443, Training Accuracy: 14.14%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 25/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.57it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 25/120 - Training Loss: 4.3367, Training Accuracy: 15.75%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 26/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:24<00:00, 6.46it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 26/120 - Training Loss: 4.2294, Training Accuracy: 16.76%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 27/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.65it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 27/120 - Training Loss: 4.1470, Training Accuracy: 17.71%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 28/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.58it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 28/120 - Training Loss: 4.0461, Training Accuracy: 18.78%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 29/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.70it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 29/120 - Training Loss: 3.9508, Training Accuracy: 20.00%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 30/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.61it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 30/120 - Training Loss: 3.8641, Training Accuracy: 21.00%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 31/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.81it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 31/120 - Training Loss: 3.7645, Training Accuracy: 22.42%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 32/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:26<00:00, 6.25it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 32/120 - Training Loss: 3.6751, Training Accuracy: 23.74%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 33/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.75it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 33/120 - Training Loss: 3.5752, Training Accuracy: 24.70%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 34/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.57it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 34/120 - Training Loss: 3.4737, Training Accuracy: 26.52%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 35/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.63it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 35/120 - Training Loss: 3.3980, Training Accuracy: 27.30%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 36/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.73it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 36/120 - Training Loss: 3.2857, Training Accuracy: 28.90%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 37/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.55it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 37/120 - Training Loss: 3.2040, Training Accuracy: 30.42%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 38/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.79it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 38/120 - Training Loss: 3.1034, Training Accuracy: 31.92%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 39/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.47it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 39/120 - Training Loss: 3.0145, Training Accuracy: 33.11%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 40/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.79it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 40/120 - Training Loss: 2.9228, Training Accuracy: 34.47%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 41/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.58it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 41/120 - Training Loss: 2.8409, Training Accuracy: 35.72%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 42/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.67it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 42/120 - Training Loss: 2.7390, Training Accuracy: 37.39%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 43/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.82it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 43/120 - Training Loss: 2.6607, Training Accuracy: 39.06%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 44/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.68it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 44/120 - Training Loss: 2.5639, Training Accuracy: 40.69%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 45/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.72it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 45/120 - Training Loss: 2.4654, Training Accuracy: 42.27%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 46/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.74it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 46/120 - Training Loss: 2.3758, Training Accuracy: 44.00%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 47/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.68it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 47/120 - Training Loss: 2.2870, Training Accuracy: 45.50%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 48/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:24<00:00, 6.46it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 48/120 - Training Loss: 2.2153, Training Accuracy: 46.72%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 49/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.68it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 49/120 - Training Loss: 2.1197, Training Accuracy: 48.34%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 50/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.64it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 50/120 - Training Loss: 2.0399, Training Accuracy: 50.16%\n","Checkpoint saved at epoch 50 with accuracy 50.16% at checkpoints/epoch_050_bs64.pth\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 51/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.71it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 51/120 - Training Loss: 1.9467, Training Accuracy: 52.02%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 52/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.56it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 52/120 - Training Loss: 1.8707, Training Accuracy: 53.72%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 53/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.49it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 53/120 - Training Loss: 1.7942, Training Accuracy: 54.64%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 54/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.54it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 54/120 - Training Loss: 1.7012, Training Accuracy: 56.85%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 55/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.66it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 55/120 - Training Loss: 1.6348, Training Accuracy: 58.01%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 56/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.47it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 56/120 - Training Loss: 1.5495, Training Accuracy: 59.72%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 57/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.49it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 57/120 - Training Loss: 1.4835, Training Accuracy: 61.06%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 58/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.70it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 58/120 - Training Loss: 1.4047, Training Accuracy: 63.16%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 59/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.75it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 59/120 - Training Loss: 1.3414, Training Accuracy: 64.55%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 60/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:26<00:00, 6.27it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 60/120 - Training Loss: 1.2781, Training Accuracy: 66.10%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 61/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:26<00:00, 6.31it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 61/120 - Training Loss: 1.2124, Training Accuracy: 67.54%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 62/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.75it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 62/120 - Training Loss: 1.1647, Training Accuracy: 68.55%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 63/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.79it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 63/120 - Training Loss: 1.0914, Training Accuracy: 70.17%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 64/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:24<00:00, 6.43it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 64/120 - Training Loss: 1.0561, Training Accuracy: 71.38%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 65/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.72it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 65/120 - Training Loss: 0.9971, Training Accuracy: 72.66%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 66/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.52it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 66/120 - Training Loss: 0.9487, Training Accuracy: 73.94%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 67/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.78it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 67/120 - Training Loss: 0.8944, Training Accuracy: 75.18%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 68/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.60it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 68/120 - Training Loss: 0.8484, Training Accuracy: 76.50%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 69/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.77it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 69/120 - Training Loss: 0.8090, Training Accuracy: 77.20%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 70/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.54it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 70/120 - Training Loss: 0.7662, Training Accuracy: 78.25%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 71/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.66it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 71/120 - Training Loss: 0.7242, Training Accuracy: 79.15%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 72/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.61it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 72/120 - Training Loss: 0.6986, Training Accuracy: 80.34%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 73/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.58it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 73/120 - Training Loss: 0.6341, Training Accuracy: 81.79%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 74/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.70it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 74/120 - Training Loss: 0.6147, Training Accuracy: 82.39%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 75/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:24<00:00, 6.46it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 75/120 - Training Loss: 0.5838, Training Accuracy: 83.23%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 76/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.71it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 76/120 - Training Loss: 0.5637, Training Accuracy: 83.81%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 77/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:24<00:00, 6.46it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 77/120 - Training Loss: 0.5262, Training Accuracy: 84.75%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 78/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.71it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 78/120 - Training Loss: 0.4961, Training Accuracy: 85.69%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 79/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.76it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 79/120 - Training Loss: 0.4731, Training Accuracy: 86.31%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 80/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.69it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 80/120 - Training Loss: 0.4580, Training Accuracy: 86.50%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 81/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.67it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 81/120 - Training Loss: 0.4209, Training Accuracy: 87.87%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 82/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.52it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 82/120 - Training Loss: 0.4134, Training Accuracy: 87.86%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 83/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:25<00:00, 6.35it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 83/120 - Training Loss: 0.3862, Training Accuracy: 88.73%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 84/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.76it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 84/120 - Training Loss: 0.3804, Training Accuracy: 88.62%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 85/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:24<00:00, 6.46it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 85/120 - Training Loss: 0.3539, Training Accuracy: 89.62%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 86/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.71it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 86/120 - Training Loss: 0.3228, Training Accuracy: 90.66%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 87/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.59it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 87/120 - Training Loss: 0.3090, Training Accuracy: 90.95%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 88/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.62it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 88/120 - Training Loss: 0.3039, Training Accuracy: 90.93%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 89/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.72it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 89/120 - Training Loss: 0.2926, Training Accuracy: 91.36%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 90/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:25<00:00, 6.37it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 90/120 - Training Loss: 0.2714, Training Accuracy: 92.01%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 91/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.74it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 91/120 - Training Loss: 0.2554, Training Accuracy: 92.41%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 92/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.50it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 92/120 - Training Loss: 0.2532, Training Accuracy: 92.42%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 93/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:25<00:00, 6.36it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 93/120 - Training Loss: 0.2381, Training Accuracy: 93.09%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 94/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.71it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 94/120 - Training Loss: 0.2254, Training Accuracy: 93.48%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 95/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.58it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 95/120 - Training Loss: 0.2137, Training Accuracy: 93.89%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 96/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:24<00:00, 6.40it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 96/120 - Training Loss: 0.2034, Training Accuracy: 94.17%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 97/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.64it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 97/120 - Training Loss: 0.1883, Training Accuracy: 94.41%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 98/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.53it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 98/120 - Training Loss: 0.1871, Training Accuracy: 94.47%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 99/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:24<00:00, 6.46it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 99/120 - Training Loss: 0.1745, Training Accuracy: 94.81%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 100/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.72it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 100/120 - Training Loss: 0.1620, Training Accuracy: 95.20%\n","Checkpoint saved at epoch 100 with accuracy 95.20% at checkpoints/epoch_095_bs64.pth\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 101/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:27<00:00, 6.21it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 101/120 - Training Loss: 0.1602, Training Accuracy: 95.29%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 102/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:27<00:00, 6.18it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 102/120 - Training Loss: 0.1438, Training Accuracy: 95.83%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 103/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.69it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 103/120 - Training Loss: 0.1441, Training Accuracy: 95.70%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 104/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.74it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 104/120 - Training Loss: 0.1335, Training Accuracy: 96.16%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 105/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.73it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 105/120 - Training Loss: 0.1335, Training Accuracy: 96.07%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 106/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.51it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 106/120 - Training Loss: 0.1210, Training Accuracy: 96.53%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 107/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.55it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 107/120 - Training Loss: 0.1130, Training Accuracy: 96.80%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 108/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:24<00:00, 6.44it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 108/120 - Training Loss: 0.1127, Training Accuracy: 96.69%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 109/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.64it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 109/120 - Training Loss: 0.1010, Training Accuracy: 97.17%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 110/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.66it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 110/120 - Training Loss: 0.0990, Training Accuracy: 97.19%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 111/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.76it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 111/120 - Training Loss: 0.0912, Training Accuracy: 97.46%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 112/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:23<00:00, 6.49it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 112/120 - Training Loss: 0.0901, Training Accuracy: 97.46%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 113/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.70it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 113/120 - Training Loss: 0.0827, Training Accuracy: 97.73%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 114/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.58it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 114/120 - Training Loss: 0.0796, Training Accuracy: 97.82%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 115/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.74it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 115/120 - Training Loss: 0.0738, Training Accuracy: 98.07%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 116/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:19<00:00, 6.82it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 116/120 - Training Loss: 0.0699, Training Accuracy: 98.13%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 117/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:20<00:00, 6.73it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 117/120 - Training Loss: 0.0656, Training Accuracy: 98.20%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 118/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:25<00:00, 6.33it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 118/120 - Training Loss: 0.0648, Training Accuracy: 98.20%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 119/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:21<00:00, 6.70it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 119/120 - Training Loss: 0.0649, Training Accuracy: 98.26%\n"]},{"name":"stderr","output_type":"stream","text":["Epoch 120/120: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 543/543 [01:22<00:00, 6.57it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 120/120 - Training Loss: 0.0624, Training Accuracy: 98.22%\n","Validating the model on unseen data after training...\n"]},{"name":"stderr","output_type":"stream","text":["Validating: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 62/62 [00:12<00:00, 4.92it/s]"]},{"name":"stdout","output_type":"stream","text":["Validation Loss: 12.1100, Validation Accuracy: 13.36%\n","Per-class Accuracy:\n","n01440764: 0.00%\n","n01443537: 33.33%\n","n01484850: 20.00%\n","n01491361: 0.00%\n","n01494475: 20.00%\n","n01496331: 0.00%\n","n01498041: 33.33%\n","n01514668: 0.00%\n","n01514859: 0.00%\n","n01518878: 0.00%\n","n01530575: 25.00%\n","n01531178: 0.00%\n","n01532829: 0.00%\n","n01534433: 25.00%\n","n01537544: 0.00%\n","n01558993: 0.00%\n","n01560419: 66.67%\n","n01580077: 0.00%\n","n01582220: 50.00%\n","n01592084: 0.00%\n","n01601694: 0.00%\n","n01608432: 25.00%\n","n01614925: 33.33%\n","n01616318: 0.00%\n","n01622779: 50.00%\n","n01629819: 0.00%\n","n01630670: 0.00%\n","n01631663: 25.00%\n","n01632458: 0.00%\n","n01632777: 50.00%\n","n01641577: 33.33%\n","n01644373: 25.00%\n","n01644900: 0.00%\n","n01664065: 0.00%\n","n01665541: 33.33%\n","n01667114: 0.00%\n","n01667778: 0.00%\n","n01669191: 0.00%\n","n01675722: 0.00%\n","n01677366: 33.33%\n","n01682714: 0.00%\n","n01685808: 0.00%\n","n01687978: 0.00%\n","n01688243: 0.00%\n","n01689811: 0.00%\n","n01692333: 0.00%\n","n01693334: 0.00%\n","n01694178: 0.00%\n","n01695060: 0.00%\n","n01697457: 0.00%\n","n01698640: 0.00%\n","n01704323: 25.00%\n","n01728572: 0.00%\n","n01728920: 25.00%\n","n01729322: 0.00%\n","n01729977: 0.00%\n","n01734418: 0.00%\n","n01735189: 50.00%\n","n01737021: 0.00%\n","n01739381: 33.33%\n","n01740131: 0.00%\n","n01742172: 0.00%\n","n01744401: 0.00%\n","n01748264: 0.00%\n","n01749939: 25.00%\n","n01751748: 0.00%\n","n01753488: 33.33%\n","n01755581: 0.00%\n","n01756291: 0.00%\n","n01768244: 0.00%\n","n01770081: 50.00%\n","n01770393: 100.00%\n","n01773157: 60.00%\n","n01773549: 0.00%\n","n01773797: 25.00%\n","n01774384: 0.00%\n","n01774750: 0.00%\n","n01775062: 0.00%\n","n01776313: 9.09%\n","n01784675: 0.00%\n","n01795545: 0.00%\n","n01796340: 0.00%\n","n01797886: 0.00%\n","n01798484: 0.00%\n","n01806143: 0.00%\n","n01806567: 33.33%\n","n01807496: 0.00%\n","n01817953: 0.00%\n","n01818515: 33.33%\n","n01819313: 50.00%\n","n01820546: 50.00%\n","n01824575: 0.00%\n","n01828970: 25.00%\n","n01829413: 0.00%\n","n01833805: 50.00%\n","n01843065: 50.00%\n","n01843383: 0.00%\n","n01847000: 0.00%\n","n01855032: 25.00%\n","n01855672: 33.33%\n","n01860187: 25.00%\n","n01871265: 0.00%\n","n01872401: 100.00%\n","n01873310: 0.00%\n","n01877812: 0.00%\n","n01882714: 66.67%\n","n01883070: 0.00%\n","n01910747: 20.00%\n","n01914609: 0.00%\n","n01917289: 0.00%\n","n01924916: 0.00%\n","n01930112: 28.57%\n","n01943899: 0.00%\n","n01944390: 0.00%\n","n01945685: 0.00%\n","n01950731: 0.00%\n","n01955084: 0.00%\n","n01968897: 33.33%\n","n01978287: 0.00%\n","n01978455: 0.00%\n","n01980166: 0.00%\n","n01981276: 0.00%\n","n01983481: 0.00%\n","n01984695: 0.00%\n","n01985128: 0.00%\n","n01986214: 0.00%\n","n01990800: 0.00%\n","n02002556: 0.00%\n","n02002724: 40.00%\n","n02006656: 50.00%\n","n02007558: 0.00%\n","n02009229: 25.00%\n","n02009912: 0.00%\n","n02011460: 0.00%\n","n02012849: 0.00%\n","n02013706: 0.00%\n","n02017213: 0.00%\n","n02018207: 0.00%\n","n02018795: 33.33%\n","n02025239: 33.33%\n","n02027492: 0.00%\n","n02028035: 33.33%\n","n02033041: 0.00%\n","n02037110: 0.00%\n","n02051845: 0.00%\n","n02056570: 0.00%\n","n02058221: 0.00%\n","n02066245: 25.00%\n","n02071294: 0.00%\n","n02074367: 50.00%\n","n02077923: 33.33%\n","n02085620: 0.00%\n","n02085782: 80.00%\n","n02085936: 50.00%\n","n02086079: 50.00%\n","n02086240: 0.00%\n","n02086646: 66.67%\n","n02086910: 0.00%\n","n02087046: 20.00%\n","n02087394: 0.00%\n","n02088094: 25.00%\n","n02088238: 33.33%\n","n02088364: 0.00%\n","n02088466: 20.00%\n","n02088632: 0.00%\n","n02089078: 0.00%\n","n02089867: 0.00%\n","n02089973: 33.33%\n","n02090379: 0.00%\n","n02090622: 0.00%\n","n02090721: 0.00%\n","n02091032: 0.00%\n","n02091134: 33.33%\n","n02091244: 25.00%\n","n02091467: 33.33%\n","n02091635: 0.00%\n","n02091831: 0.00%\n","n02092002: 33.33%\n","n02092339: 0.00%\n","n02093256: 0.00%\n","n02093428: 0.00%\n","n02093647: 0.00%\n","n02093754: 0.00%\n","n02093859: 0.00%\n","n02093991: 25.00%\n","n02094114: 0.00%\n","n02094258: 0.00%\n","n02094433: 33.33%\n","n02095314: 33.33%\n","n02095570: 0.00%\n","n02095889: 50.00%\n","n02096051: 33.33%\n","n02096177: 0.00%\n","n02096294: 33.33%\n","n02096437: 42.86%\n","n02096585: 0.00%\n","n02097047: 0.00%\n","n02097130: 0.00%\n","n02097209: 25.00%\n","n02097298: 0.00%\n","n02097474: 33.33%\n","n02097658: 0.00%\n","n02098105: 50.00%\n","n02098286: 0.00%\n","n02098413: 40.00%\n","n02099267: 33.33%\n","n02099429: 25.00%\n","n02099601: 0.00%\n","n02099712: 0.00%\n","n02099849: 0.00%\n","n02100236: 50.00%\n","n02100583: 0.00%\n","n02100735: 0.00%\n","n02100877: 0.00%\n","n02101006: 0.00%\n","n02101388: 0.00%\n","n02101556: 0.00%\n","n02102040: 0.00%\n","n02102177: 33.33%\n","n02102318: 0.00%\n","n02102480: 0.00%\n","n02102973: 20.00%\n","n02104029: 0.00%\n","n02104365: 0.00%\n","n02105056: 0.00%\n","n02105162: 0.00%\n","n02105251: 0.00%\n","n02105412: 0.00%\n","n02105505: 50.00%\n","n02105641: 16.67%\n","n02105855: 0.00%\n","n02106030: 33.33%\n","n02106166: 33.33%\n","n02106382: 0.00%\n","n02106550: 33.33%\n","n02106662: 0.00%\n","n02107142: 0.00%\n","n02107312: 0.00%\n","n02107574: 0.00%\n","n02107683: 33.33%\n","n02107908: 33.33%\n","n02108000: 0.00%\n","n02108089: 0.00%\n","n02108422: 33.33%\n","n02108551: 33.33%\n","n02108915: 0.00%\n","n02109047: 0.00%\n","n02109525: 0.00%\n","n02109961: 25.00%\n","n02110063: 0.00%\n","n02110185: 25.00%\n","n02110341: 0.00%\n","n02110627: 40.00%\n","n02110806: 0.00%\n","n02110958: 0.00%\n","n02111129: 66.67%\n","n02111277: 33.33%\n","n02111500: 40.00%\n","n02111889: 0.00%\n","n02112018: 33.33%\n","n02112137: 0.00%\n","n02112350: 33.33%\n","n02112706: 25.00%\n","n02113023: 25.00%\n","n02113186: 0.00%\n","n02113624: 0.00%\n","n02113712: 0.00%\n","n02113799: 0.00%\n","n02113978: 33.33%\n","n02114367: 0.00%\n","n02114548: 50.00%\n","n02114712: 25.00%\n","n02114855: 33.33%\n","n02115641: 0.00%\n","n02115913: 0.00%\n","n02116738: 66.67%\n","n02117135: 16.67%\n","n02119022: 12.50%\n","n02119789: 0.00%\n","n02120079: 20.00%\n","n02120505: 33.33%\n","n02123045: 33.33%\n","n02123159: 0.00%\n","n02123394: 12.50%\n","n02123597: 0.00%\n","n02124075: 0.00%\n","n02125311: 0.00%\n","n02127052: 25.00%\n","n02128385: 40.00%\n","n02128757: 40.00%\n","n02128925: 40.00%\n","n02129165: 16.67%\n","n02129604: 12.50%\n","n02130308: 66.67%\n","n02132136: 0.00%\n","n02133161: 20.00%\n","n02134084: 14.29%\n","n02134418: 33.33%\n","n02137549: 0.00%\n","n02138441: 0.00%\n","n02165105: 0.00%\n","n02165456: 40.00%\n","n02167151: 25.00%\n","n02168699: 0.00%\n","n02169497: 25.00%\n","n02172182: 0.00%\n","n02174001: 0.00%\n","n02177972: 0.00%\n","n02190166: 0.00%\n","n02206856: 0.00%\n","n02219486: 16.67%\n","n02226429: 33.33%\n","n02229544: 66.67%\n","n02231487: 0.00%\n","n02233338: 0.00%\n","n02236044: 0.00%\n","n02256656: 0.00%\n","n02259212: 33.33%\n","n02264363: 25.00%\n","n02268443: 0.00%\n","n02268853: 25.00%\n","n02276258: 33.33%\n","n02277742: 75.00%\n","n02279972: 75.00%\n","n02280649: 33.33%\n","n02281406: 75.00%\n","n02281787: 20.00%\n","n02317335: 0.00%\n","n02319095: 0.00%\n","n02321529: 0.00%\n","n02325366: 50.00%\n","n02326432: 0.00%\n","n02328150: 25.00%\n","n02342885: 75.00%\n","n02346627: 33.33%\n","n02356798: 0.00%\n","n02361337: 0.00%\n","n02363005: 66.67%\n","n02364673: 0.00%\n","n02389026: 0.00%\n","n02391049: 33.33%\n","n02395406: 0.00%\n","n02396427: 0.00%\n","n02397096: 0.00%\n","n02398521: 0.00%\n","n02403003: 33.33%\n","n02408429: 0.00%\n","n02410509: 0.00%\n","n02412080: 0.00%\n","n02415577: 33.33%\n","n02417914: 0.00%\n","n02422106: 66.67%\n","n02422699: 0.00%\n","n02423022: 50.00%\n","n02437312: 0.00%\n","n02437616: 0.00%\n","n02441942: 0.00%\n","n02442845: 0.00%\n","n02443114: 0.00%\n","n02443484: 0.00%\n","n02444819: 0.00%\n","n02445715: 50.00%\n","n02447366: 55.56%\n","n02454379: 33.33%\n","n02457408: 50.00%\n","n02480495: 33.33%\n","n02480855: 0.00%\n","n02481823: 0.00%\n","n02483362: 0.00%\n","n02483708: 0.00%\n","n02484975: 0.00%\n","n02486261: 0.00%\n","n02486410: 0.00%\n","n02487347: 0.00%\n","n02488291: 0.00%\n","n02488702: 0.00%\n","n02489166: 33.33%\n","n02490219: 0.00%\n","n02492035: 25.00%\n","n02492660: 50.00%\n","n02493509: 0.00%\n","n02493793: 0.00%\n","n02494079: 0.00%\n","n02497673: 0.00%\n","n02500267: 50.00%\n","n02504013: 0.00%\n","n02504458: 60.00%\n","n02509815: 0.00%\n","n02510455: 66.67%\n","n02514041: 33.33%\n","n02526121: 25.00%\n","n02536864: 0.00%\n","n02606052: 50.00%\n","n02607072: 0.00%\n","n02640242: 0.00%\n","n02641379: 0.00%\n","n02643566: 0.00%\n","n02655020: 0.00%\n","n02666196: 0.00%\n","n02667093: 0.00%\n","n02669723: 0.00%\n","n02672831: 0.00%\n","n02676566: 0.00%\n","n02687172: 0.00%\n","n02690373: 40.00%\n","n02692877: 0.00%\n","n02699494: 0.00%\n","n02701002: 66.67%\n","n02704792: 0.00%\n","n02708093: 12.50%\n","n02727426: 0.00%\n","n02730930: 0.00%\n","n02747177: 0.00%\n","n02749479: 0.00%\n","n02769748: 0.00%\n","n02776631: 33.33%\n","n02777292: 0.00%\n","n02782093: 0.00%\n","n02783161: 0.00%\n","n02786058: 14.29%\n","n02787622: 0.00%\n","n02788148: 0.00%\n","n02790996: 16.67%\n","n02791124: 0.00%\n","n02791270: 0.00%\n","n02793495: 25.00%\n","n02794156: 25.00%\n","n02795169: 0.00%\n","n02797295: 0.00%\n","n02799071: 33.33%\n","n02802426: 25.00%\n","n02804414: 0.00%\n","n02804610: 0.00%\n","n02807133: 0.00%\n","n02808304: 0.00%\n","n02808440: 0.00%\n","n02814533: 0.00%\n","n02814860: 25.00%\n","n02815834: 0.00%\n","n02817516: 25.00%\n","n02823428: 25.00%\n","n02823750: 0.00%\n","n02825657: 0.00%\n","n02834397: 25.00%\n","n02835271: 0.00%\n","n02837789: 0.00%\n","n02840245: 12.50%\n","n02841315: 20.00%\n","n02843684: 0.00%\n","n02859443: 0.00%\n","n02860847: 0.00%\n","n02865351: 0.00%\n","n02869837: 0.00%\n","n02870880: 0.00%\n","n02871525: 0.00%\n","n02877765: 25.00%\n","n02879718: 66.67%\n","n02883205: 20.00%\n","n02892201: 50.00%\n","n02892767: 0.00%\n","n02894605: 0.00%\n","n02895154: 0.00%\n","n02906734: 0.00%\n","n02909870: 0.00%\n","n02910353: 25.00%\n","n02916936: 0.00%\n","n02917067: 66.67%\n","n02927161: 25.00%\n","n02930766: 33.33%\n","n02939185: 0.00%\n","n02948072: 25.00%\n","n02950826: 0.00%\n","n02951358: 0.00%\n","n02951585: 0.00%\n","n02963159: 50.00%\n","n02965783: 25.00%\n","n02966193: 0.00%\n","n02966687: 0.00%\n","n02971356: 33.33%\n","n02974003: 25.00%\n","n02977058: 25.00%\n","n02978881: 0.00%\n","n02979186: 16.67%\n","n02980441: 50.00%\n","n02981792: 0.00%\n","n02988304: 0.00%\n","n02992211: 0.00%\n","n02992529: 12.50%\n","n02999410: 0.00%\n","n03000134: 0.00%\n","n03000247: 0.00%\n","n03000684: 14.29%\n","n03014705: 0.00%\n","n03016953: 0.00%\n","n03017168: 0.00%\n","n03018349: 0.00%\n","n03026506: 0.00%\n","n03028079: 0.00%\n","n03032252: 0.00%\n","n03041632: 0.00%\n","n03042490: 0.00%\n","n03045698: 0.00%\n","n03047690: 0.00%\n","n03062245: 0.00%\n","n03063599: 0.00%\n","n03063689: 0.00%\n","n03065424: 0.00%\n","n03075370: 0.00%\n","n03085013: 0.00%\n","n03089624: 0.00%\n","n03095699: 0.00%\n","n03100240: 25.00%\n","n03109150: 27.27%\n","n03110669: 0.00%\n","n03124043: 0.00%\n","n03124170: 0.00%\n","n03125729: 0.00%\n","n03126707: 25.00%\n","n03127747: 20.00%\n","n03127925: 0.00%\n","n03131574: 33.33%\n","n03133878: 0.00%\n","n03134739: 0.00%\n","n03141823: 0.00%\n","n03146219: 0.00%\n","n03160309: 50.00%\n","n03179701: 0.00%\n","n03180011: 0.00%\n","n03187595: 0.00%\n","n03188531: 50.00%\n","n03196217: 16.67%\n","n03197337: 25.00%\n","n03201208: 50.00%\n","n03207743: 0.00%\n","n03207941: 0.00%\n","n03208938: 25.00%\n","n03216828: 25.00%\n","n03218198: 0.00%\n","n03220513: 0.00%\n","n03223299: 0.00%\n","n03240683: 20.00%\n","n03249569: 0.00%\n","n03250847: 25.00%\n","n03255030: 0.00%\n","n03259280: 0.00%\n","n03271574: 20.00%\n","n03272010: 0.00%\n","n03272562: 50.00%\n","n03290653: 44.44%\n","n03291819: 0.00%\n","n03297495: 28.57%\n","n03314780: 9.09%\n","n03325584: 0.00%\n","n03337140: 0.00%\n","n03344393: 50.00%\n","n03345487: 33.33%\n","n03347037: 0.00%\n","n03355925: 40.00%\n","n03372029: 0.00%\n","n03376595: 0.00%\n","n03379051: 0.00%\n","n03384352: 33.33%\n","n03388043: 0.00%\n","n03388183: 50.00%\n","n03388549: 0.00%\n","n03393912: 33.33%\n","n03394916: 33.33%\n","n03400231: 0.00%\n","n03404251: 0.00%\n","n03417042: 0.00%\n","n03424325: 0.00%\n","n03425413: 25.00%\n","n03443371: 0.00%\n","n03444034: 33.33%\n","n03445777: 25.00%\n","n03445924: 0.00%\n","n03447447: 0.00%\n","n03447721: 14.29%\n","n03450230: 0.00%\n","n03452741: 66.67%\n","n03457902: 50.00%\n","n03459775: 50.00%\n","n03461385: 0.00%\n","n03467068: 0.00%\n","n03476684: 0.00%\n","n03476991: 0.00%\n","n03478589: 0.00%\n","n03481172: 0.00%\n","n03482405: 0.00%\n","n03483316: 0.00%\n","n03485407: 0.00%\n","n03485794: 0.00%\n","n03492542: 0.00%\n","n03494278: 0.00%\n","n03495258: 0.00%\n","n03496892: 0.00%\n","n03498962: 0.00%\n","n03527444: 0.00%\n","n03529860: 0.00%\n","n03530642: 0.00%\n","n03532672: 0.00%\n","n03534580: 0.00%\n","n03535780: 0.00%\n","n03538406: 0.00%\n","n03544143: 0.00%\n","n03584254: 33.33%\n","n03584829: 30.00%\n","n03590841: 20.00%\n","n03594734: 0.00%\n","n03594945: 0.00%\n","n03595614: 20.00%\n","n03598930: 0.00%\n","n03599486: 33.33%\n","n03602883: 0.00%\n","n03617480: 0.00%\n","n03623198: 11.11%\n","n03627232: 25.00%\n","n03630383: 42.86%\n","n03633091: 0.00%\n","n03637318: 0.00%\n","n03642806: 0.00%\n","n03649909: 0.00%\n","n03657121: 33.33%\n","n03658185: 0.00%\n","n03661043: 0.00%\n","n03662601: 66.67%\n","n03666591: 0.00%\n","n03670208: 0.00%\n","n03673027: 50.00%\n","n03676483: 0.00%\n","n03680355: 33.33%\n","n03690938: 0.00%\n","n03691459: 33.33%\n","n03692522: 0.00%\n","n03697007: 0.00%\n","n03706229: 0.00%\n","n03709823: 0.00%\n","n03710193: 25.00%\n","n03710637: 25.00%\n","n03710721: 25.00%\n","n03717622: 0.00%\n","n03720891: 0.00%\n","n03721384: 0.00%\n","n03724870: 0.00%\n","n03729826: 25.00%\n","n03733131: 0.00%\n","n03733281: 0.00%\n","n03733805: 25.00%\n","n03742115: 0.00%\n","n03743016: 0.00%\n","n03759954: 0.00%\n","n03761084: 25.00%\n","n03763968: 0.00%\n","n03764736: 0.00%\n","n03769881: 0.00%\n","n03770439: 33.33%\n","n03770679: 25.00%\n","n03773504: 0.00%\n","n03775071: 33.33%\n","n03775546: 33.33%\n","n03776460: 25.00%\n","n03777568: 33.33%\n","n03777754: 25.00%\n","n03781244: 0.00%\n","n03782006: 0.00%\n","n03785016: 33.33%\n","n03786901: 0.00%\n","n03787032: 0.00%\n","n03788195: 0.00%\n","n03788365: 50.00%\n","n03791053: 33.33%\n","n03792782: 25.00%\n","n03792972: 33.33%\n","n03793489: 16.67%\n","n03794056: 0.00%\n","n03796401: 0.00%\n","n03803284: 0.00%\n","n03804744: 0.00%\n","n03814639: 0.00%\n","n03814906: 0.00%\n","n03825788: 12.50%\n","n03832673: 0.00%\n","n03837869: 0.00%\n","n03838899: 11.11%\n","n03840681: 0.00%\n","n03841143: 80.00%\n","n03843555: 0.00%\n","n03854065: 66.67%\n","n03857828: 66.67%\n","n03866082: 0.00%\n","n03868242: 0.00%\n","n03868863: 14.29%\n","n03871628: 0.00%\n","n03873416: 0.00%\n","n03874293: 0.00%\n","n03874599: 0.00%\n","n03876231: 0.00%\n","n03877472: 0.00%\n","n03877845: 33.33%\n","n03884397: 16.67%\n","n03887697: 11.11%\n","n03888257: 40.00%\n","n03888605: 14.29%\n","n03891251: 0.00%\n","n03891332: 0.00%\n","n03895866: 0.00%\n","n03899768: 0.00%\n","n03902125: 33.33%\n","n03903868: 0.00%\n","n03908618: 25.00%\n","n03908714: 0.00%\n","n03916031: 0.00%\n","n03920288: 20.00%\n","n03924679: 55.56%\n","n03929660: 0.00%\n","n03929855: 0.00%\n","n03930313: 33.33%\n","n03930630: 66.67%\n","n03933933: 0.00%\n","n03935335: 25.00%\n","n03937543: 0.00%\n","n03938244: 0.00%\n","n03942813: 33.33%\n","n03944341: 0.00%\n","n03947888: 0.00%\n","n03950228: 0.00%\n","n03954731: 40.00%\n","n03956157: 33.33%\n","n03958227: 0.00%\n","n03961711: 0.00%\n","n03967562: 0.00%\n","n03970156: 0.00%\n","n03976467: 25.00%\n","n03976657: 0.00%\n","n03977966: 100.00%\n","n03980874: 0.00%\n","n03982430: 0.00%\n","n03983396: 0.00%\n","n03991062: 0.00%\n","n03992509: 0.00%\n","n03995372: 25.00%\n","n03998194: 0.00%\n","n04004767: 25.00%\n","n04005630: 0.00%\n","n04008634: 0.00%\n","n04009552: 0.00%\n","n04019541: 50.00%\n","n04023962: 0.00%\n","n04026417: 25.00%\n","n04033901: 0.00%\n","n04033995: 0.00%\n","n04037443: 33.33%\n","n04039381: 0.00%\n","n04040759: 0.00%\n","n04041544: 0.00%\n","n04044716: 40.00%\n","n04049303: 66.67%\n","n04065272: 20.00%\n","n04067472: 0.00%\n","n04069434: 20.00%\n","n04070727: 25.00%\n","n04074963: 0.00%\n","n04081281: 0.00%\n","n04086273: 22.22%\n","n04090263: 0.00%\n","n04099969: 0.00%\n","n04111531: 0.00%\n","n04116512: 0.00%\n","n04118538: 66.67%\n","n04118776: 0.00%\n","n04120489: 0.00%\n","n04125021: 0.00%\n","n04127249: 0.00%\n","n04131690: 20.00%\n","n04133789: 0.00%\n","n04136333: 0.00%\n","n04141076: 25.00%\n","n04141327: 0.00%\n","n04141975: 0.00%\n","n04146614: 33.33%\n","n04147183: 16.67%\n","n04149813: 0.00%\n","n04152593: 20.00%\n","n04153751: 25.00%\n","n04154565: 0.00%\n","n04162706: 0.00%\n","n04179913: 0.00%\n","n04192698: 0.00%\n","n04200800: 0.00%\n","n04201297: 50.00%\n","n04204238: 0.00%\n","n04204347: 0.00%\n","n04208210: 0.00%\n","n04209133: 0.00%\n","n04209239: 0.00%\n","n04228054: 0.00%\n","n04229816: 33.33%\n","n04235860: 0.00%\n","n04238763: 25.00%\n","n04239074: 0.00%\n","n04243546: 0.00%\n","n04251144: 0.00%\n","n04252077: 0.00%\n","n04252225: 25.00%\n","n04254120: 0.00%\n","n04254680: 0.00%\n","n04254777: 0.00%\n","n04258138: 50.00%\n","n04259630: 0.00%\n","n04263257: 33.33%\n","n04264628: 66.67%\n","n04265275: 0.00%\n","n04266014: 25.00%\n","n04270147: 0.00%\n","n04273569: 25.00%\n","n04275548: 0.00%\n","n04277352: 0.00%\n","n04285008: 33.33%\n","n04286575: 0.00%\n","n04296562: 25.00%\n","n04310018: 33.33%\n","n04311004: 25.00%\n","n04311174: 0.00%\n","n04317175: 0.00%\n","n04325704: 0.00%\n","n04326547: 25.00%\n","n04328186: 25.00%\n","n04330267: 0.00%\n","n04332243: 0.00%\n","n04335435: 66.67%\n","n04336792: 0.00%\n","n04344873: 0.00%\n","n04346328: 0.00%\n","n04347754: 25.00%\n","n04350905: 25.00%\n","n04355338: 0.00%\n","n04355933: 0.00%\n","n04356056: 0.00%\n","n04357314: 20.00%\n","n04366367: 0.00%\n","n04367480: 16.67%\n","n04370456: 0.00%\n","n04371430: 0.00%\n","n04371774: 0.00%\n","n04372370: 20.00%\n","n04376876: 0.00%\n","n04380533: 25.00%\n","n04389033: 0.00%\n","n04392985: 0.00%\n","n04398044: 0.00%\n","n04399382: 66.67%\n","n04404412: 0.00%\n","n04409515: 0.00%\n","n04417672: 25.00%\n","n04418357: 0.00%\n","n04423845: 0.00%\n","n04428191: 25.00%\n","n04429376: 0.00%\n","n04435653: 0.00%\n","n04442312: 0.00%\n","n04443257: 33.33%\n","n04447861: 0.00%\n","n04456115: 25.00%\n","n04458633: 33.33%\n","n04461696: 0.00%\n","n04462240: 0.00%\n","n04465501: 0.00%\n","n04467665: 0.00%\n","n04476259: 0.00%\n","n04479046: 0.00%\n","n04482393: 0.00%\n","n04483307: 0.00%\n","n04485082: 0.00%\n","n04486054: 0.00%\n","n04487081: 0.00%\n","n04487394: 0.00%\n","n04493381: 25.00%\n","n04501370: 0.00%\n","n04505470: 25.00%\n","n04507155: 0.00%\n","n04509417: 0.00%\n","n04515003: 20.00%\n","n04517823: 25.00%\n","n04522168: 0.00%\n","n04523525: 33.33%\n","n04525038: 0.00%\n","n04525305: 50.00%\n","n04532106: 0.00%\n","n04532670: 66.67%\n","n04536866: 0.00%\n","n04540053: 0.00%\n","n04542943: 33.33%\n","n04548280: 0.00%\n","n04548362: 0.00%\n","n04550184: 20.00%\n","n04552348: 20.00%\n","n04553703: 16.67%\n","n04554684: 0.00%\n","n04557648: 0.00%\n","n04560804: 0.00%\n","n04562935: 50.00%\n","n04579145: 0.00%\n","n04579432: 23.08%\n","n04584207: 14.29%\n","n04589890: 33.33%\n","n04590129: 0.00%\n","n04591157: 0.00%\n","n04591713: 0.00%\n","n04592741: 20.00%\n","n04596742: 33.33%\n","n04597913: 0.00%\n","n04599235: 0.00%\n","n04604644: 0.00%\n","n04606251: 20.00%\n","n04612504: 0.00%\n","n04613696: 0.00%\n","n06359193: 33.33%\n","n06596364: 0.00%\n","n06785654: 50.00%\n","n06794110: 0.00%\n","n06874185: 0.00%\n","n07248320: 0.00%\n","n07565083: 40.00%\n","n07579787: 0.00%\n","n07583066: 0.00%\n","n07584110: 25.00%\n","n07590611: 0.00%\n","n07613480: 0.00%\n","n07614500: 0.00%\n","n07615774: 0.00%\n","n07684084: 0.00%\n","n07693725: 0.00%\n","n07695742: 33.33%\n","n07697313: 0.00%\n","n07697537: 0.00%\n","n07711569: 100.00%\n","n07714571: 0.00%\n","n07714990: 25.00%\n","n07715103: 20.00%\n","n07716358: 33.33%\n","n07716906: 0.00%\n","n07717410: 0.00%\n","n07717556: 0.00%\n","n07718472: 0.00%\n","n07718747: 0.00%\n","n07720875: 0.00%\n","n07730033: 33.33%\n","n07734744: 0.00%\n","n07742313: 28.57%\n","n07745940: 20.00%\n","n07747607: 50.00%\n","n07749582: 25.00%\n","n07753113: 0.00%\n","n07753275: 0.00%\n","n07753592: 33.33%\n","n07754684: 0.00%\n","n07760859: 0.00%\n","n07768694: 40.00%\n","n07802026: 33.33%\n","n07831146: 0.00%\n","n07836838: 0.00%\n","n07860988: 0.00%\n","n07871810: 0.00%\n","n07873807: 0.00%\n","n07875152: 0.00%\n","n07880968: 0.00%\n","n07892512: 0.00%\n","n07920052: 25.00%\n","n07930864: 50.00%\n","n07932039: 0.00%\n","n09193705: 0.00%\n","n09229709: 0.00%\n","n09246464: 25.00%\n","n09256479: 0.00%\n","n09288635: 75.00%\n","n09332890: 0.00%\n","n09399592: 0.00%\n","n09421951: 25.00%\n","n09428293: 0.00%\n","n09468604: 33.33%\n","n09472597: 0.00%\n","n09835506: 33.33%\n","n10148035: 0.00%\n","n10565667: 25.00%\n","n11879895: 20.00%\n","n11939491: 25.00%\n","n12057211: 75.00%\n","n12144580: 0.00%\n","n12267677: 0.00%\n","n12620546: 25.00%\n","n12768682: 0.00%\n","n12985857: 0.00%\n","n12998815: 50.00%\n","n13037406: 33.33%\n","n13040303: 25.00%\n","n13044778: 33.33%\n","n13052670: 33.33%\n","n13054560: 33.33%\n","n13133613: 50.00%\n","n15075141: 0.00%\n","Model saved as resnet50_imagenet_last_epoch.pth\n"]},{"name":"stderr","output_type":"stream","text":["\n"]}],"source":["from torch.optim.lr_scheduler import OneCycleLR\n","\n","# Define the loss function and optimizer\n","criterion = torch.nn.CrossEntropyLoss()\n","optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)\n","\n","scheduler = OneCycleLR(\n"," optimizer,\n"," max_lr = best_lr,\n"," steps_per_epoch=len(train_loader),\n"," epochs=num_epochs,\n"," pct_start=5/num_epochs,\n"," div_factor=100,\n"," three_phase=False,\n"," final_div_factor=100,\n"," anneal_strategy='linear'\n",")\n","\n","# Function to evaluate the model\n","def evaluate_model(model, val_loader, criterion):\n"," model.eval()\n"," val_loss = 0.0\n"," correct = 0\n"," total = 0\n"," class_correct = [0] * len(val_dataset.classes)\n"," class_total = [0] * len(val_dataset.classes)\n"," \n"," with torch.no_grad():\n"," for inputs, labels in tqdm(val_loader, desc=\"Validating\"):\n"," inputs, labels = inputs.to(device), labels.to(device)\n"," \n"," outputs = model(inputs)\n"," loss = criterion(outputs, labels)\n"," val_loss += loss.item()\n","\n"," _, predicted = torch.max(outputs, 1)\n"," correct += (predicted == labels).sum().item()\n"," total += labels.size(0)\n","\n"," for i in range(len(labels)):\n"," label = labels[i]\n"," class_correct[label] += (predicted[i] == label).item()\n"," class_total[label] += 1\n","\n"," val_loss /= len(val_loader)\n"," accuracy = 100.0 * correct / total\n"," per_class_accuracy = {\n"," val_dataset.classes[i]: 100.0 * class_correct[i] / class_total[i]\n"," for i in range(len(val_dataset.classes))\n"," if class_total[i] > 0\n"," }\n"," return val_loss, accuracy, per_class_accuracy\n","\n","import os\n","\n","# Directory to save checkpoints\n","checkpoint_dir = \"checkpoints\"\n","os.makedirs(checkpoint_dir, exist_ok=True)\n","\n","# Train the model with checkpoint saving every 50 epochs\n","print(f'Training the model on ImageNet')\n","for epoch in range(num_epochs):\n"," model.train()\n"," running_loss = 0.0\n"," correct = 0\n"," total = 0\n","\n"," for inputs, labels in tqdm(train_loader, desc=f\"Epoch {epoch+1}/{num_epochs}\"):\n"," inputs, labels = inputs.to(device), labels.to(device)\n","\n"," # Zero out the optimizer\n"," optimizer.zero_grad()\n","\n"," # Forward pass\n"," outputs = model(inputs)\n"," loss = criterion(outputs, labels)\n","\n"," # Backward pass\n"," loss.backward()\n"," optimizer.step()\n","\n"," scheduler.step()\n","\n"," running_loss += loss.item()\n","\n"," # Calculate accuracy during training\n"," _, predicted = torch.max(outputs, 1)\n"," correct += (predicted == labels).sum().item()\n"," total += labels.size(0)\n","\n"," # Average loss and accuracy for the epoch\n"," train_loss = running_loss / len(train_loader)\n"," train_accuracy = 100.0 * correct / total\n","\n"," print(f\"Epoch {epoch+1}/{num_epochs} - Training Loss: {train_loss:.4f}, Training Accuracy: {train_accuracy:.2f}%\")\n","\n"," # Save a checkpoint every 50 epochs\n"," if (epoch + 1) % 50 == 0:\n"," # Format accuracy to 3 digits (e.g., 99.9 -> 999, 0.12 -> 012)\n"," acc_str = f\"{int(train_accuracy):03d}\"\n"," checkpoint_path = os.path.join(checkpoint_dir, f\"epoch{epoch}_acc{acc_str}_bs{batch_size}.pth\")\n","\n"," checkpoint = {\n"," 'epoch': epoch + 1, # Current epoch number\n"," 'model_state_dict': model.state_dict(),\n"," 'optimizer_state_dict': optimizer.state_dict(),\n"," 'scheduler_state_dict': scheduler.state_dict(),\n"," 'loss': train_loss\n"," }\n","\n"," torch.save(checkpoint, checkpoint_path)\n"," print(f\"Checkpoint saved at epoch {epoch + 1} with accuracy {train_accuracy:.2f}% at {checkpoint_path}\")\n","\n","# Run validation after all epochs\n","print(f\"Validating the model on unseen data after training...\")\n","val_loss, val_accuracy, per_class_accuracy = evaluate_model(model, val_loader, criterion)\n","print(f\"Validation Loss: {val_loss:.4f}, Validation Accuracy: {val_accuracy:.2f}%\")\n","print(\"Per-class Accuracy:\")\n","for class_name, acc in per_class_accuracy.items():\n"," print(f\"{class_name}: {acc:.2f}%\")\n","\n","# Save the final model at the end of training\n","torch.save(model.state_dict(), f\"resnet50_imagenet_bs{batch_size}_ep{num_epochs}.pth\")\n","print(\"Model saved as resnet50_imagenet_last_epoch.pth\")"]}],"metadata":{"kaggle":{"accelerator":"none","dataSources":[{"databundleVersionId":4225553,"sourceId":6799,"sourceType":"competition"},{"datasetId":547506,"sourceId":998277,"sourceType":"datasetVersion"}],"dockerImageVersionId":30823,"isGpuEnabled":false,"isInternetEnabled":true,"language":"python","sourceType":"notebook"},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.12"}},"nbformat":4,"nbformat_minor":4}