2009-10-14 13 views
18

Estoy tratando de aproximar la función sine() utilizando una red neuronal que yo mismo escribí. He probado mi red neuronal en un problema simple de OCR y funcionó, pero estoy teniendo problemas para aplicarla a Sine() aproximado. Mi problema es que durante el entrenamiento mi error converge exactamente en el 50%, así que supongo que es completamente aleatorio.Función de aproximación con la red neuronal

Estoy utilizando 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 es porque estoy usando la función de transferencia sigmoidea (que es un requisito en mi aplicación) que solo produce entre 0 y 1, mientras que la salida para seno() está entre -1 y 1. Para tratar de corregir esto intenté multiplicar la salida por 2 y luego restando 1, pero esto no solucionó el problema. Estoy pensando que tengo que hacer algún tipo de conversión en alguna parte para que esto funcione.

¿Alguna idea?

+0

Si está interesado en ver implementaciones de investigación de la aproximación basada en NN, consulte mi [documento de encuesta sobre computación aproximada] (https://www.academia.edu/20201007/A_Survey_Of_Techniques_for_Approximate_Computing) que puede responder a su pregunta en detalle. – user984260

Respuesta

16

Utilice una unidad de salida lineal .

He aquí un ejemplo simple que utiliza 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") 

neural net prediction

+0

Por unidad de salida lineal, ¿se refiere a calcular f (net) = net para la unidad de salida? Porque lo he intentado y sigo teniendo el mismo problema. – MahlerFive

+0

Exactamente, una función lineal f (x) = a * x – rcs

+0

Detalle menor, pero su hipervínculo r-project.org no funciona sin anteponer "www". –

11

Cuando se entrena la red, se debe normalizar el objetivo (la función de pecado) para el rango [0,1], entonces puede mantener la función de transferencia sigmoidea.

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 que mapea el objetivo antes de la formación. Una vez que entrene y simule la red, puede mapear la salida de la red.


El siguiente es un código de 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()'}) 

network output

0

No hay razón su red no debería funcionar, aunque 6 es definitivamente en la parte baja de aproximándose a una onda sinusoidal Intentaría al menos 10 quizás incluso 20.

Si eso no funciona, entonces creo que necesita dar más detalles sobre su sistema. es decir, el algoritmo de aprendizaje (retro-propagación?), la tasa de aprendizaje, etc.

0

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

En lo que respecta al applet de Java, me di cuenta de algo interesante: converge si uso un "sigmoide bipolar" y empiezo con algunos pesos no aleatorios (como los resultados de un entrenamiento previo usando un Cuadrático función).

Cuestiones relacionadas