| import logging
|
| import torch
|
| import torch.nn as nn
|
| from torchvision import models
|
|
|
| logger = logging.getLogger(__name__)
|
|
|
|
|
| class CarClassifierResNet(nn.Module):
|
| def __init__(self, num_classes):
|
| super().__init__()
|
|
|
| logger.info("Initializing ResNet18 model...")
|
|
|
| self.model = models.resnet18(weights="DEFAULT")
|
|
|
|
|
| for param in self.model.parameters():
|
| param.requires_grad = False
|
|
|
|
|
| for param in self.model.layer3.parameters():
|
| param.requires_grad = True
|
|
|
| for param in self.model.layer4.parameters():
|
| param.requires_grad = True
|
|
|
|
|
| self.model.fc = nn.Sequential(
|
| nn.Dropout(0.5),
|
| nn.Linear(self.model.fc.in_features, 256),
|
| nn.ReLU(),
|
| nn.Dropout(0.3),
|
| nn.Linear(256, num_classes)
|
| )
|
|
|
| logger.info("ResNet18 model initialized successfully.")
|
|
|
| def forward(self, x):
|
| return self.model(x)
|
|
|
|
|
| if __name__ == "__main__":
|
| logging.basicConfig(
|
| level=logging.INFO,
|
| format="%(asctime)s - %(levelname)s - %(message)s"
|
| )
|
|
|
| model = CarClassifierResNet(num_classes=6)
|
|
|
| dummy_input = torch.randn(2, 3, 128, 128)
|
|
|
| output = model(dummy_input)
|
|
|
| print("Output shape:", output.shape)
|
|
|
| total_params = sum(p.numel() for p in model.parameters())
|
| trainable_params = sum(
|
| p.numel() for p in model.parameters()
|
| if p.requires_grad
|
| )
|
|
|
| print("Total params:", total_params)
|
| print("Trainable params:", trainable_params) |