Witam
Napisałem sobie sieć neuronową, i teraz stoję przed problemem dodania do niej kolejnej funkcjonalności. Nie wiem które z rozwiązań było by lepsze. Chodzi o to aby można były usuwać połączenia miedzy warstwami oraz wybrane neurony.
Obliczanie wyjść oraz błędów polega na mnożeniu wektor razy wektor.
Mam dwa pomysły żeby to rozwiązać:
- Dodać do mnożenia kolejny wektor który będzie zawierał 0 lub 1, 0 by usuwało połączenie 1 pozostawało by dalej aktywne.
- Zrobić tablice dla każdego neuron zawierającą które połączenie nie istnieje.
Tak wygląda pętla obliczająca wyjścia
private void ComputeOutputs(double[] inputs)
{
int biasIndex;
for (int k = 0; k < network.Length; k++)
{
for (int i = 0; i < network[k].Length; i++)
{
biasIndex = network[k][i].Length - 1;
activationResults[k][i] = 0.0;
for (int j = 0; j < network[k][i].Length; j++)
{
if (j == biasIndex)
{
activationResults[k][i] += network[k][i][j] * bias;
}
else
{
if (k == 0)
{
activationResults[k][i] += network[k][i][j] * inputs[j];
}
else
{
activationResults[k][i] += network[k][i][j] * activationResults[k - 1][j];
}
}
}
activationResults[k][i] = network[k][i].Activate(activationResults[k][i]);
}
}
}
Klasa neuron
class Neuron
{
private IActivatable activator;
private double[] weights;
public Neuron(IActivatable activator, int weightCount)
{
this.activator = activator;
weights = new double[weightCount];
}
public double Activate(double net)
{
return activator.Activate(net);
}
public double ComputeDerivative(double value)
{
return activator.ComputeDerivative(value);
}
public double this[int i]
{
get { return weights[i]; }
set { weights[i] = value; }
}
public int Length
{
get { return weights.Length; }
}
}
Tutaj modyfikacja o której pisze w punkcje 1
class Neuron
{
private IActivatable activator;
private double[] weights;
private double[] connectionExists; //tutaj modyfikacja
public Neuron(IActivatable activator, int weightCount)
{
this.activator = activator;
weights = new double[weightCount];
}
public double Activate(double net)
{
return activator.Activate(net);
}
public double ComputeDerivative(double value)
{
return activator.ComputeDerivative(value);
}
public double this[int i]
{
get { return weights[i] * connectionExists[i]; } // tutaj modyfikacja
set { weights[i] = value; }
}
public int Length
{
get { return weights.Length; }
}
}