# Experiment settings for the occupancy MLP MVP. # `device` is still detected at runtime in src/config.py (CUDA vs CPU). # --- Model Architecture --- hidden: 64 # Number of hidden units (channels) per layer in the OccupancyMLP depth: 4 # Number of hidden linear layers in the MLP network seed: 1 # Same seed as the previous extrude_nr1 train # --- Path Configuration --- data_dir: "E:/Work_stuff/scatteringNet/data" # Base root directory where all NPZ dataset files are stored # --- Training Hyperparameters --- epochs: 20 # Same length as the knn24-n2048 G5 clone (compare IoU to that best.pt) lr: 0.001 # Initial learning rate batch_size: 1024 # Points per optimizer step (GPU mini-batch) optimizer: adam # adam | adamw | sgd # BCE inside-class weight. auto = n_outside / n_inside on the train split. # Omit or null = unweighted BCE (legacy / 18-09-31 clone). Head is unchanged. pos_weight: auto # --- Split --- # Whole meshes: 80% train / 20% val of unique OBJs. All NPZs of one OBJ stay on one side. # This split selects best.pt (not a locked holdout). Phase 2 Step 11 adds that. val_fraction: 0.20 # --- Geometry --- # none = xyz-only OccupancyMLP. surface = envelope (XYZ + face normal) + OccupancyEncoder. # Occupancy labels stay in the NPZ. New trains write envelope_dim=6 on best.pt. shape_encoder: surface # none / surface n_surface: 2048 # Envelope samples on the joined OBJ (area-weighted face darts) knn_k: 24 # Neighbors per query (not envelope count). Same head as knn24-n2048 inspect / G5 clone. Fresh train; do not resume that mix-75 best.pt. # knn_local_dim: 64 # z_local width; omit to use latent_dim / hidden # latent_dim: 64 # OccupancyEncoder z width; omit to use hidden # --- Catalog --- # npz_catalog wins over npz_glob. Each row is all meshes for that glob unless # max_shapes is set (unique OBJs, sampled with seed; still max_files_per_shape NPZs). # Varied/organic and combo* are omitted on purpose. # Fallback glob is unused while npz_catalog is set. # Smooth extruded_* is back (same glob as knn24-n2048 inspect). High-round # extrude_* stay s0.08. Primitives and nr1 stay s0.15. nr3 is omitted. # max_files_per_shape keeps lattice + one jitter. npz_glob: "exports/dataset/*.npz" npz_catalog: - glob: "exports/dataset/cone_*.npz" - glob: "exports/dataset/cube_*.npz" - glob: "exports/dataset/cyl_*.npz" - glob: "exports/dataset/gear_*.npz" - glob: "exports/dataset/helix_*.npz" - glob: "exports/dataset/pipe_*.npz" - glob: "exports/dataset/platonic_*.npz" - glob: "exports/dataset/prism_*.npz" - glob: "exports/dataset/sphere_*.npz" - glob: "exports/dataset/torus_*.npz" - glob: "exports/dataset/extruded_*occupancy_s0.08*.npz" - glob: "exports/dataset/extrude_*_nr1_*.npz" max_shapes: 40 - glob: "exports/dataset/extrude_*_nr4_*occupancy_s0.08*.npz" max_shapes: 90 - glob: "exports/dataset/extrude_*_nr5_*occupancy_s0.08*.npz" max_files_per_shape: 2 # --- Run logs --- # Suffix for runs/_/. Device is detected at runtime, not stored here. run_name: prim_extruded_nr45_knn24_n2048_n6_pw # --- Checkpoints --- # Scalar used to decide models//best.pt (strict improve). No last.pt. # The run snapshot (runs//config.yaml) records: # total — planned epoch count (copied from epochs) # checkpoint — epoch index stored in best.pt (runtime; not a project knob) # val_iou = keep the epoch with the best inside overlap (not overall accuracy). checkpoint_metric: val_iou