Mivel mindig kitalálok valami forradalmi baromságot így hát miért ne elven… LINQ használata Neurális hálózatokban alaposan leegyszerűsíti a hálózat kezelését minden tekintetben persze ez mind tényleges programozás eredménye szóval felhasználás csak ÉSSZEL hiba van benne nem is egy de lusta vagyok én ezt javítani, majd ha élesben programozom meglesz a javított verzió.

Minden neuronnak van egy DoWork metódusa ami semmi mást nem csinál mintsem kiszámolja az adott neuron kimenetét szépen ahogy az a nagy könyvben meg vagyon írva. Indexelési hiba van benne házi feladat megtalálni marha egyszerű amúgy…

private void DoWork()
{
    var getInputs = select * from (ISynapseLayer)GetSynapseLayer[this.Layer-1] where (ISynapse)Connection.Target.Equals(this);
    foreach(Isynapse _synapse in getInputs)
    {
        this._output += _synapse.Weight * _synapse.Value;
    }
    this._output.Activate;
    var getOutputs = select * from (ISynapseLayer)GetSynapseLayer[this.Layer+1] where (ISynapse)Connection.Source.Equals(this);
    for(int i = 0; i < (ISynapse)getOutputs.Count; i++)
    {
        getOutputs.Value = this._output;
    }
}

public void Propagate()
{
    foreach(ILayer _layer in Network)
    {
        foreach(INeuron _neuron in _layer)
        {
            _neuron.DoWork();
        }
    }
}

private void BackPropagate(double delta)
{
    for(int i = this.Network.GetNumberOfNeuralLayers() – 1; i > 0; i–)
    {
        for(int j = 0; j < this.Network.NeuralLayers[i].GetNumberOfNeurons(); j++)
        {
            var Synapse = select * from (ISynapseLayer)GetSanypaseLayer[this.Layer-1] where (ISynapse)Connection.Target.Equals(this.Network.NeuralLayers[this.Network.GetNumberOfNeuralLayers() – 1].Neurons[GetNumberOfNeurons() – 1];
            INeuron SourceNeuron = select * from (INeuralLayer)GetNeuralLayer[this.Layer-1] where (INeuron)Neuron.OutputSynapses.Foreach(delegate(){Synapse.Target.Eqals(this.Network.NeuralLayers[i].Neurons[j]);});
            SourceNeuron.Delta += Synapse.Weight * delta;
        }
    }
}

private void PropagateSetWeights()
{
    for(int i = 0; i < this.Network.GetNumberOfNeuralLayers(); i++)
    {
        for(int j = 0; j < this.Network.NeuralLayers[i].GetNumberOfNeurons(); j++)
        {
            var Inputs = select * from (ISynapseLayer)GetSynapseLayer[this.Network.NeuralLayers[i]-1] where (ISynapse)Connection.Target.Equals(this.Network.NeuralLayers[i].Neurons[j]);
            for(int k = 0; k < Inputs.Count; k++)
            {
                Inputs[k].Weight += this.Network.NeuralLayers[i].Neurons[j].Etha * this.Network.NeuralLayers[i].Neurons[j].Delta * this.Network.NeuralLayers[i].Neurons[j] * Inputs[k].Value;
                Inputs[k].Weight = Inputs[k].Weight.ActivateDerivation;
            }
        }
    }
}
public double TrainNetwork(double treshold, int max_iteration)
{
    double _error = Double.Max_Double;
    int _iteration = 0;
   
    do
    {
        Propagate();
        for(int i = 0; i < (IVector)Network.GetOutputVector.Count; i++)
        {
            _error += Math.Pow(this.RealOutput[i] – Network.OutputVector[i], 2.0);
        }
        BackPropagate(_error);
        PropagateSetWeights();
        ++_iteration;
    }while(_error <= treshold || _iteration < max_iteration);
}

A többi elég magától értetődő kódocska tele sok sok hibával hála a jó istennek legalább jó munkát nem mutatok a külvilágnak így mire kijavítás megtörténne mindenki feladja de az elv látható ami alapján el lehet indulni. Aránylag gyors is de lehet rajta optimalizálni túl sok függvényhívás például le lehet cserélni delegáltakra és nincs függvényhívás…

Reklámok