1.4 Tanulási diagnózis és kísérleti napló

1.4.1 Cél és induló kérdés

Ez az egység diagnózis, nem új elméleti fejezet: a hallgató a saját programozói előismeretét méri fel kézi számpéldán és egy kis laboron. Az előfeltétel az 1.3. Adatfelosztás és a megfigyelési egység fogalomkészlete: train/validation/test, scene_id mint megfigyelési egység, csoportos split és adatszivárgás. A cél az, hogy a hallgató az első változatát rögzítse, és a hibák alapján célzott alapozó egységet válasszon a későbbi fejezetekből.

Induló kérdés. Adott a v=(3,4)⊤v=(3,4)^\top vektor. Mekkora az euklideszi hossza, és mi a mértékegysége, ha a komponensek pixelben adottak? Előzetes becslés nélkül írja le a válaszát; a diagnózisnak éppen ez a nyers első változat a tárgya.

1.4.2 Fogalmak, jelek és mértékegységek

Vektor. A dd-dimenziós valós vektor x=(x1,…,xd)⊤∈ℝdx=(x_1,\ldots,x_d)^\top\in\mathbb R^d; oszlopvektorként írjuk az absztrakt képletekben (JELOLESEK.md). Az euklideszi norma

∥x∥=∑i=1dxi2.\|x\|=\sqrt{\sum_{i=1}^{d}x_i^2}.

A norma csak akkor fizikailag értelmes, ha a komponenseknek közös mértékegysége van: ha minden [xi]=u[x_i]=u, akkor [∥x∥]=u[\|x\|]=u. A GlyphLab intenzitásvektorainál a komponensek dimenzió nélküli [0,1][0,1] értékek, tehát a norma is dimenzió nélküli.

Függvény. Az f:D→Rf:D\to R hozzárendelés egy D⊆ℝD\subseteq\mathbb R definíciós tartomány minden uu eleméhez egy f(u)∈Rf(u)\in R értéket rendel. A bemenet egységét [u][u], a kimenetét [f][f] jelöli; a kettő általában különbözik. Az f(u)=2u−1f(u)=2u-1 affin kifejezésnél, ha [u]=mm[u]=\mathrm{mm} és az eredmény pixelben értendő, akkor az eredmény egysége px\mathrm{px}, a konstans −1-1 egysége is px\mathrm{px}, a 22 együttható egysége pedig px/mm\mathrm{px}/\mathrm{mm}.

Átlag. Az x=(x1,…,xN)x=(x_1,\ldots,x_N) valós minta átlaga

x‾=1N∑i=1Nxi,N≥1.\bar{x}=\frac{1}{N}\sum_{i=1}^{N}x_i,\qquad N\ge1.

A reduction explicit: az összegzés mind az NN elemet fedi, az osztás NN-nel történik. Az üres minta (N=0N=0) átlaga nem értelmes. A mértékegység azonos a minta egységével: [x‾]=[xi][\bar{x}]=[x_i].

Deriváltintuíció. A differenciahányados

Dhf(t)=f(t+h)−f(t)h,h≠0,D_h f(t)=\frac{f(t+h)-f(t)}{h},\qquad h\ne0,

a tt és t+ht+h közötti szelő meredeksége. A derivált ennek határértéke h→0h\to0 mellett; a formális definíciót és a láncszabályt a 4.1. Függvény, határérték és derivált építi fel. Itt csak az intuíciót mérjük. A szimmetrikus változat

Shf(t)=f(t+h)−f(t−h)2h,h≠0,S_h f(t)=\frac{f(t+h)-f(t-h)}{2h},\qquad h\ne0,

gyakran jobb numerikus közelítés; ezt használjuk majd a gradiensellenőrzésben is. A mértékegység [Shf]=[f]/[t][S_h f]=[f]/[t].

