DAI-utvecklareLaboration· ca 60 min· sandlåda på servern
Labb: träna en sifferklassificerare i PyTorch
Bygga nn.Module, DataLoader, träningsloop med CrossEntropyLoss och utvärdering på hållen data — och nå ≥ 92 % på 8×8-siffror.
Teori
Nollställ, forward, loss, backward, steg. CrossEntropyLoss tar logits. Validera på data modellen inte sett.
Deluppgifter
- modellen —
make_model()returnerar ett nn.Sequential 64 → 64 → 10 med ReLU. - ett träningssteg —
train_step(model, opt, loss_fn, X, y)gör ett steg och returnerar lossen som float. - träna och utvärdera —
fit(epochs, lr, seed)tränar på sklearn digits (train 80 %) och returnerar valideringsaccuracy.
Godkänt när: accuracy >= 0.92
Startkoden
körs i en isolerad sandlåda på servernimport torch
import torch.nn as nn
from sklearn.datasets import load_digits
def data(seed=0):
d = load_digits()
X = torch.tensor(d.data, dtype=torch.float32) / 16.0
y = torch.tensor(d.target)
g = torch.Generator().manual_seed(seed)
idx = torch.randperm(len(X), generator=g)
n = int(0.8 * len(X))
return X[idx[:n]], y[idx[:n]], X[idx[n:]], y[idx[n:]]
def make_model():
# TODO: nn.Sequential(nn.Linear(64, 64), nn.ReLU(), nn.Linear(64, 10))
...
def train_step(model, opt, loss_fn, X, y):
# TODO: zero_grad → forward → loss → backward → step; return loss.item()
...
def accuracy(model, X, y):
model.eval()
with torch.no_grad():
return float((model(X).argmax(1) == y).float().mean())
def fit(epochs=20, lr=1e-2, seed=0, batch=64):
torch.manual_seed(seed)
Xtr, ytr, Xva, yva = data(seed)
model = make_model()
opt = torch.optim.Adam(model.parameters(), lr=lr)
loss_fn = nn.CrossEntropyLoss()
# TODO: loop över epoker och batchar (torch.randperm för blandning), anropa train_step
...
return accuracy(model, Xva, yva)
Du skriver koden, tester du inte ser avgör om den håller. Skapa ett gratis konto för att köra labben.
Prova diagnosenSkapa konto gratisFörväntade resultat
Valideringsaccuracy ≥ 0,92 efter ~20 epoker med Adam lr 1e-2 (ofta 0,96+).
Vanliga fel
- Softmax före CrossEntropyLoss (dubbel softmax) → långsam träning.
- Utvärderar på träningsdata → falskt hög accuracy.
- Glömmer
model.eval()/torch.no_grad()vid utvärdering.