2010-03-10 23 views
6

He red neuronal xor entrenado en Matlab y conseguido estos pesos:red neuronal en MATLAB

iw: [-2.162 2.1706; 2.1565 -2.1688] 

lw: [-3.9174 -3.9183] 

b{1} [2.001; 2.0033] 

b{2} [3.8093] 

Sólo por curiosidad he tratado de escribir código de MATLAB que calcula la salida de esta red (2 neuronas en la capa oculta y 1 en salida, función de activación TANSIG).

Código

que llegué:

l1w = [-2.162 2.1706; 2.1565 -2.1688]; 
l2w = [-3.9174 -3.9183]; 
b1w = [2.001 2.0033]; 
b2w = [3.8093]; 

input = [1, 0]; 

out1 = tansig (input(1)*l1w(1,1) + input(2)*l1w(1,2) + b1w(1)); 
out2 = tansig (input(1)*l1w(2,1) + input(2)*l1w(2,2) + b1w(2)); 
out3 = tansig (out1*l2w(1) + out2*l2w(2) + b2w(1)) 

El problema es cuando la entrada se le dicen [1,1], se da salida a -0.9989, cuando [0,1] 0,4902. Mientras simula la red generada con salidas MATLAB de manera adecuada, son 0.00055875 y 0.99943.

¿Qué estoy haciendo mal?

+2

¿por qué no publica el código real que usó para construir y entrenar la red? – Amro

Respuesta

10

Escribí un ejemplo simple de una red XOR. Usé newpr, que por defecto tiene la función de transferencia tansig para capas ocultas y de salida.

input = [0 0 1 1; 0 1 0 1];    %# each column is an input vector 
ouputActual = [0 1 1 0]; 

net = newpr(input, ouputActual, 2);  %# 1 hidden layer with 2 neurons 
net.divideFcn = '';      %# use the entire input for training 

net = init(net);       %# initialize net 
net = train(net, input, ouputActual);  %# train 
outputPredicted = sim(net, input);  %# predict 

luego verificamos el resultado calculando el resultado nosotros mismos. Lo importante para recordar es que, por defecto, las entradas/salidas son escalado a la [-1,1] rango:

scaledIn = (2*input - 1);   %# from [0,1] to [-1,1] 
for i=1:size(input,2) 
    in = scaledIn(:,i);    %# i-th input vector 
    hidden(1) = tansig(net.IW{1}(1,1)*in(1) + net.IW{1}(1,2)*in(2) + net.b{1}(1)); 
    hidden(2) = tansig(net.IW{1}(2,1)*in(1) + net.IW{1}(2,2)*in(2) + net.b{1}(2)); 
    out(i) = tansig(hidden(1)*net.LW{2,1}(1) + hidden(2)*net.LW{2,1}(2) + net.b{2}); 
end 
scaledOut = (out+1)/2;    %# from [-1,1] to [0,1] 

o más eficientemente expresado como producto de matriz en una línea:

scaledIn = (2*input - 1);   %# from [0,1] to [-1,1] 
out = tansig(net.LW{2,1} * tansig(net.IW{1}*scaledIn + repmat(net.b{1},1,size(input,2))) + repmat(net.b{2},1,size(input,2))); 
scaledOut = (1 + out)/2;   %# from [-1,1] to [0,1] 
+2

¡Esta es realmente una respuesta profunda, gracias hombre! – spacemonkey

-1

Por lo general, no utiliza un sigmoide en la capa de salida. ¿Está seguro de que debería tener el tansig en out3? ¿Y está seguro de que está mirando los pesos de la red entrenada apropiadamente? Parece que tienes una red entrenada para hacer XOR en [1,1] [1, -1] [-1,1] y [-1, -1], con +1 que significa "xor" y -1 que significa "lo mismo".

+0

Entonces, ¿cómo normaliza su salida si no usa Sigmoid en la capa de salida? Además, ¿cómo se mide el error si su salida no está normalizada? – Kiril

+0

Para un clasificador, eliges la salida con el valor más alto (o alternas en el punto del 50%) para tomar una decisión. No necesitas la no linealidad. En este caso, es recomendable hacerlo, pero realmente no agrega mucho. –

+1

el problema de usar una función lineal en la capa de salida se vuelve aparente cuando se quiere obtener probabilidades posteriores de cada clase además de las clasificaciones .. – Amro

Cuestiones relacionadas