Backpropagation over cluster part 1
This commit is contained in:
parent
06a7a6d1fa
commit
fa9b3145f9
@ -366,6 +366,49 @@ namespace NanoBrain {
|
|||||||
thingClusters.Remove(thingId);
|
thingClusters.Remove(thingId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<Neuron> GetAllInstances(Neuron nucleus) {
|
||||||
|
List<Neuron> allInstances = new();
|
||||||
|
|
||||||
|
int ix = -1;
|
||||||
|
//foreach (Nucleus myNucleus in this.nuclei) {
|
||||||
|
for (; ix < this.nuclei.Count; ix++) {
|
||||||
|
if (this.nuclei[ix] == nucleus)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ix == this.nuclei.Count)
|
||||||
|
return allInstances;
|
||||||
|
|
||||||
|
foreach (Cluster instance in this.instances) {
|
||||||
|
List<Nucleus> otherNuclei = instance.nuclei;
|
||||||
|
if (otherNuclei[ix] is Neuron otherNeuron)
|
||||||
|
allInstances.Add(otherNeuron);
|
||||||
|
}
|
||||||
|
return allInstances;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Backpropagation(Func<Cluster, Vector3> Observer, Vector3 target, float learningRate) {
|
||||||
|
foreach (Nucleus nucleus in this.instances[0].nuclei) {
|
||||||
|
if (nucleus is not Neuron neuron)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
foreach (Synapse synapse in neuron.synapses) {
|
||||||
|
List<Neuron> allSynapseNeurons = GetAllInstances(synapse.neuron);
|
||||||
|
|
||||||
|
Vector3 dSSRdW = Vector3.zero;
|
||||||
|
for (int clusterIx = 0; clusterIx < this.instances.Length; clusterIx++) {
|
||||||
|
Cluster clusterInstance = this.instances[clusterIx];
|
||||||
|
Neuron neuronInstance = allSynapseNeurons[clusterIx];
|
||||||
|
|
||||||
|
// Simple case, without receivers...
|
||||||
|
dSSRdW += (Vector3)(-2 * (Observer(clusterInstance) - target) * neuronInstance.activation);
|
||||||
|
}
|
||||||
|
synapse.weight += learningRate * dSSRdW.magnitude;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endregion ClusterArray
|
#endregion ClusterArray
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -724,7 +767,7 @@ namespace NanoBrain {
|
|||||||
foreach (Nucleus nucleus in this.nuclei.ToArray()) {
|
foreach (Nucleus nucleus in this.nuclei.ToArray()) {
|
||||||
if (nucleus is not Cluster cluster)
|
if (nucleus is not Cluster cluster)
|
||||||
continue;
|
continue;
|
||||||
List<Nucleus> receivers = cluster.CollectReceivers();
|
List<Nucleus> receivers = cluster.CollectReceivers();
|
||||||
Debug.Log($"cluster receiver count = {receivers.Count}");
|
Debug.Log($"cluster receiver count = {receivers.Count}");
|
||||||
if (receivers.Count == 0)
|
if (receivers.Count == 0)
|
||||||
this.nuclei.Remove(nucleus);
|
this.nuclei.Remove(nucleus);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user