profileShare

rasmusjy / countrysense

Read-only snapshot

No repository description.

main default branch 19 files Expires Sep 13, 2026, 9:06 AM
model.py 1,661 bytes
1 import timm
2 import torch
3 import torch.nn as nn
4
5
6 class CountryClassifier(nn.Module):
7 def __init__(self, num_classes, backbone="vit_base_patch16_clip_224.openai",
8 dropout=0.2, pretrained=True):
9 super().__init__()
10 self.backbone = timm.create_model(backbone, pretrained=pretrained, num_classes=0)
11 self.head = nn.Sequential(
12 nn.Dropout(dropout),
13 nn.Linear(self.backbone.num_features, num_classes),
14 )
15
16 def forward(self, x):
17 return self.head(self.backbone(x))
18
19 def freeze_backbone(self):
20 for p in self.backbone.parameters():
21 p.requires_grad = False
22
23 def set_finetune_mode(self, unfreeze_blocks):
24 self.freeze_backbone()
25 if hasattr(self.backbone, "blocks"):
26 for block in list(self.backbone.blocks)[-unfreeze_blocks:]:
27 for p in block.parameters():
28 p.requires_grad = True
29 if hasattr(self.backbone, "norm"):
30 for p in self.backbone.norm.parameters():
31 p.requires_grad = True
32 else:
33 # Mitte-ViT backbone'il puudub plokkide loend, avame kõik.
34 for p in self.backbone.parameters():
35 p.requires_grad = True
36
37
38 def load_checkpoint(path, device="cpu"):
39 ckpt = torch.load(path, map_location=device, weights_only=True)
40 model = CountryClassifier(
41 num_classes=len(ckpt["classes"]),
42 backbone=ckpt["backbone"],
43 dropout=ckpt.get("dropout", 0.0),
44 pretrained=False,
45 )
46 model.load_state_dict(ckpt["model"])
47 model.to(device).eval()
48 return model, ckpt["classes"]
49