Views
No views yet
⚠️ The inference widget is disabled because this is a custom head on a torchvision backbone (not atransformersmodel) — load it with the snippet below.
| File | What |
|---|---|
cat_dog_classifier.pt | trained weights (raw state_dict, ~90 MB) |
config.json | architecture & preprocessing metadata |
1import torch, torch.nn as nn
2from torchvision import models, transforms
3from huggingface_hub import hf_hub_download
4from PIL import Image
5
6model = models.resnet50()
7model.fc = nn.Sequential(nn.Dropout(0.4), nn.Linear(2048, 1))
8weights = hf_hub_download("mtkl6/cat-dog-classifier", "cat_dog_classifier.pt")
9model.load_state_dict(torch.load(weights, weights_only=True))
10model.eval()
11
12tf = transforms.Compose([
13 transforms.Resize((224, 224)), transforms.ToTensor(),
14 transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
15])
16x = tf(Image.open("pet.jpg").convert("RGB")).unsqueeze(0)
17p_dog = torch.sigmoid(model(x)).item()
18print("dog" if p_dog > 0.5 else "cat", f"({max(p_dog, 1 - p_dog):.1%})")sigmoid
and threshold at 0.5.| Backbone | ResNet50 (IMAGENET1K_V1), head Dropout(0.4) → Linear(2048, 1) |
| Stage 1 | frozen backbone, head only — lr 1e-3, 10 epochs → 86.3% val |
| Stage 2 | fine-tune layer4 — lr 1e-5, 10 epochs → 94.2% val, AUC 0.98 |
| Loss / optim | BCEWithLogitsLoss, Adam, ReduceLROnPlateau |
| Input | 224×224 RGB, ImageNet normalization |
| Dataset | Oxford-IIIT Pet (37 breeds → binary) |
1@software{cat_dog_classifier_2026,
2 author = {Moritz (mtkl6)},
3 title = {Cat vs Dog Classifier: a ResNet50 transfer-learning tutorial},
4 year = {2026},
5 url = {https://github.com/mtkl6/cat-dog-classifier}
6}