From 1343b99e2b80c5d4a3689e61a90906d58c71aac7 Mon Sep 17 00:00:00 2001 From: Riccardo Forese Date: Mon, 2 Feb 2026 17:52:55 +0100 Subject: [PATCH] Aggiunta della struttura neuron e tensor --- src/main.zig | 34 ++++++++++++++++++++++++++-------- src/neuron.zig | 17 +++++++++++++++++ 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/main.zig b/src/main.zig index 240cf72..66bee12 100644 --- a/src/main.zig +++ b/src/main.zig @@ -3,26 +3,44 @@ const Neuron = @import("neuron.zig").Neuron; const Tensor = @import("tensor.zig").Tensor; pub fn main() !void { - // 1. Setup dell'allocatore per la memoria var gpa = std.heap.GeneralPurposeAllocator(.{}){}; const allocator = gpa.allocator(); defer _ = gpa.deinit(); - // 2. Creiamo un neurone con 3 ingressi + // 1. Inizializza Neurone var my_neuron = try Neuron.init(allocator, 3); defer my_neuron.deinit(); - // 3. Creiamo dei dati di input di esempio (es. [1.0, 0.5, -2.0]) + // 2. Dati di Input var inputs = try Tensor.init(allocator, &[_]usize{3}); defer inputs.deinit(); inputs.data[0] = 1.0; inputs.data[1] = 0.5; inputs.data[2] = -2.0; - // 4. Eseguiamo il calcolo - const output = my_neuron.forward(inputs); + // 3. Il Target: Vogliamo che il neurone impari a rispondere "4.0" + const target: f32 = 4.0; - std.debug.print("Input: {any}\n", .{inputs.data}); - std.debug.print("Pesi del neurone: {any}\n", .{my_neuron.weights.data}); - std.debug.print("Risultato (Output): {d:.4}\n", .{output}); + // Learning Rate: La velocità di apprendimento (né troppo alta, né troppo bassa) + const lr: f32 = 0.01; + + std.debug.print("--- INIZIO TRAINING ---\n", .{}); + std.debug.print("Target desiderato: {d:.2}\n", .{target}); + + // 4. Ciclo di Training (Epochs) + var i: usize = 0; + while (i < 100) : (i += 1) { + const loss = my_neuron.train(inputs, target, lr); + + // Stampiamo lo stato ogni 10 passaggi + if (i % 10 == 0) { + const current_pred = my_neuron.forward(inputs); + std.debug.print("Epoca {d}: Loss = {d:.6} | Previsione attuale = {d:.4}\n", .{ i, loss, current_pred }); + } + } + + std.debug.print("\n--- TRAINING COMPLETATO ---\n", .{}); + std.debug.print("Pesi finali: {any}\n", .{my_neuron.weights.data}); + std.debug.print("Bias finale: {d:.4}\n", .{my_neuron.bias}); + std.debug.print("Risultato finale: {d:.4}\n", .{my_neuron.forward(inputs)}); } diff --git a/src/neuron.zig b/src/neuron.zig index 12648cd..a47ee2c 100644 --- a/src/neuron.zig +++ b/src/neuron.zig @@ -40,4 +40,21 @@ pub const Neuron = struct { return if (z > 0) z else 0; } + + pub fn train(self: *Neuron, inputs: Tensor, target: f32, learning_rate: f32) f32 { + const prediction = self.forward(inputs); + + const err = prediction - target; + + const d_relu: f32 = if (prediction > 0) 1.0 else 0.0; + + for (self.weights.data, inputs.data) |*w, x| { + const gradient = err * d_relu * x; + w.* -= learning_rate * gradient; + } + + self.bias -= learning_rate * err * d_relu; + + return err * err; + } };