Hoppa till innehållet
AI-grafen
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

  1. modellen — make_model() returnerar ett nn.Sequential 64 → 64 → 10 med ReLU.
  2. ett träningssteg — train_step(model, opt, loss_fn, X, y) gör ett steg och returnerar lossen som float.
  3. 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å servern
import 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 gratis

Fö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.