una tutorial redes neuronales neuronal implementacion guardar gradiente descendente con machine-learning neural-network approximation

machine learning - tutorial - Función de aproximación con red neuronal



redes neuronales tensorflow (4)

Cuando entrena la red, debe normalizar el objetivo (la función sin) en el rango [0,1], luego puede mantener la función de transferencia sigmoide.

sin(x) in [-1,1] => 0.5*(sin(x)+1) in [0,1] Train data: input target target_normalized ------------------------------------ 0 0 0.5 pi/4 0.70711 0.85355 pi/2 1 1 ...

Tenga en cuenta que mapeamos el objetivo antes del entrenamiento. Una vez que entrena y simula la red, puede volver a asignar la salida de la red.

El siguiente es un código MATLAB para ilustrar:

%% input and target input = linspace(0,4*pi,200); target = sin(input) + 0.2*randn(size(input)); % mapping [targetMinMax,mapping] = mapminmax(target,0,1); %% create network (one hidden layer with 6 nodes) net = newfit(input, targetMinMax, [6], {''tansig'' ''tansig''}); net.trainParam.epochs = 50; view(net) %% training net = init(net); % init [net,tr] = train(net, input, targetMinMax); % train output = sim(net, input); % predict %% view prediction plot(input, mapminmax(''reverse'', output, mapping), ''r'', ''linewidth'',2), hold on plot(input, target, ''o'') plot(input, sin(input), ''g'') hold off legend({''predicted'' ''target'' ''sin()''})

Estoy tratando de aproximarme a la función seno () usando una red neuronal que escribí yo mismo. Ya he probado mi red neuronal en un problema simple de OCR y funcionó, pero tengo problemas para aplicarlo al seno (). Mi problema es que durante el entrenamiento mi error converge en exactamente el 50%, así que supongo que es completamente aleatorio.

Estoy usando una neurona de entrada para la entrada (0 a PI) y una neurona de salida para el resultado. Tengo una sola capa oculta en la que puedo variar el número de neuronas, pero actualmente estoy probando alrededor de 6-10.

Tengo la sensación de que el problema se debe a que estoy usando la función de transferencia sigmoidea (que es un requisito en mi aplicación) que solo genera entre 0 y 1, mientras que la salida para sine () está entre -1 y 1. Para intentar corregir esto intenté multiplicar la salida por 2 y luego restar 1, pero esto no solucionó el problema. Estoy pensando que tengo que hacer algún tipo de conversión en algún lugar para hacer que esto funcione.

¿Algunas ideas?


Me sale el mismo comportamiento si uso descenso de gradiente de vainilla. Intenta usar un algoritmo de entrenamiento diferente.

En lo que respecta al applet de Java, noté algo interesante: converge si uso un "sigmoide bipolar" y comienzo con algunas ponderaciones no aleatorias (como los resultados de un entrenamiento previo con una función cuadrática).


No hay razón para que su red no funcione, aunque 6 está definitivamente en el lado bajo para aproximarse a una onda sinusoidal. Probaría al menos 10 tal vez incluso 20.

Si eso no funciona, entonces creo que necesitas dar más detalles sobre tu sistema. es decir, el algoritmo de aprendizaje (¿propagación hacia atrás?), la velocidad de aprendizaje, etc.


Utilice una unidad de salida lineal .

Aquí hay un ejemplo simple usando R :

set.seed(1405) x <- sort(10*runif(50)) y <- sin(x) + 0.2*rnorm(x) library(nnet) nn <- nnet(x, y, size=6, maxit=40, linout=TRUE) plot(x, y) plot(sin, 0, 10, add=TRUE) x1 <- seq(0, 10, by=0.1) lines(x1, predict(nn, data.frame(x=x1)), col="green")