Hoppa till innehållet
AI-grafen
DAI-utvecklareProjekt· ca 150 min· sandlåda på servern

Projekt 2: Bygg ett neuronnät från grunden

Ett komplett neuronnät i NumPy — softmax-utdata, cross-entropy, backprop, minibatchar, träning på 8×8-siffror — med ≥ 90 % accuracy på hållen data och en träningskurva som artefakt.

Teori

Klassificering: logits → softmax → cross-entropy. Gradienten m.a.p. logits är bekvämt (p − y_onehot)/n. Minibatchar ger billigare, brusigare steg. Kurvan (loss per epok) är ditt viktigaste diagnosverktyg.

Deluppgifter

  1. softmax + cross-entropy — softmax(Z) radvis stabil; cross_entropy(P, y) medel −log p_y.
  2. forward/backward — forward(p, X) → (z1, a1, logits); backward(p, X, y, cache) → gradienter (gradientkontroll i testerna).
  3. minibatch-träning — train(X, y, hidden, lr, epochs, batch, seed) → (params, loss_history).
  4. utvärdera + kurva — accuracy(p, X, y); plot_curve(hist, path) sparar en PNG till out/ (artefakt).

Godkänt när: accuracy >= 0.9

Startkoden

körs i en isolerad sandlåda på servern
import numpy as np


def init(d, h, k, seed=0):
    rng = np.random.default_rng(seed)
    return {"W1": rng.normal(0, np.sqrt(2 / d), (h, d)), "b1": np.zeros(h), "W2": rng.normal(0, np.sqrt(2 / h), (k, h)), "b2": np.zeros(k)}


def softmax(Z):
    # TODO
    ...


def cross_entropy(P, y):
    # TODO: medel av -log P[i, y[i]] (klipp till 1e-12)
    ...


def forward(p, X):
    # TODO: z1 = X @ W1.T + b1; a1 = relu; logits = a1 @ W2.T + b2
    ...


def backward(p, X, y, cache):
    # TODO: P = softmax(logits); dlogits = (P - onehot(y)) / n; sedan som i labben
    ...


def train(X, y, hidden=64, lr=0.1, epochs=30, batch=64, seed=0):
    p = init(X.shape[1], hidden, int(y.max()) + 1, seed)
    rng = np.random.default_rng(seed)
    hist = []
    # TODO: per epok: permutera, loopa batchar, uppdatera; hist.append(loss på hela X)
    ...
    return p, hist


def accuracy(p, X, y):
    # TODO
    ...


def plot_curve(hist, path="out/curve.png"):
    import os
    import matplotlib
    matplotlib.use("Agg")
    import matplotlib.pyplot as plt
    os.makedirs("out", exist_ok=True)
    plt.figure(figsize=(5, 3)); plt.plot(hist); plt.xlabel("epok"); plt.ylabel("loss"); plt.tight_layout(); plt.savefig(path); plt.close()
    return path

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

Gradientkontroll < 1e-5; accuracy ≥ 0,90 på hållen data efter ~30 epoker; en sjunkande träningskurva i out/curve.png.

Vanliga fel

  • Softmax utan max-subtraktion → overflow.
  • Cross-entropy med log(0) → −inf; klipp p till ≥ 1e-12.
  • Blandar inte datan mellan epoker.