xlabel - Matlab-Entrenamiento de redes neuronales
tag plot matlab (4)
Esto es normal. Su capa de salida está utilizando una función de transferencia logarítmica-logarítmica, y eso siempre le dará una salida intermedia entre 0 y 1.
Lo que normalmente haría sería buscar el resultado con el mayor valor, en otras palabras, el carácter más probable.
Esto significa que, para cada columna en y2
, está buscando el índice de la fila que contiene el valor más grande en esa fila. Puede calcular esto de la siguiente manera:
[dummy, I]=max(y2);
I
es entonces un vector que contiene los índices del valor más grande en cada fila.
Estoy trabajando en la creación de una red neuronal de 2 capas con retro-propagación. Se supone que NN obtiene sus datos de un vector 20001x17 que contiene la siguiente información en cada fila:
-Las primeras 16 celdas contienen números enteros que van de 0 a 15, que actúan como variables para ayudarnos a determinar cuál de las 26 letras del alfabeto queremos expresar al ver esas variables. Por ejemplo, una serie de 16 valores de la siguiente manera representa la letra A: [2 8 4 5 2 7 5 3 1 6 0 8 2 7 2 7].
-La celda 17 contiene un número que va del 1 al 26 que representa la letra del alfabeto que queremos. 1 significa A, 2 significa B, etc.
La capa de salida del NN consta de 26 salidas. Cada vez que se alimenta al NN con una entrada como la descrita anteriormente, se supone que debe generar un vector de 1x26 que contenga ceros en todas las celdas, excepto en la que corresponde a la letra que los valores de entrada deben representar. por ejemplo, la salida [1 0 0 ... 0] sería la letra A, mientras que [0 0 0 ... 1] sería la letra Z.
Algunas cosas que son importantes antes de presentar el código: Necesito usar la función traingdm y el número de capa oculta está arreglado (por ahora) en 21.
Tratando de crear el concepto anterior, escribí el siguiente código de matlab:
%%%%%%%%
%Start of code%
%%%%%%%%
%
%Initialize the input and target vectors
%
p = zeros(16,20001);
t = zeros(26,20001);
%
%Fill the input and training vectors from the dataset provided
%
for i=2:20001
for k=1:16
p(k,i-1) = data(i,k);
end
t(data(i,17),i-1) = 1;
end
net = newff(minmax(p),[21 26],{''logsig'' ''logsig''},''traingdm'');
y1 = sim(net,p);
net.trainParam.epochs = 200;
net.trainParam.show = 1;
net.trainParam.goal = 0.1;
net.trainParam.lr = 0.8;
net.trainParam.mc = 0.2;
net.divideFcn = ''dividerand'';
net.divideParam.trainRatio = 0.7;
net.divideParam.testRatio = 0.2;
net.divideParam.valRatio = 0.1;
%[pn,ps] = mapminmax(p);
%[tn,ts] = mapminmax(t);
net = init(net);
[net,tr] = train(net,p,t);
y2 = sim(net,pn);
%%%%%%%%
%End of code%
%%%%%%%%
Ahora a mi problema: quiero que mis salidas sean como las descritas, es decir, cada columna del vector y2, por ejemplo, debe ser una representación de una letra. Mi código no hace eso sin embargo. En cambio, produjo resultados que varían mucho entre 0 y 1, valores de 0.1 a 0.9.
Mi pregunta es: ¿hay alguna conversión que deba hacer que yo no haga? Es decir, ¿tengo que convertir mi entrada y / o salida de datos a un formulario por el cual realmente puedo ver si mi NN está aprendiendo correctamente?
Cualquier entrada sería apreciada.
Puede pensar en y2 como una distribución de probabilidad de salida para cada entrada que sea uno de los 26 caracteres del alfabeto, por ejemplo, si una columna de y2 dice:
.2
.5
.15
.15
entonces tiene un 50% de probabilidad de que este personaje sea B (si suponemos solo 4 salidas posibles).
== OBSERVACIÓN ==
La capa de salida del NN consta de 26 salidas. Cada vez que se alimenta al NN con una entrada como la descrita anteriormente, se supone que debe generar un vector de 1x26 que contenga ceros en todas las celdas, excepto en la que corresponde a la letra que los valores de entrada deben representar. por ejemplo, la salida [1 0 0 ... 0] sería la letra A, mientras que [0 0 0 ... 1] sería la letra Z.
Es preferible evitar el uso de valores objetivo de 0,1 para codificar la salida de la red.
La razón para evitar los valores objetivo de 0 y 1 es que la función de transferencia sigmoidea ''logsig'' no puede producir estos valores de salida dados los pesos finitos. Si intenta entrenar a la red para que se ajuste a los valores objetivo de exactamente 0 y 1, el descenso de gradiente obligará a los pesos a crecer sin límite.
Entonces, en lugar de los valores 0 y 1, intente usar valores de 0.04 y 0.9 por ejemplo, de modo que [0.9.0.04, ..., 0.04] sea el vector de salida objetivo para la letra A.
Referencia:
Thomas M. Mitchell, Machine Learning, McGraw-Hill Higher Education, 1997, p114-115
- Use
hardlin fcn
en la capa de salida.- Use
trainlm
otrainrp
para entrenar la red. - Para conocer su red, use un bucle for y una condición que compare la salida y el objetivo. Cuando sea el mejor uso, corte para salir del ciclo de aprendizaje.
- Use otra forma en lugar de
mapminmax
para preprocesar el conjunto de datos.
- Use
No sé si esto constituye una respuesta real o no: pero aquí hay algunos comentarios.
- No entiendo tu esquema de codificación. ¿Cómo se representa una ''A'' como ese conjunto de números? Parece que estás cayendo en una trampa bastante común de usar números arbitrarios para codificar valores categóricos. No hagas esto: por ejemplo, si ''a'' es 1, ''b'' es 2 y ''c'' es 3, entonces tu codificación ha establecido implícitamente que ''a'' es más como ''b'' que ''c'' (porque el la red tiene entradas de valor real, las propiedades ordinales son importantes). La forma de hacerlo correctamente es tener cada letra representada como 26 entradas con valores binarios, donde solo una está activa, representando la letra.
- Sus resultados son correctos, la activación en la capa de salida nunca será 0 o 1, sino números reales. Puede tomar el máximo como su función de actividad, pero esto es problemático porque no es diferenciable, por lo que no puede usar el back-prop. Lo que debe hacer es acoplar las salidas con la función softmax , de modo que su suma sea una. Luego puede tratar las salidas como probabilidades condicionales dadas las entradas, si así lo desea. Si bien la red no es explícitamente probabilística, con la actividad correcta y las funciones de activación será idéntica en estructura a un modelo logarítmico lineal (posiblemente con variables latentes correspondientes a la capa oculta), y la gente lo hace todo el tiempo.
Vea el libro de texto de David Mackay para una buena introducción a las redes neuronales que dejará en claro la conexión probabilística. Eche un vistazo a este artículo del grupo de Geoff Hinton que describe la tarea de predecir el siguiente personaje dado el contexto para detalles sobre la representación correcta y las funciones de activación / actividad (aunque tenga en cuenta que su método no es trivial y utiliza una red recurrente con un método de entrenamiento).