una tutorial redes neuronales neuronal learning implementacion imagenes espaƱol convolucionales convolucional clasificador machine-learning neural-network time-series aforge supervised-learning

machine learning - tutorial - Crear red neuronal para entradas no encontradas



redes neuronales convolucionales (1)

Como dijo @runDOSrun, su modelo parece estar sobreajustando los datos (de entrenamiento). Para evitar este problema, puede dividir su conjunto (serie de tiempo) en 3 partes.

Conjunto de entrenamiento

El primero podría ser el conjunto de capacitación donde simplemente entrenas tu red.

Conjunto de validación

El segundo es el conjunto de validación, donde para cada época de entrenamiento, prueba la red neuronal en el conjunto de validación y toma el error y almacena este error en una variable y una copia de la red neuronal (clon). En la próxima época, debe probar la red neuronal (modificada) y si el nuevo error en el conjunto de validación es menor que el último que ha probado, puede almacenar una nueva "red neuronal de validación". Te proporcionará una red neuronal que se generalizará mejor en un conjunto que no es el conjunto de entrenamiento. Así que evitas sobreabastecer el conjunto de entrenamiento.

Al final del entrenamiento tienes dos redes neuronales. La red neuronal de entrenamiento que es la mejor red neuronal para el conjunto de entrenamiento y la red neuronal de validación , que puede proporcionarle una red neuronal que generaliza mejor fuera del conjunto de entrenamiento.

Equipo de prueba

Esta última parte, simplemente prueba su modelo en un conjunto invisible y verifica los errores. El conjunto de pruebas propuesto es verificar el comportamiento de la red neuronal en la prueba no vista. Una prueba real.

En general, puede deslizar todo el conjunto en 3 partes iguales, o para muestra

  • 60% para entrenamiento
  • 20% para validación
  • 20% para la prueba

Para la muestra, mira la imagen abajo:

Una muestra de pseudocódigo de cómo implementarlo podría ser:

int epochs = 1; double error = 0; double validationError = 10000; object validationNetwork; do { // train your network error = getError(trainingSet); //validation part... var currentValidationError = getError(validationSet); if (currentValidationError < validationError) { validationError = currentValidationError; validationNeuralNetwork = neuralNetwork.Clone(); } } while (epochs < 2000 && error < 0.001);

Validación cruzada para series de tiempo

Por otro lado, también podrías intentar hacer la valdidación cruzada para series de tiempo. Primero, divide el conjunto en 6 partes (o más) y forma redes neuronales para validar el modelo de esta manera:

  • 1: entrenamiento [ 1 ], validar [2], prueba [3]
  • 2: entrenamiento [2], validar [3], prueba [4]
  • 3: entrenamiento [3], validar [4], prueba [5]
  • 4: entrenamiento [4], validar [5], prueba [6]

Podrías dividir en más partes si quieres.

Estoy creando una red neuronal de feed forward simple de varias capas usando la biblioteca AFN.net NN. My NN es una red de activación de 3 niveles capacitada con enfoque de aprendizaje supervisado que utiliza el algoritmo de aprendizaje de retroalimentación.

Los siguientes son mis ajustes iniciales:

//learning rate learningRate=0.1; //momentum value momentum=0; //alpha value for bipolar sigmoid activation function sigmoidAlphaValue=2.0; //number of inputs to network inputSize=5; //number of outputs from network predictionSize=1; //iterations iterations=10000; // create multi-layer neural network ActivationNetwork network = new ActivationNetwork(new BipolarSigmoidFunction (sigmoidAlphaValue), 5, 5 + 1, 3, 1); //5 inputs //6 neurons in input layer //3 neurons in hidden layer //1 neuron in output layer // create teacher BackPropagationLearning teacher = new BackPropagationLearning(network); // set learning rate and momentum teacher.LearningRate = learningRate; teacher.Momentum = momentum;

Ahora tengo algunas series de entrada que se parecen a esto, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

Usando el método deslizante de la ventana (como se describe aquí ) para la entrada como una serie temporal, mi entrada y

matriz de salida esperada se ve algo como esto

//Iteration #1 double input[][] = new input[0][5] {1,2,3,4,5}; double output[][] = new output[0][0] {6}; //Iteration #2 double input[][] = new input[1][5] {2,3,4,5,6}; double output[][] = new output[1][0] {7}; //Iteration #3 double input[][] = new input[2][5] {3,4,5,6,7}; double output[][] = new output[2][0] {8}; . . . //Iteration #n double input[][] = new input[n][5] {15,16,17,18,19}; double output[][] = new output[n][0] {20};

Después de 10k iteraciones como tal usando

teacher.RunEpoch(input, output);

mi red está entrenada con éxito para el conjunto de entrenamiento dado. Así que ahora, si calculo usando entradas como 4,5,6,7,8 ¡la red da con éxito 9 como una respuesta fantástica!

Sin embargo, cuando la entrada se proporciona como 21,22,23,24,25 ¡el NN no produce 26!

Mi pregunta: ¿Cómo capacito a mi red para que acepte tales entradas no encontradas de tal manera que produzcan un patrón de secuencia correcto como el que se encuentra en el conjunto de capacitación durante el aprendizaje?