que estoy tratando de hacer un trabajo simple red neuronal artificial con el algoritmo de retropropagación. He creado una ANN y creo que he implementado el algoritmo de BP correctamente, pero, por supuesto, puedo estar equivocado.Problema con la red neuronal artificial sencilla - la adición de
En este momento, estoy tratando de entrenar a la red, dándole dos números al azar (a, b) entre 0 y 0,5, y tener que añadir ellos. Entonces, por supuesto, cada vez que la salida de la red da se compara con la respuesta teórica de a + b (que siempre será alcanzable por la función sigmoide).
Curiosamente, la salida siempre converge a un número entre 0 y 1 (como debe ser, debido a la función sigmoide), pero los números aleatorios que estoy poniendo parecen no tener ningún efecto en él.
Edit: Lo siento, parece que no converge. Aquí es una imagen de la salida:
Los pesos se distribuyen al azar entre -1 y 1, pero también han tratado entre 0 y 1.
también probé dándole dos números constantes (0.35,0.9) y tratando de entrenar para escupir 0.5. Esto funciona y converge muy rápido a 0.5. También lo he entrenado para escupir 0.5 si le doy dos números al azar entre 0 y 1, y esto también funciona.
Si por el contrario, mi objetivo es:
vector<double> target;
target.push_back(.5);
Entonces converge muy rápidamente, incluso con entradas aleatorias:
he intentado un par de diferentes redes, ya que lo hice muy fácil de agregar capas a mi red. El estándar que estoy usando es uno con dos entradas, una capa de 2 neuronas y una segunda capa de una sola neurona (la neurona de salida). Sin embargo, también he intentado agregar algunas capas y agregarles neuronas. No parece cambiar nada. Mi índice de aprendizaje es igual a 1.0, aunque lo intenté igual a 0.5 y no fue muy diferente.
¿Alguien tiene alguna idea de lo que podría intentar?
¿Es esto algo que una RNA es capaz de hacer? No me puedo imaginar que no lo sería, ya que pueden ser entrenados para hacer cosas tan complicadas.
¿Algún consejo? ¡Gracias!
Aquí es donde entreno que:
//Initialize it. This will be one with 2 layers, the first having 2 Neurons and the second (output layer) having 1.
vector<int> networkSize;
networkSize.push_back(2);
networkSize.push_back(1);
NeuralNetwork myNet(networkSize,2);
for(int i = 0; i<5000; i++){
double a = randSmallNum();
double b = randSmallNum();
cout << "\n\n\nInputs: " << a << ", " << b << " with expected target: " << a + b;
vector<double> myInput;
myInput.push_back(a);
myInput.push_back(b);
vector<double> target;
target.push_back(a + b);
cout << endl << "Iteration " << i;
vector<double> output = myNet.backPropagate(myInput,target);
cout << "Output gotten: " << output[0];
resultPlot << i << "\t" << abs(output[0] - target[0]) << endl;
}
Edición: He definido mi red y he estado siguiendo de esta guía: A pdf. Implementé "Worked example 3.1" y obtuve los mismos resultados exactos que obtuvieron, así que creo que mi implementación es correcta, al menos en lo que respecta a la suya.
Dado que una red neuronal se basa en las neuronas conectadas y cada neurona es una víbora en sí con ponderada insumos, creo que el objetivo al que intenta llegar es algo erróneo. Entonces, para agregar dos números, los pesos de la red deben establecerse en "1" y la salida solo puede estar entre 0 o 1 cuando se usa una función sigmoidea estándar. –