# Inkjet CDM — Experiment Log Full chronological log of all inkjet CDM experiments. --- ## Model Architecture ``` CDM UNet — Multi-Head Conditioning Parameters: ~9.3M (inkjet model, smaller than CIFAR-10's 35.7M) Input: YOLO-cropped inkjet print region (bbox crop) Conditioning: 4 heads — template_id, feature_id, quality_label, bbox_coords Schedule: Cosine (Nichol & Dhariwal 2021), 1000 timesteps, epsilon prediction Scoring: Algorithm 1 — difference method (pred_good_err - pred_bad_err) ``` --- ## Dataset Statistics ``` Total samples: 1,327 (from feature_cls.csv) Train split: 80% = ~1,061 samples (with BAD oversampling ×3 → effective train size larger) Test split: 20% = 266 samples (FIXED, seed=42, no oversampling) Test set breakdown: Templates: A=105, B=28, C=133 Labels: GOOD=174, BAD=92 (imbalance: 1.89:1) Per-feature test counts: angle: 27 GOOD, 3 BAD ← WARNING: only 3 BAD — AUROC unreliable dist1: 21 GOOD, 10 BAD dist6: 30 GOOD, 6 BAD dots: 26 GOOD, 11 BAD edge1: 12 GOOD, 16 BAD edge2: 18 GOOD, 28 BAD edge3: 16 GOOD, 12 BAD edge4: 24 GOOD, 6 BAD ``` --- ## Experiment 1 — Baseline CDM (λ=0) **Goal:** Establish CDM performance without separation loss. **Config:** ``` sep_loss_weight: 0.0 batch_size: 128 (single forward pass, fits 32GB VRAM comfortably) epochs: 100 schedule: cosine num_trials: 100 (K=100 at evaluation) out_dir: results/inkjet_lambda0 ``` **Key fix applied:** Trainer gated separation loss computation behind `if sep_loss_weight > 0.0` to prevent 3× VRAM usage and OOM errors on the baseline run. **Results (K=100):** ``` Overall AUROC=0.8325 Acc=0.7895 FPR@95TPR=0.8161 N=266 ``` **Output files:** - `results/inkjet_lambda0/cdm_best.pt` - `results/inkjet_lambda0_k100/scores.csv` - `results/inkjet_lambda0.log` --- ## Experiment 2 — Separation Loss λ=0.02 **Goal:** Apply CIFAR-10 optimal λ directly to inkjet. **Config:** ``` sep_loss_weight: 0.02 batch_size: 64 (3 forward passes per step: main + good + bad) epochs: 100 ``` **Results (K=100, re-evaluated):** ``` Overall AUROC=0.8541 Acc=0.8008 FPR@95TPR=0.6609 N=266 ``` *Note: First evaluation (K=50) showed 0.8581; variance ±0.005 at K=50.* **Output files:** - `results/inkjet_lambda0.02/cdm_best.pt` - `results/inkjet_lambda0.02_k100/scores.csv` - `results/inkjet_lambda0.02.log` --- ## Experiment 3 — Separation Loss λ=0.01 **Goal:** Test CIFAR-10 sub-optimal value on inkjet (one step below λ=0.02). **Config:** ``` sep_loss_weight: 0.01 batch_size: 64 epochs: 100 num_trials: 100 ``` **Results (K=100, inline with training via --eval_after):** ``` Overall AUROC=0.8603 Acc=0.8158 FPR@95TPR=0.6264 N=266 ``` **→ Best AUROC of all λ values on inkjet.** **Output files:** - `results/inkjet_lambda0.01/cdm_best.pt` - `results/inkjet_lambda0.01/scores_final.csv` - `results/inkjet_lambda0.01.log` --- ## Experiment 4 — Separation Loss λ=0.05 **Goal:** Test CIFAR-10 upper boundary of optimal zone on inkjet. **Config:** ``` sep_loss_weight: 0.05 batch_size: 64 epochs: 100 num_trials: 100 ``` **Results (K=100):** ``` Overall AUROC=0.8553 Acc=0.8233 FPR@95TPR=0.5287 N=266 ``` **→ Best FPR@95TPR of all λ values. Best accuracy.** **Output files:** - `results/inkjet_lambda0.05/cdm_best.pt` - `results/inkjet_lambda0.05/scores_final.csv` - `results/inkjet_lambda0.05.log` --- ## Experiment 5 — 5-Fold CV Ablation (Phase 2, FINAL) **Date:** March 1-2, 2026 **Goal:** Rigorous evaluation with confidence intervals. All four λ values evaluated under identical conditions (batch=64 for fair comparison). **Config (all runs):** ``` batch_size: 64 (all runs — eliminates confound) epochs: 100 per fold seed: 42 num_trials: 100 n_folds: 5 (stratified on label) Total GPU time: ~24h ``` **Results:** | λ | AUROC (5-fold CV) | Accuracy | FPR@95TPR | |---|:---:|:---:|:---:| | **0.0** | **0.8673 ± 0.0230** | **0.8094 ± 0.0151** | 0.5631 ± 0.1697 | | 0.01 | 0.8628 ± 0.0286 | 0.7928 ± 0.0291 | **0.5516 ± 0.1841** | | 0.02 | 0.8510 ± 0.0326 | 0.8003 ± 0.0246 | 0.6240 ± 0.1334 | | 0.05 | 0.8670 ± 0.0256 | 0.8071 ± 0.0241 | 0.5700 ± 0.1948 | **→ Separation loss does NOT improve over baseline on inkjet. All λ values within std.** **Output files:** - `results/cv_lambda0.0/cv_summary.json` (+ per-fold scores) - `results/cv_lambda0.01/cv_summary.json` - `results/cv_lambda0.02/cv_summary.json` - `results/cv_lambda0.05/cv_summary.json` --- ## Key Decisions & Rationale | Decision | Choice | Rationale | |----------|--------|-----------| | 5-fold CV for final results | 5-fold stratified | Single-split results unreliable; CV provides confidence intervals | | batch=64 for ALL runs | 64 | Eliminates batch-size confound; sep loss needs 3 forward passes | | λ values tested | 0.0, 0.01, 0.02, 0.05 | Covers CIFAR-10 optimal zone; more points not justified | | K=100 for final eval | K=100 | Stable estimates; CIFAR-10 K-ablation showed diminishing returns after K=25 | | seed=42 | 42 | Matches CIFAR-10 primary seed | --- ## Known Issues 1. **`angle` feature**: Only 2-4 BAD samples per fold. AUROC highly variable (0.54–0.95). Report with caveat. 2. **MC variance**: ±0.003 at K=100. Negligible compared to cross-fold variance (±0.025). 3. **Separation loss ineffective**: The primary thesis finding for inkjet. See cross-domain comparison in RESULTS.md. --- ## Hardware - **GPU:** CUDA device 3 (Quadro GV100, 32 GB VRAM) - **Environment:** `/system/apps/studentenv/mohammed/sdm/` - **Training time per fold:** ~70 min (100 epochs, batch=64, λ>0) - **Evaluation time per fold (K=100):** ~45 seconds - **Total 5-fold CV ablation time:** ~24h (4 λ values × 5 folds)