Tensor. A tensor többdimenziós számrendezés; a könyv főútján a képbatch X∈ℝN×C×H×WX\in\mathbb R^{N\times C\times H\times W}, NCHW sorrendben: batch, csatorna, magasság, szélesség. A dimenziók darabszámok, ezért dimenzió nélküliek. Az elemszám a dimenziók szorzata. Például X∈ℝ2×1×24×24X\in\mathbb R^{2\times1\times24\times24} elemszáma 2⋅1⋅24⋅24=11522\cdot1\cdot24\cdot24=1152; a dtype (például float32) a tárolás pontosságát rögzíti.

Seed. A pszeudovéletlen generátor egy ss seedből (magból) egy (u1,u2,…)(u_1,u_2,\ldots) sorozatot állít elő. A seed mértékegysége nincs, általában nemnegatív egész. Ugyanaz a seed csak ugyanazon algoritmus, verzió és kiértékelési sorrend mellett ígér azonos sorozatot; a seed önmagában nem hordozhatósági garancia (D02, D09).

Futásazonosító. A futásazonosító (ρ\rho, run id) egy konkrét kísérleti végrehajtást címkéző karakterlánc. Nem azonos a seeddel: a seed egy generátor bemenete, a futásazonosító a napló kulcsa, amely a seed, az adatverzió, a kódverzió és az időbélyeg mellé kerül. A kettő felcserélése megnehezíti annak megállapítását, hogy két eltérő eredmény közül melyik tartozik ugyanahhoz a beállításhoz.

1.4.3 Három feladat teljes specifikációja

A levezetési kötelezettség: minden jelre, tartományra és mértékegységre kiterjedő specifikációt adunk három feladatra.

F-A: vektornorma. Jelek: d=2d=2, x=(3,4)⊤∈ℝ2x=(3,4)^\top\in\mathbb R^2, ∥x∥∈ℝ≥0\|x\|\in\mathbb R_{\ge0}. Tartomány: a komponensek közös egysége uu; itt u=pxu=\mathrm{px}, tehát [∥x∥]=px[\|x\|]=\mathrm{px}. Számítás: ∥x∥=32+42=25=5px\|x\|=\sqrt{3^2+4^2}=\sqrt{25}=5\ \mathrm{px}.

F-B: átlag. Jelek: N=3N=3, x=(1.0,3.0,5.0)x=(1.0,3.0,5.0), x‾∈ℝ\bar{x}\in\mathbb R. Tartomány: az értékek pixelintenzitások, dimenzió nélküliek. Számítás: x‾=13(1.0+3.0+5.0)=3.0\bar{x}=\frac{1}{3}(1.0+3.0+5.0)=3.0, dimenzió nélkül.

F-C: differenciahányados. Jelek: f(t)=t2f(t)=t^2, t0=2t_0=2, h=0.01h=0.01, Shf(t0)∈ℝS_h f(t_0)\in\mathbb R. Tartomány: tt idő ([t]=s[t]=\mathrm{s}), ff hossz ([f]=m[f]=\mathrm{m}). Dimenziósan helyesen f(t)=at2f(t)=a\,t^2 alakban írjuk, ahol a=1m/s2a=1\ \mathrm{m}/\mathrm{s}^2; így [at2]=m[a\,t^2]=\mathrm{m}, és [Shf]=m/s[S_h f]=\mathrm{m}/\mathrm{s}. Az f(t)=t2f(t)=t^2 írásmód ennek rövidítése: tt a másodpercben, ff a méterben vett numerikus érték. Számítás: a lenti lemma adja Shf(t)=2tS_h f(t)=2t minden h≠0h\ne0-ra; t0=2t_0=2-nél az eredmény 4m/s4\ \mathrm{m}/\mathrm{s}.

Lemma (másodfokú eset). Ha f(t)=t2f(t)=t^2 és h≠0h\ne0, akkor Shf(t)=2tS_h f(t)=2t minden t∈ℝt\in\mathbb R esetén.

Bizonyítás. A definícióból:

Shf(t)=(t+h)2−(t−h)22h=(t2+2th+h2)−(t2−2th+h2)2h=4th2h=2t. S_h f(t) =\frac{(t+h)^2-(t-h)^2}{2h} =\frac{(t^2+2th+h^2)-(t^2-2th+h^2)}{2h} =\frac{4th}{2h} =2t.

