From 7dd1ac57178055aa8407777d4fb03787e21e6f66 Mon Sep 17 00:00:00 2001 From: skal Date: Wed, 11 Feb 2026 10:10:11 +0100 Subject: fix: Move sigmoid activation to call site in CNN layer shader Conv functions now return raw sum, sigmoid applied at call site. Matches tanh pattern used for inner layers. Co-Authored-By: Claude Sonnet 4.5 --- training/train_cnn.py | 8 ++++---- workspaces/main/shaders/cnn/cnn_conv3x3.wgsl | 2 +- workspaces/main/shaders/cnn/cnn_conv5x5.wgsl | 2 +- workspaces/main/shaders/cnn/cnn_layer.wgsl | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/training/train_cnn.py b/training/train_cnn.py index e1fd27b..dc14192 100755 --- a/training/train_cnn.py +++ b/training/train_cnn.py @@ -335,8 +335,8 @@ 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 = {conv_fn}(txt, smplr, uv, uniforms.resolution, gray, weights_layer{layer_idx});\n") - f.write(f" // gray_out in [0,1] (sigmoid activation)\n") + f.write(f" let sum = {conv_fn}(txt, smplr, uv, uniforms.resolution, gray, weights_layer{layer_idx});\n") + f.write(f" let gray_out = 1.0 / (1.0 + exp(-sum)); // Sigmoid activation\n") f.write(f" result = vec4(gray_out, gray_out, gray_out, 1.0);\n") f.write(f" return mix(original_raw, result, params.blend_amount); // [0,1]\n") f.write(f" }}\n") @@ -452,7 +452,7 @@ def generate_conv_final_function(kernel_size, output_path): with open(output_path, 'a') as f: f.write(f"\n// Final layer: 7→1 channel (vec4-optimized)\n") f.write(f"// Assumes 'tex' is already normalized to [-1,1]\n") - f.write(f"// Output uses sigmoid activation to match PyTorch training\n") + f.write(f"// Returns raw sum (activation applied at call site)\n") f.write(f"fn cnn_conv{k}x{k}_7to1(\n") f.write(f" tex: texture_2d,\n") f.write(f" samp: sampler,\n") @@ -479,7 +479,7 @@ def generate_conv_final_function(kernel_size, output_path): f.write(f" }}\n") f.write(f" }}\n\n") - f.write(f" return 1.0 / (1.0 + exp(-sum));\n") + f.write(f" return sum;\n") f.write(f"}}\n") diff --git a/workspaces/main/shaders/cnn/cnn_conv3x3.wgsl b/workspaces/main/shaders/cnn/cnn_conv3x3.wgsl index d680840..48bb392 100644 --- a/workspaces/main/shaders/cnn/cnn_conv3x3.wgsl +++ b/workspaces/main/shaders/cnn/cnn_conv3x3.wgsl @@ -108,5 +108,5 @@ fn cnn_conv3x3_7to1( } } - return 1.0 / (1.0 + exp(-sum)); + return sum; } diff --git a/workspaces/main/shaders/cnn/cnn_conv5x5.wgsl b/workspaces/main/shaders/cnn/cnn_conv5x5.wgsl index e39f6ef..9328d75 100644 --- a/workspaces/main/shaders/cnn/cnn_conv5x5.wgsl +++ b/workspaces/main/shaders/cnn/cnn_conv5x5.wgsl @@ -62,7 +62,7 @@ fn cnn_conv5x5_7to1( } } - return 1.0 / (1.0 + exp(-sum)); + return sum; } // Source layer: 7→4 channels (vec4-optimized) diff --git a/workspaces/main/shaders/cnn/cnn_layer.wgsl b/workspaces/main/shaders/cnn/cnn_layer.wgsl index c5f45ec..73816c6 100644 --- a/workspaces/main/shaders/cnn/cnn_layer.wgsl +++ b/workspaces/main/shaders/cnn/cnn_layer.wgsl @@ -45,8 +45,8 @@ struct CNNLayerParams { result = cnn_tanh(result); // Keep in [-1,1] } else if (params.layer_index == 2) { - let gray_out = cnn_conv3x3_7to1(txt, smplr, uv, uniforms.resolution, gray, weights_layer2); - // gray_out in [0,1] (sigmoid activation) + let sum = cnn_conv3x3_7to1(txt, smplr, uv, uniforms.resolution, gray, weights_layer2); + let gray_out = 1.0 / (1.0 + exp(-sum)); // Sigmoid activation result = vec4(gray_out, gray_out, gray_out, 1.0); return mix(original_raw, result, params.blend_amount); // [0,1] } -- cgit v1.2.3