summaryrefslogtreecommitdiff
path: root/training
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-10 17:37:01 +0100
committerskal <pascal.massimino@gmail.com>2026-02-10 17:37:01 +0100
commitf3c7ef8cd612f5ac908f39310c4c11566879313f (patch)
tree1e66127a855f30282c852731c0dd88ae6c7039bc /training
parent0aa35e895d70f4535b7fac0f5df318888a6847dc (diff)
fix: Support variable kernel sizes in CNN layer generation
Training script was hardcoded to generate cnn_conv3x3_* calls regardless of actual kernel size, causing shader validation errors when layer 1 used 5×5 kernel (100 weights) but called 3×3 function (expected 36). Changes: - train_cnn.py: Generate correct conv function based on kernel_sizes[i] - cnn_conv5x5.wgsl: Add cnn_conv5x5_7to4 and cnn_conv5x5_7to1 variants - Regenerate cnn_layer.wgsl with correct function calls for [3,5,3] - Document kernel size→function mapping in HOWTO.md Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Diffstat (limited to 'training')
-rwxr-xr-xtraining/train_cnn.py9
1 files changed, 6 insertions, 3 deletions
diff --git a/training/train_cnn.py b/training/train_cnn.py
index 0495c65..8c7b2b3 100755
--- a/training/train_cnn.py
+++ b/training/train_cnn.py
@@ -174,10 +174,13 @@ def generate_layer_shader(output_path, num_layers, kernel_sizes):
# Generate layer switches
for layer_idx in range(num_layers):
is_final = layer_idx == num_layers - 1
+ ks = kernel_sizes[layer_idx]
+ conv_fn = f"cnn_conv{ks}x{ks}_7to4" if not is_final else f"cnn_conv{ks}x{ks}_7to1"
+
if layer_idx == 0:
f.write(f" // Layer 0: 7→4 (RGBD output)\n")
f.write(f" if (params.layer_index == {layer_idx}) {{\n")
- f.write(f" result = cnn_conv3x3_7to4(txt, smplr, uv, uniforms.resolution,\n")
+ f.write(f" result = {conv_fn}(txt, smplr, uv, uniforms.resolution,\n")
f.write(f" original, weights_layer{layer_idx});\n")
f.write(f" result = cnn_tanh(result); // Output in [-1,1]\n")
f.write(f" // Denormalize to [0,1] for texture storage\n")
@@ -185,7 +188,7 @@ def generate_layer_shader(output_path, num_layers, kernel_sizes):
f.write(f" }}\n")
elif not is_final:
f.write(f" else if (params.layer_index == {layer_idx}) {{\n")
- f.write(f" result = cnn_conv3x3_7to4(txt, smplr, uv, uniforms.resolution,\n")
+ f.write(f" result = {conv_fn}(txt, smplr, uv, uniforms.resolution,\n")
f.write(f" original, weights_layer{layer_idx});\n")
f.write(f" result = cnn_tanh(result); // Output in [-1,1]\n")
f.write(f" // Denormalize to [0,1] for texture storage\n")
@@ -193,7 +196,7 @@ def generate_layer_shader(output_path, num_layers, kernel_sizes):
f.write(f" }}\n")
else:
f.write(f" else if (params.layer_index == {layer_idx}) {{\n")
- f.write(f" let gray_out = cnn_conv3x3_7to1(txt, smplr, uv, uniforms.resolution,\n")
+ f.write(f" let gray_out = {conv_fn}(txt, smplr, uv, uniforms.resolution,\n")
f.write(f" original, weights_layer{layer_idx});\n")
f.write(f" // Denormalize from [-1,1] to [0,1]\n")
f.write(f" let gray_01 = (gray_out + 1.0) * 0.5;\n")