Az első egyenlőség a definíció, a második a binomiális kifejtés, a harmadik az összevonás, a negyedik a h≠0h\ne0 feltétel melletti egyszerűsítés. ▫\square

Ellenpélda a tétel határára. A lemma nem áll harmadfokú függvényre: ha g(t)=t3g(t)=t^3, akkor Shg(t)=3t2+h2S_h g(t)=3t^2+h^2, ami h≠0h\ne0 esetén nem egyenlő a 3t23t^2 deriválttal. A h→0h\to0 határátmenet az, amit a későbbi kalkulusfejezet formalizál; a lemma tehát a másodfokú alak következménye, nem általános simasági állítás.

1.4.4 Kézi példa

Az F-A, F-B, F-C feladatokat kézzel ellenőrizzük. F-A: 5px5\ \mathrm{px}. F-B: 3.03.0. F-C: Shf(2)=2.012−1.9920.02=4.0401−3.96010.02=0.080.02=4.0m/sS_h f(2)=\frac{2.01^2-1.99^2}{0.02}=\frac{4.0401-3.9601}{0.02}=\frac{0.08}{0.02}=4.0\ \mathrm{m}/\mathrm{s}. Az alakellenőrzés: a norma és az átlag skalár; a differenciahányados egysége az elvárt m/s\mathrm{m}/\mathrm{s}.

A tensorfeladat: X∈ℝ2×1×24×24X\in\mathbb R^{2\times1\times24\times24} elemszáma 11521152, egész szám, dimenzió nélkül. A seed-feladat nem numerikus, hanem a labor naplójába mentett indoklás.

1.4.5 Labor: első változat és napló

A labor megoldja az öt rövid feladatot, elmenti az első változatot, és rögzíti a választott alapozó egységet. Munkakönyvtár: a kurzusprojekt gyökere; a napló a lab_n004/ könyvtárba kerül. A futás CPU-n, float64 numerikus ellenőrzéssel történik; a labor nem generál véletlent, a GlyphLab generáló seedje (2026102020261020) csak a napló szerződésrovatában szerepel.

#!/usr/bin/env python3
"""n004 diagnosztikai labor: elso valtozat mentese es naplo."""
import argparse
import hashlib
import json
import os
import sys
from datetime import datetime, timezone

EXPECTED = {
    "norm": {"value": 5.0, "tol": 1e-6},
    "function": {"value": 5.0, "tol": 1e-6},
    "mean": {"value": 3.0, "tol": 1e-6},
    "derivative": {"value": 4.0, "tol": 1e-5},
    "tensor_elements": {"value": 1152, "exact": True},
}

