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
- softmax + cross-entropy —
softmax(Z)radvis stabil;cross_entropy(P, y)medel −log p_y. - forward/backward —
forward(p, X)→ (z1, a1, logits);backward(p, X, y, cache)→ gradienter (gradientkontroll i testerna). - minibatch-träning —
train(X, y, hidden, lr, epochs, batch, seed)→ (params, loss_history). - 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å servernimport 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 gratisFö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.