Sunteți pe pagina 1din 5

C:\Users\jmallqui.NTCIP\Google Drive\201601\IA\proyecto\RedNeuronalUPC\RedNeuronalUPC\RedBackpropagation.

cs
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;

namespace RedNeuronalUPC
{
#region Transferencia de funciones y capa de derivadas
public enum TransferFunction
{
None,
Sigmoid
}

public static class TransferFunctions


{
public static double Evaluar(TransferFunction tFunc, double input)
{
switch (tFunc)
{
case TransferFunction.Sigmoid:
return sigmoid(input);
case TransferFunction.None:
default:
return 0.0;
}
{

public static double EvaluarDerivada(TransferFunction tFunc, double input)


switch (tFunc)
{
case TransferFunction.Sigmoid:
return sigmoid_derivado(input);
case TransferFunction.None:
default:
return 0.0;
}

/* definicion de transferfunctions
{
}
{
}

*/

public static double sigmoid(double x)


return 1.0 / (1.0 + Math.Exp(-x));

public static double sigmoid_derivado(double x)


return sigmoid(x) * (1 - sigmoid(x));

#endregion
public class RedBackpropagation
{
#region Constructor
public RedBackpropagation(int[] layersizes, TransferFunction[] transferFunctions)
{
/* validando datos */

if (transferFunctions.Length != layersizes.Length || transferFunctions[0] != TransferFunction.None)


throw new ArgumentException("No se puede iniciar la clase de red de backpropagation!!");
/*Inicalizando las capas de la red*/

C:\Users\jmallqui.NTCIP\Google Drive\201601\IA\proyecto\RedNeuronalUPC\RedNeuronalUPC\RedBackpropagation.cs
layercount = layersizes.Length - 1;
inputsize = layersizes[0];
layersize= new int[layercount];

for (int i = 0; i < layercount; i++)


layersize[i]=layersizes[i+1];

transferFunction = new TransferFunction[layercount];


for (int i = 0; i < layercount; i++)
transferFunction[i] = transferFunctions[i + 1];
//inicializando los arreglos

bias = new double[layercount][];


previousBiasDelta = new double[layercount][];
delta = new double[layercount][];
layerinput = new double[layercount][];
layeroutput = new double[layercount][];

weight = new double[layercount][][];


previousWeightDelta = new double[layercount][][];

//llenado los arreglos de 2 dimensiones


for (int i = 0; i < layercount; i++)
{
bias[i] = new double [layersize[i]];
previousBiasDelta[i] = new double[layersize[i]];
delta[i] = new double[layersize[i]];
layerinput[i] = new double[layersize[i]];
layeroutput[i] = new double[layersize[i]];

weight[i]=new double[i==0 ? inputsize : layersize[i-1]][];


previousWeightDelta[i] = new double[i == 0 ? inputsize : layersize[i - 1]][];
for (int j = 0; j < (i == 0 ? inputsize : layersize[i - 1]); j++)
{
weight[i][j]=new double[layersize[i]];
previousWeightDelta[i][j] = new double[layersize[i]];

//Inicializando los pesos


for (int l = 0; l < layercount; l++)
{

for (int j = 0; j < layersize[l]; j++)


{
bias[l][j] = Gaussian.GetRandomGaussian();
previousBiasDelta[l][j]=0.0;
layerinput[l][j] = 0.0;
layeroutput[l][j] = 0.0;
delta[l][j] = 0.0;
}

for (int i = 0; i < (l == 0 ? inputsize : layersize[l - 1]); i++)


{
for (int j = 0; j < layersize[l]; j++)
{
weight[l][i][j]=Gaussian.GetRandomGaussian();
previousWeightDelta[l][i][j]=0.0;
}
}

C:\Users\jmallqui.NTCIP\Google Drive\201601\IA\proyecto\RedNeuronalUPC\RedNeuronalUPC\RedBackpropagation.cs
#endregion

#region Metodos

public void Run(ref double[] input, out double[] output) {

//
if (input.Length != inputsize)
throw new ArgumentException("Datos de entrada no tiene la correcta diemensin");
//dimesion
output = new double[layersize[layercount-1]];
/* ejecutando la red*/

for (int l=0; l<layercount;l++)


{
for(int j=0; j<layersize[l];j++)
{
double sum=0.0;
for (int i=0;i<(l==0? inputsize : layersize[l-1]);i++)
{
sum += weight[l][i][j]*(l==0 ? input[i] : layeroutput[l-1][i] );
}
sum += bias[l][j];
layerinput[l][j]= sum;

layeroutput[l][j]= TransferFunctions.Evaluar(transferFunction[l],sum );

// Copiar output

for (int i=0;i<layersize[layercount-1];i++)


output[i]=layeroutput[layercount-1][i];
}

public double Train(ref double[] input, ref double[] desired, double TrainingRate, double Momentum)
{
if (input.Length != inputsize)
throw new ArgumentException("Parametros de entrada invalidos","input");
if (desired.Length != layersize[layercount-1])
throw new ArgumentException("Parametros de entrada invalidos", "desired");
//variable locales
double error = 0.0, sum = 0.0, weghtDelta = 0.0, biasDelta = 0.0;
double[] output = new double[layersize[layercount - 1]];
// ejecutar la red
Run(ref input, out output);
// Backpropagation error
for (int l = layercount
{
//capa de salida
if (l == layercount
{
for (int k = 0;
{
delta[l][k]

- 1; l >= 0; l--)
- 1)

k < layersize[l]; k++)

= output[k] - desired[k];

C:\Users\jmallqui.NTCIP\Google Drive\201601\IA\proyecto\RedNeuronalUPC\RedNeuronalUPC\RedBackpropagation.cs

error += Math.Pow(delta[l][k], 2);


delta[l][k] *= TransferFunctions.EvaluarDerivada(transferFunction[l], layerinput[l][k]);

}
}
else // Capa oculta
{
for (int i = 0; i < layersize[l]; i++)
{
sum = 0.0;
for (int j = 0; j < layersize[l+1]; j++)
{
sum += weight[l + 1][i][j] * delta[l][j];
}
sum *= TransferFunctions.EvaluarDerivada(transferFunction[l], layerinput[l][i]);
delta[l][i] = sum;
}
}

// actualiza pesos u bias

for (int l=0;l<layercount;l++)


for(int i=0;i<(l==0?inputsize:layersize[l-1]);i++)
for (int j = 0; j < layersize[l]; j++)
{
weghtDelta = TrainingRate * delta[l][j] * (l == 0 ? input[i] : layeroutput[l - 1][i]);
weight[l][i][j] -= weghtDelta + Momentum * previousWeightDelta[l][i][j];
previousWeightDelta[l][i][j] = weghtDelta;
}
for (int l = 0; l < layercount; l++)
for (int i = 0; i < layersize[l]; i++)
{
biasDelta=TrainingRate* delta[l][i];
bias[l][i] -= biasDelta + Momentum * previousBiasDelta[l][i];
previousBiasDelta[l][i] = biasDelta;
}

return error;

#endregion
#region
private
private
private
private
private
private
private
private
private

Variables privadas
int layercount;
int inputsize;
int[] layersize;
TransferFunction[] transferFunction;
double[][]
double[][]
double[][]
double[][]
double[][]

layerinput;
layeroutput;
bias;
delta;
previousBiasDelta;

private double[][][] weight;


private double[][][] previousWeightDelta;
}

#endregion

public static class Gaussian


{
private static Random gen = new Random();

C:\Users\jmallqui.NTCIP\Google Drive\201601\IA\proyecto\RedNeuronalUPC\RedNeuronalUPC\RedBackpropagation.cs
public static double GetRandomGaussian()
{
}

return GetRandomGaussian(0.0,1.0);

public static double GetRandomGaussian(double mean, double stddev)


{
double rVal1, rVal2;
GetRandomGaussian(mean, stddev, out rVal1, out rVal2);
return rVal1;
}
public static
{
double u,
do
{
u = 2
v = 2

void GetRandomGaussian(double mean, double stddev, out double val1, out double val2)
v, s, t;

* gen.NextDouble() - 1;
* gen.NextDouble() - 1;

} while (u * u + v * v > 1 || (u == 0 && v == 0));


s = u * u + v * v;
t = Math.Sqrt((-2.0*Math.Log(s))/s);
val1 = stddev * u * t + mean;
val2 = stddev * v * t + mean;

S-ar putea să vă placă și