def main() -> int:
    ap = argparse.ArgumentParser()
    ap.add_argument("--answers", nargs=5, type=float, required=True,
                    help="sorrend: vektornorma, f(3), atlag, "
                         "szimmetrikus differenciahanyados, tensor-elemszam")
    ap.add_argument("--basis", required=True,
                    help="valasztott celzott alapozo egyseg, pl. n009")
    ap.add_argument("--seed-note", required=True,
                    help="magyarazat: miert nem eleg a seed onmagaban")
    ap.add_argument("--output-dir", default="lab_n004")
    args = ap.parse_args()

    os.makedirs(args.output_dir, exist_ok=True)
    log_path = os.path.join(args.output_dir, "log.json")
    if os.path.exists(log_path):
        print(f"Hiba: {log_path} mar letezik. "
              "A naplo append-only; ne ird felul az elso valtozatot.")
        return 2

    tensor_float = args.answers[4]
    if abs(tensor_float - round(tensor_float)) > 1e-9:
        print("Hiba: a tensor-elemszam egesz szam legyen.")
        return 2
    answers = {
        "norm": args.answers[0],
        "function": args.answers[1],
        "mean": args.answers[2],
        "derivative": args.answers[3],
        "tensor_elements": int(round(tensor_float)),
    }

    results = []
    for key, spec in EXPECTED.items():
        got = answers[key]
        if spec.get("exact"):
            err = abs(got - spec["value"])
            ok = got == spec["value"]
        else:
            err = abs(got - spec["value"])
            ok = err <= spec["tol"]
        results.append({
            "task": key,
            "expected": spec["value"],
            "got": got,
            "error": err,
            "ok": ok,
            "tolerance": spec.get("tol", 0),
        })

    now = datetime.now(timezone.utc).isoformat()
    material = now + json.dumps(answers, sort_keys=True)
    run_id = ("run-" + now.replace(":", "").replace("-", "")[:14]
              + "-" + hashlib.sha256(material.encode()).hexdigest()[:8])

    record = {
        "unit": "n004",
        "run_id": run_id,
        "timestamp": now,
        "device": "cpu",
        "dtype": "float64 numerikus ellenorzes; tensor-elemszam int",
        "glyphlab_seed_note":
            "glyphlab generalo seed 20261020; ez a labor nem general veletlent",
        "diagnosis_not_grading": True,
        "answers": answers,
        "results": results,
        "all_ok": all(r["ok"] for r in results),
        "chosen_basis_unit": args.basis,
        "seed_note": args.seed_note,
        "first_version_kept": True,
    }
    with open(log_path, "w", encoding="utf-8") as fh:
        json.dump(record, fh, ensure_ascii=False, indent=2)

    print("run_id:", run_id)
    print("log:", log_path)
    print("results:")
    for r in results:
        print(f"  {r['task']:>15s}: ok={r['ok']}, error={r['error']:.3g}")
    print("all_ok:", record["all_ok"])
    print("chosen_basis_unit:", args.basis)
    return 0 if record["all_ok"] else 1

if __name__ == "__main__":
    sys.exit(main())

Futtatási parancs, ha a hallgató mind az öt feladatot helyesen oldotta meg, és például a vektoros alapozást választja:

python n004_diagnosis.py --answers 5 5 3 4 1152 --basis n009 \
  --seed-note "A seed csak a generator kezdoallapota; ugyanaz a seed \
mas NumPy-verzioban vagy mas algoritmussal eltero sorozatot adhat."

A következő kimenet számított/demonstrációs példa, nem e könyv írása során futtatott mérés:

run_id: run-20261020T120000-4f2b81c3
log: lab_n004/log.json
results:
           norm: ok=True, error=0
       function: ok=True, error=0
           mean: ok=True, error=0
     derivative: ok=True, error=0
 tensor_elements: ok=True, error=0
all_ok: True
chosen_basis_unit: n009

Ha a fájl már létezik, a script exit code 2-vel megáll, és nem írja felül az első változatot. Ez a napló append-only/első-változat elve: a fejlődést csak úgy lehet később mérni, ha a diagnózis nyers állapota rögzítve marad. Az eredményértelmezés a hibás feladatokhoz kötött:

Hibás feladat Javasolt első alapozó egység
norm 3.1. Vektor, norma és skalárszorzat
function 3.2. Mátrixszorzás és affín réteg vagy 4.1. Függvény, határérték és derivált
mean / tensor_elements 2.1. Python, NumPy és tenzoralak
derivative 4.1. Függvény, határérték és derivált

A választás nem büntetés, hanem útvonaltervezés: aki a differenciahányadost eltéveszti, annak érdemes a kalkulusfejezetnél lassabban haladnia, de a diagnózis ettől nem minősíti a kurzusbeli kilátásait.

1.4.6 Feladatok

F1 (fogalmi, nehézség 1). Magyarázza el a seed és a futásazonosító különbségét, és adjon egy konkrét helyzetet, amelyben ugyanaz a seed két környezetben eltérő sorozatot adhat. Átadandó: a két definíció saját szavakkal, egy helyzet és egy mondat arról, hogy a naplóban miért kell mindkettő.

