main function

void main()

Implementation

void main() {
  const lr = 0.08;
  final model = MultiLayerPerceptron(lr); // 4 inputs → 2 outputs
  // print("Image bytes legnt: ${imgBytes.length}"); // 784 bytes
  final inputs = [
    ValueVector([
      Value(2 / DOUBLE_PI),
      Value(1.8 / DOUBLE_PI),
      Value(1.7 / DOUBLE_PI),
    ]),
    ValueVector([
      Value(1.6 / DOUBLE_PI),
      Value(1.5 / DOUBLE_PI),
      Value(1.4 / DOUBLE_PI),
    ]),
    ValueVector([
      Value(1.3 / DOUBLE_PI),
      Value(1.2 / DOUBLE_PI),
      Value(1.1 / DOUBLE_PI),
    ])
  ];

  final targets = [
    ValueVector([
      Value(2 / DOUBLE_PI),
      Value(1.8 / DOUBLE_PI),
      Value(1.7 / DOUBLE_PI),
      Value(1.6 / DOUBLE_PI),
      Value(1.5 / DOUBLE_PI),
    ]),
    ValueVector([
      Value(1.4 / DOUBLE_PI),
      Value(1.3 / DOUBLE_PI),
      Value(1.2 / DOUBLE_PI),
      Value(1.1 / DOUBLE_PI),
      Value(1.0 / DOUBLE_PI),
    ]),
    ValueVector([
      Value(0.9 / DOUBLE_PI),
      Value(0.8 / DOUBLE_PI),
      Value(0.7 / DOUBLE_PI),
      Value(0.6 / DOUBLE_PI),
      Value(0.5 / DOUBLE_PI),
    ])
  ];
  print("Inputs: $inputs"); // 784 bytes
  const epochs = 100000;

  for (int epoch = 0; epoch < epochs; epoch++) {
    final losses = <Value>[];

    // Reset gradients

    // Compute loss for all samples
    for (int i = 0; i < inputs.length; i++) {
      final yPred = model.forward(inputs[i]);
      final yTrue = targets[i];
      final diff = yPred - yTrue;
      final squared = diff.squared();
      final sampleLoss = squared.mean();
      losses.add(sampleLoss);
    }

    final totalLoss = losses.reduce((a, b) => a + b);
    // final avgLoss = totalLoss * (1.0 / inputs.length);
    // avgLoss.backward();
    totalLoss.backward();

    // Gradient descent
    model.updateWeights();

    // if (epoch % 4 == 0) {
    //   print("Epoch $epoch | Loss = ${totalLoss.data.toStringAsFixed(4)}");
    // }
    if (epoch % 1000 == 0) {
      print("Epoch $epoch | Loss = ${totalLoss.data.toStringAsFixed(10)}");
    }
    model.zeroGrad();
  }

  for (var input in inputs) {
    // Reset gradients
    for (var p in model.parameters()) {
      p.grad = 0;
    }
    print("Input: ${input}");
    print("Output: ${model.forward(input)}");
    print("");
  }
}