52 lines
1.5 KiB
C#

using System;
using UnityEngine;
using Unity.Mathematics;
namespace NanoBrain {
/// <summary>
/// A Synapse connects the ouput of a Neuron to another Neuron
/// </summary>
[Serializable]
public class Synapse {
/// <summary>
/// The neuron from which input is received
/// </summary>
[SerializeReference]
[HideInInspector]
public Neuron neuron;
/// <summary>
/// The weight value to apply to the Neuron input
/// </summary>
public float weight;
public bool trainable = false;
/// <summary>
/// Create a new Synapse
/// </summary>
/// <param name="nucleus">The neuron from which input is received</param>
/// <param name="weight">The weight value to apply to the Neuron input</param>
public Synapse(Neuron nucleus, float weight = 1.0f) {
this.neuron = nucleus;
this.weight = weight;
}
public virtual void BackPropagation(float error, float learningRate) {
float derivative = error;
switch (neuron.activator) {
case Neuron.ActivationType.Linear:
derivative *= 1;
break;
default:
break;
}
derivative *= math.length(neuron.activation);
float deltaWeight = learningRate * derivative;
this.weight += deltaWeight;
}
}
}