F2 (levezetési, nehézség 1). Számítsa ki az f(t)=3t2−2tf(t)=3t^2-2t függvény t=1t=1 pontjához tartozó szimmetrikus differenciahányadost h=0.1h=0.1 mellett. Adja meg minden lépését, az eredmény mértékegységét és a 33, illetve 22 együttható mértékegységét, ha [t]=s[t]=\mathrm{s} és [f]=m[f]=\mathrm{m}. Átadandó: a teljes levezetés és a mértékegység-ellenőrzés.

F3 (implementációs, nehézség 2). Írjon Python-függvényt, amely egy valós lista euklideszi normáját és átlagát számítja; üres listára a függvény ValueError-t dobjon. Átadandó: teljes kód, három teszteset (v=(3,4)v=(3,4), x=(1,3,5)x=(1,3,5), üres lista) és a tolerancia.

F4 (hibakeresési, nehézség 2). Az alábbi függvény hibás:

def mean(x):
    return sum(x) / (len(x) - 1)

Lokalizálja a hibát, adja meg a következményét egy egyelemű és egy kételemű bemeneten, javítsa, és ellenőrizze a javítást teszttel. Átadandó: ok, következmény, javított kód, teszteredmény.

F5 (kísérleti/transzfer, nehézség 3). Tervezze meg egy GlyphLab-osztályozó kísérlet naplójának rovatszerkezetét JSON-ban. A terv tartalmazza a run id-t, seedet, adatverziót, a scene_id szerinti csoportos split ellenőrzését, a választási protokollt (best checkpoint val loss alapján) és a záróteszt helyét. Indokolja, miért nem a test metrika alapján választ modellt. Átadandó: séma, kitöltési szabály és az érvényességi korlát egy bekezdésben.

1.4.7 Megoldások és indoklás

F1. A seed a pszeudovéletlen generátor bemenő kezdőállapota; a futásazonosító a kísérleti napló egy rekordját címkéző egyedi karakterlánc. Helyzet: np.random.seed(42) és np.random.default_rng(42) más algoritmus miatt eltérő sorozatot ad; ugyanígy PyTorch CPU és CUDA kernelváltozata is eltérhet. A naplóban a seed önmagában nem azonosítja a futást, mert a kódverzió vagy az adatverzió változása mellett ugyanaz a seed más eredményhez tartozhat; a run id ezért a teljes beállítás címkéje.

F2. A szimmetrikus hányados:

Shf(1)=f(1.1)−f(0.9)0.2. S_h f(1)=\frac{f(1.1)-f(0.9)}{0.2}.

Kiszámítva: f(1.1)=3(1.21)−2.2=3.63−2.2=1.43f(1.1)=3(1.21)-2.2=3.63-2.2=1.43, és f(0.9)=3(0.81)−1.8=2.43−1.8=0.63f(0.9)=3(0.81)-1.8=2.43-1.8=0.63. Így

Shf(1)=1.43−0.630.2=0.80.2=4.0. S_h f(1)=\frac{1.43-0.63}{0.2}=\frac{0.8}{0.2}=4.0.

Alternatív algebra: az f(t)=3t2−2tf(t)=3t^2-2t alakra a lemma mintájára Shf(t)=6t−2S_h f(t)=6t-2 adódik, mert a másodfokú tag szimmetrikus hányadosa 3⋅2t=6t3\cdot2t=6t, a lineáris −2t-2t tagé pedig −2-2. t=1t=1-nél az eredmény 4.04.0. A mértékegység [Shf]=[f]/[t]=m/s[S_h f]=[f]/[t]=\mathrm{m}/\mathrm{s}. Dimenziósan f(t)=at2−btf(t)=a\,t^2-b\,t a pontos alak, ahol a=3m/s2a=3\ \mathrm{m}/\mathrm{s}^2 és b=2m/sb=2\ \mathrm{m}/\mathrm{s}: a két együttható egysége különböző, mert mindkét tagnak méterben kell lennie. Ennek megfelelően Shf(t)=2at−bS_h f(t)=2a\,t-b, ahol mindkét tag egysége m/s\mathrm{m}/\mathrm{s}. Az alakellenőrzés: a hányados skalár, az egység a számlálóé osztva a nevezőével.

F3.

import math

def vector_norm(v):
    return math.sqrt(sum(x * x for x in v))

def mean(v):
    if len(v) == 0:
        raise ValueError("ures tombnek nincs atlaga")
    return sum(v) / len(v)

# Tesztek
assert abs(vector_norm([3.0, 4.0]) - 5.0) < 1e-12
assert abs(mean([1.0, 3.0, 5.0]) - 3.0) < 1e-12
try:
    mean([])
except ValueError:
    pass
else:
    raise AssertionError("ures tomb nem dobott ValueErrort")

A tolerancia 10−1210^{-12}, mert ezek a műveletek float64-ben pontosan reprezentálhatók. Az üres lista a szélsőeset: az átlag definíciója N≥1N\ge1-re érvényes, ezért a hibadobás a specifikáció része.

F4. Hiba: a nevező N−1N-1, nem NN. Következmény: N=1N=1 esetén nullával osztás (ZeroDivisionError); N=2N=2 esetén az eredmény a helyes átlag kétszerese, mert x1+x21\frac{x_1+x_2}{1} a x1+x22\frac{x_1+x_2}{2} kétszerese. Javítás: a nevező legyen len(x). Ellenőrző teszt:

def mean_fixed(x):
    return sum(x) / len(x)

assert mean_fixed([2.0]) == 2.0
assert abs(mean_fixed([1.0, 3.0]) - 2.0) < 1e-12

A javított függvény a N=1N=1 szélsőesetet is helyesen kezeli; a hiba a korrigálatlan változatban a definíció szerinti normálási konstans tévesztése volt.

F5. Egy lehetséges séma:

{
  "run_id": "run-20261020T...-abcd1234",
  "question": "GlyphLab orientation baseline",
  "data_version": "1.0, seed 20261020",
  "split_check": "grouped by scene_id; train 240 / val 60 / test 60",
  "seed": 42,
  "model": "kesobbi fejezetben rogzitendo",
  "protocol": "best checkpoint val loss alapjan; final test egyszer",
  "metric": "accuracy",
  "raw_results": "TODO"
}

Indoklás: ha a modellválasztás a test metrika alapján történne, a test halmaz a választási folyamat részévé válna, és a mért pontosság adaptív túlillesztést tartalmazna. A val halmaz a kiválasztásé, a test a rögzített protokoll végén egyszeri értékelésé. A GlyphLab érvényességi korlátja: a generált alakzatokon mért eredmény nem természetes képi benchmark és nem termelési validáció.

1.4.8 Gyakori tévedés ellenpéldával

A diagnózist gyakran hivatalos felvételiként vagy végleges készségminősítésként értelmezik. Ez tévedés. Ha egy hallgató a differenciahányadost például Shf(2)=2t+hS_h f(2)=2t+h értéknek számolja, az nem azt jelenti, hogy a kurzusból kizárt, hanem azt, hogy a határérték-intuíciót a 4.1. Függvény, határérték és derivált egységnél kell elmélyítenie. Ellenpélda a minősítő értelmezésre: két hallgató azonos hibát követ el, de az egyik korábban még soha nem látott deriváltat, a másik pedig elfelejtette; a hibapontszám nem különbözteti meg őket, a kurzus viszont mindkettőjüknek felépíti a hiányzó lépést. A diagnózis egyetlen érvényes következménye a célzott alapozó egység kiválasztása, nem a hallgató osztályozása.

1.4.9 Önellenőrzés és visszahívás

Ellenőrizze: (1) az átlag mértékegysége miért egyezik az adatéval; (2) a t2t^2-es lemma melyik lépése használja a h≠0h\ne0 feltételt; (3) a run id és a seed közül melyiket írjuk a generátornak szánt bemenetként. Válaszok: (1) mert az összeg mértékegysége az adaté, az 1/N1/N osztó dimenzió nélküli; (2) a 4th2h\frac{4th}{2h} egyszerűsítése; (3) a seedet. Visszahívás az 1.3. Adatfelosztás és a megfigyelési egység alfejezetből: a GlyphLabban a független egység a scene_id, ezért a napló split_check rovata azt igazolja, hogy egy jelenet minden nézete ugyanabba a splitbe került; a képszintű felosztás körülbelül 90 szabálytalan jelenetet okozhatott volna.

1.4.10 Tanulási főút és ellenőrző pontok

Ez a szakasz a könyv egészére érvényes, központi szabályokat adja meg. A tíz ellenőrző pont (4.4. I. ellenőrző pont: matematika és kód megfelelése, 8.4. II. ellenőrző pont: korrekt tanulási állítás, …, 40.4. X. ellenőrző pont: önálló neurális modell és bizonyíték) ezeket nem ismétli, csak a saját eltérését rögzíti.

A főút. A könyv tíz, egyenként négy fejezetből álló blokkra tagolódik; minden blokk a negyedik fejezete utolsó alfejezetében lévő ellenőrző ponttal zárul. A munkaterhelés tervezési becslés, nem mért érték: alfejezetenként 2–4 óra olvasás, feladat és labor, ellenőrző pontonként 6–10 óra.

  1. 1–4. fejezet: szerződés, Python/NumPy, lineáris algebra, derivált és VJP. Előfeltétel: nincs. Ellenőrző pont: 4.4. I. ellenőrző pont: matematika és kód megfelelése. Becsült munka: 40–60 óra.
  2. 5–8. fejezet: valószínűség, optimalizálás, veszteségek, általánosítás. Előfeltétel: az 1. blokk. Ellenőrző pont: 8.4. II. ellenőrző pont: korrekt tanulási állítás. Becsült munka: 40–60 óra.
  3. 9–12. fejezet: perceptron, MLP, backprop, PyTorch-tanítás. Előfeltétel: az 1–2. blokk. Ellenőrző pont: 12.4. III. ellenőrző pont: önállóan tanuló kis háló. Becsült munka: 40–60 óra.
  4. 13–16. fejezet: kép, konvolúció, gradiensei, equivariance, pooling. Előfeltétel: a 3. blokk. Ellenőrző pont: 16.4. IV. ellenőrző pont: a CNN-operátor teljes megértése. Becsült munka: 40–60 óra.
  5. 17–20. fejezet: klasszikus, reziduális, hatékony CNN, transfer. Előfeltétel: a 4. blokk. Ellenőrző pont: 20.4. V. ellenőrző pont: indokolt CNN-választás. Becsült munka: 40–60 óra.
  6. 21–24. fejezet: inicializálás, regularizálás, adat, értékelés, diagnózis. Előfeltétel: az 5. blokk. Ellenőrző pont: 24.4. VI. ellenőrző pont: megbízható CNN-training. Becsült munka: 40–60 óra.
  7. 25–28. fejezet: osztályozás, detektálás, szegmentálás, embedding. Előfeltétel: a 6. blokk. Ellenőrző pont: 28.4. VII. ellenőrző pont: CNN alkalmazási szerződés. Becsült munka: 40–60 óra.
  8. 29–32. fejezet: autoencoder, önfelügyelt, generatív, szekvencia, attention. Előfeltétel: a 7. blokk. Ellenőrző pont: 32.4. VIII. ellenőrző pont: célhoz illő neurális modell. Becsült munka: 40–60 óra.
  9. 33–36. fejezet: inference, hatékonyság, magyarázat, kísérlettervezés. Előfeltétel: a 6–7. blokk. Ellenőrző pont: 36.4. IX. ellenőrző pont: lektorálható modellállítás. Becsült munka: 40–60 óra.
  10. 37–40. fejezet: saját operátor, Projekt II–III, záróvizsga. Előfeltétel: az 1–9. blokk. Ellenőrző pont: 40.4. X. ellenőrző pont: önálló neurális modell és bizonyíték. Becsült munka: 60–80 óra.

Az előfeltételek a blokkok közti kötelező sorrendet adja: a 9. blokk a 8.-tól függetlenül is elkezdhető, ha a 6. és 7. blokk PASS; minden más blokk az előzőre épül.

Közös rubrika (0–4). Minden ellenőrző pontot öt dimenzióban értékelünk: (D1) matematikai helyesség, (D2) kód és futtathatóság, (D3) adat- és mérési protokoll (split, megfigyelési egység, tesztfegyelem), (D4) bizonyíték és nyomon követhetőség (napló, seed, verzió, hash, forrás), (D5) az állítás és korlátai (az állítás nem lép túl a bizonyítékon). Szintek: 0 hiányzik; 1 hibás; 2 lényegében helyes, de hiányosan ellenőrzött; 3 helyes és ellenőrzött; 4 helyes, ellenőrzött, és új helyzetre is indokoltan alkalmazott. A rubrika belső lektori eszköz, nem hivatalos osztályzat.

PASS-szabály. Továbbléphet, ha (a) az ellenőrző pont laborjának minden assert-je és toleranciaellenőrzése a saját futtatásában átmegy, (b) mind az öt dimenzió legalább 3, és (c) a riport csak ténylegesen lefuttatott kód kimenetét közli. Közös riportszabály: a riport a 36.4. IX. ellenőrző pont: lektorálható modellállítás hat komponensét tartalmazza (bizonyítás, forrásnyom, kód, futási jegyzék, páros eredmény, korlátok); a futási jegyzék a seedet, a csomag- és eszközverziót és a bemeneti fájlok SHA-256 lenyomatát rögzíti.

Visszautak. Ha egy ellenőrzés elbukik, a hibatípushoz tartozó alfejezetet kell újra feldolgozni: a feladatait megoldani, a laborját újrafuttatni, majd az ellenőrző pontot megismételni.

Ha ugyanaz a dimenzió két egymást követő kísérletben is 3 alatt marad, a blokk első fejezetétől kell visszalépni.

1.4.11 Egységjegyzék

A folyószöveg a többi alfejezetre fejezet.alfejezet számmal hivatkozik (például 4.3. Jacobi-mátrix, láncszabály és VJP). Az nNNN azonosító technikai kulcs: ez a forrásfájl neve (chapters/nNNN.md), a hivatkozási horgony és a laborfájlok előtagja. Az alábbi jegyzék mindkettőt megadja. A labor rovat a lab/ alatti, a könyvben teljes egészében közölt laborfájlokat sorolja fel; az adat rovat a kódblokkokban olvasott GlyphLab-fájlokat (I = images.npy, L = labels.npy, M = masks.npy, C = corrupted_test.npy, D = metadata.csv); a kimenet rovat a kódban szó szerint megnevezett kimeneti fájlokat. Változóval megadott kimeneti útvonalat a jegyzék nem sorol fel; ezeket az adott labor szakasza írja le.

1.4.12 Rövid összefoglaló

Az 1.4. Tanulási diagnózis és kísérleti napló diagnózis nem osztályozó vizsga, hanem az alapozó útvonal kiválasztását segítő első mérés. A vektor normája csak közös komponens-egység mellett értelmes; az átlag egysége az adaté; a differenciahányados egysége [f]/[t][f]/[t]. A másodfokú t2t^2 szimmetrikus hányadosa pontosan 2t2t, amit algebrailag igazoltunk; harmadfokú esetre a lemma nem áll, és a határértéket a 4.1. Függvény, határérték és derivált formalizálja. A tensor alakja dimenzió nélküli, dtype-ja a tárolást rögzíti. A seed a generátor kezdőállapota, a futásazonosító a napló kulcsa; a kettő nem felcserélhető. A labor az első változatot append-only JSON-ba menti, és a hibák alapján célzott alapozó egységet választ.

Következő alkalmazás. A 2.1. Python, NumPy és tenzoralak egység a tenzoralak és a NumPy-műveletek pontos kezelését vezeti be; ha a diagnózis a mean vagy tensor_elements feladatban hibát mutatott, ez az első célzott alapozó.

Források