Sei sulla pagina 1di 27

%TODOS LAS FUNCIONES COMENTADAS ESTAN BASADOS EN EL CODIGO FINAL, ESTE

%CODIGO NO ES EL FINAL , PERO ES IGUAL, SOLO CAMBIADO ALGUNOS PARAMETROS


EN
%LA BINARIZACION. LO COMENTADO EN CADA FUNCION ES LA CORRECTA Y LA MISMA
%QUE EL CODIGO FINAL

clc , clear all ,close all


%Conjunto de carpetas, donde se guardarán los Fd
Carpeta1=[];
Carpeta2=[];
Carpeta3=[];
Carpeta4=[];
Carpeta5=[];
Carpeta6=[];
%%
Xcarac1=[] %Array donde se guarda la primera característica de la
imagen(Puntos de terminación)
Xcarac2=[] %Array donde se guarda la segunda característica de la
imagen(Puntos de intersección)
%%
%Se crean carpetas para llamar las imágenes automáticas
pathFolder = 'Firmas'; % Carpeta general
_____
pathFile = {'Segunda_firmas Falsas', %|
'Segunda_Firmas_verdaderas', %|
'Tercera_Firma Falsa_', %| Selección tipo de firma
'Tercera_Firma_verdadera'}; %|____
pathName = {'Segunda_Firmas Falsas_
(','Segunda_Firma_
(','Tercera_Firma Falsa_
(','Tercera_Firma Falsa_
('}; %Nombre de la imagen antes
del numero
%%
%INICIA EL PROCESO DE BINARIZACION Y ENFOQUE CORRECTO DE LA FIRMA

for kko=1:6 %Indica el numero donde están distribuido las imágenes


%kko=1 =>Primera carpeta llamada Primera_Firmas_Falsas
%kko=2 =>Primera carpeta llamada Primeras_Firmas_Verdaderas
%kko=3 =>Primera carpeta llamada Segunda_Firmas_Falsas
%kko=4 =>Primera carpeta llamada Segunda_firmas_verdaderas
%kko=5 =>Primera carpeta llamada Tercera_Firma _verdadera
%kko=6 =>Primera carpeta llamada Tercera_Firma_falsa
for ii=1:150 %Nos indica que imagen se tomara 1 al 150
close all

pathImg=strcat(pathFolder,'\',char(pathFile(kko)),'\',char(pathName(kko))
,num2str(ii),').jpg') %Concateno todo para tener la dirección de las
imágenes
Iyo=imread(pathImg); %Leo la imagen de acuerdo a la dirección asignada y
la guardo en Iyo
imshow(Iyo) %Vizualizo la imagen
Iy=imfilter(Iyo,fspecial('gaussian')); %Aplico un filtro para reducir los
bordes defectuosos generados por la iluminación de la imagen
Igrises=(255-Iy(:,:,1))*1.48; %La imagen filtrada , solo utilizo la capa
roja a la cual le multiplico un factor para que varíe la intensidad menor
sea mas oscuro se vizualira. Luego restarle 255, lo que significa que
invierto la imagen
I2=im2bw(Igrises); %A la imagen en escala de grises aplico la
binarizacion, en la cual se guarda en I2
Prop=regionprops(I2); %A la imagen binarizada le aplico la función
RegionProps para obtener el área, centroide y las coordenas de los
objetos detectados

%%
%Analizo en que carpeta me encuentro, para las imagenes de la primera
%carpeta busco las áreas comprendidas entre 5000 y 30000, el área
%encontrada significa el borde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.
if kko==1
encontrar=find([Prop.Area]>8000 & [Prop.Area]<30000);
if isempty(encontrar)==1

continue
end

end
%%
%Analizo en que carpeta me encuentro, para las imágenes de la segunda
%carpeta busco las áreas comprendidas entre 10000 y 20000, el área
%encontrada significa el borde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.
if kko==2
encontrar=find([Prop.Area]>10000 & [Prop.Area]<20000);
if isempty(encontrar)==1

continue
end
end
%%
%Analizo en que carpeta me encuentro, para las imagenes de la tercera
%carpeta busco las areas comprendidas entre 10000 y 40000, el area
%encontrada significa elborde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.
if kko==3
encontrar=find([Prop.Area]>10000 & [Prop.Area]<40000);
if isempty(encontrar)==1

continue
end
end
%%
%Analizo en que carpeta me encuentro, para las imagenes de la cuarta
%carpeta busco las areas comprendidas entre 13500 y 30000, el area
%encontrada significa elborde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.
if kko==4
encontrar=find([Prop.Area]>13500 & [Prop.Area]<30000);

if isempty(encontrar)==1

continue
end

end
%%
%Analizo en que carpeta me encuentro, para las imagenes de la quinta
%carpeta busco las areas comprendidas entre 7000 y 12000, el area
%encontrada significa elborde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.

if kko==5
encontrar=find([Prop.Area]>7000 & [Prop.Area]<12000);
if isempty(encontrar)==1

continue
end

end
%%
%Analizo en que carpeta me encuentro, para las imagenes de la sexta
%carpeta busco las areas comprendidas entre 8000 y 20000, el area
%encontrada significa elborde de la firma. En el caso de que no
encuentre,
%para la iteracion principal y sigue a la siguiente foto.
if kko==6
encontrar=find([Prop.Area]>8000 & [Prop.Area]<20000);
if isempty(encontrar)==1

continue
end
end
%%

punto1=Prop(encontrar).BoundingBox; %%La posición donde a encontrado esa


área especifica, voy a obtener las coordenadas del borde de la
firma.Atravez del boundiringBox
NuevaImagen=imcrop(I2,[punto1]); %% Aquí enfoco con las coordenadas
encontradas
MejoraDeImagen=imfilter(NuevaImagen,fspecial('gaussian')); %%Aplico el
mismo filtro para eliminar algun ruido
I=bwareaopen(NuevaImagen,160); %En el caso de que se enfoque ruido, esta
función la eliminara de acuerdo al conjunto de pixeles asignado 160
figure()
imshow(I) %Visualizo la imagen enfocada

%FINALIZA LA ETAPA DE BINARIZACION Y ENFOQUE CORRECTO DE LA FIRMA


%% Los objetos deben estar compuestos de pixeles blancos
%AQUI INICIA EL PROCESO DE ESQUELETIZACION
I=im2double(I); %% I = imagen original
[H,W]=size(I); %% altura, anchura de la imagen
J=I; %% J = esqueleto de la imagen
K=I; %% K = esqueleto de la imagen
B=0; %% B = número de vecinos mayor que cero 64
A=0; %% A = patrones 0-1
CHANGE=100; %% número de pixeles modificados durante la iteración
P=zeros(8); %% arreglo para contener los valores de los 8
vecinos de un pixel dado
figure(2),imshow(I)

% LOOP PRINCIPAL - ITERAR HASTA QUE NO HAYA PIXELES MODIFICADOS %%


while (CHANGE ~= 0)
% Resetear # de cambios
CHANGE =0;
% PRIMERA SUB-ITERACIÓN %%

for r=2:H-1 %% fila


for c=2:W-1 %% columna

if(J(r,c)==1)

% encontrar los 8 vecinos del pixel %%


P(9) = J(r-1,c-1); P(2) = J(r-1,c); P(3) = J(r-1,c+1);
P(8) = J(r,c-1); P(4) = J(r,c+1);
P(7) = J(r+1,c-1); P(6) = J(r+1,c); P(5) = J(r+1,c+1);

% calcular B %%
B = P(2)+P(3)+P(4)+P(5)+P(6)+P(7)+P(8)+P(9);

% calcular A %%
A=0;
if ( P(2)==0 & P(3)==1 )A=A+1; end
if ( P(3)==0 & P(4)==1 )A=A+1; end
if ( P(4)==0 & P(5)==1 )A=A+1; end
if ( P(5)==0 & P(6)==1 )A=A+1; end
if ( P(6)==0 & P(7)==1 )A=A+1; end
if ( P(7)==0 & P(8)==1 )A=A+1; end
if ( P(8)==0 & P(9)==1 )A=A+1; end
if ( P(9)==0 & P(2)==1 )A=A+1; end

% DECIDIR SI EL PIXEL DEBE SER BORRADO %%


if( (B>=2) & (B<=6) & (A==1) & (P(2)*P(4)*P(6)==0)
&(P(4)*P(6)*P(8)==0) )
K(r,c)=0;

CHANGE=CHANGE+1;
end
end
end
end
% SEGUNDA SUB-ITERACIÓN %%Modbus over serial line - RTU Slave Arduino
Sketch
J=K;
for r=2:H-1 %% fila
for c=2:W-1 %% columna
if(J(r,c)==1)
%% encontrar los 8 vecinos del pixel %%
P(9) = J(r-1,c-1); P(2) = J(r-1,c); P(3) = J(r-1,c+1);
P(8) = J(r,c-1); P(4) = J(r,c+1);
P(7) = J(r+1,c-1); P(6) = J(r+1,c); P(5) = J(r+1,c+1);

%% calcular B %%
B = P(2)+P(3)+P(4)+P(5)+P(6)+P(7)+P(8)+P(9);

%% calcular A %%
A=0;
if ( P(2)==0 & P(3)==1 )A=A+1; end
if ( P(3)==0 & P(4)==1 )A=A+1; end
if ( P(4)==0 & P(5)==1 )A=A+1; end
if ( P(5)==0 & P(6)==1 )A=A+1; end
if ( P(6)==0 & P(7)==1 )A=A+1; end
if ( P(7)==0 & P(8)==1 )A=A+1; end
if ( P(8)==0 & P(9)==1 )A=A+1; end
if ( P(9)==0 & P(2)==1 )A=A+1; end

%% DECIDIR SI EL PIXEL DEBE SER BORRADO %%


if( (B>=2) & (B<=6) & (A==1) & (P(2)*P(4)*P(8)==0) &(P(2)*P(6)*P(8)==0)
)
K(r,c)=0;
CHANGE=CHANGE+1;
end
end
end
end
CHANGE; %% escribir a consola # de cambios en esta iteración

J=K;
end %% FIN LOOP PRInciPAL
%AQUI TERMINA EL PROCESO DE ESQUELETIZACION: QUE COSNTA BASICAMENTE EN
%IDENTIFICAR LOS BORDES DE LA FIRMA USANDO LOS PIXELES VECINOS Y LA
MASCARA DE ENFOQUE %
%%
%INICIO DE PROCESO DE UBICACION DE LOS PUNTOS DE TERMINACION
%Bordes
figure(3),imshow(J) %VIZUALISO LA IMAGEN ESQUELETIZADA
isi=double(J)./double(max(J(:))); %A MI IMAGEN ESQUELETIZADA LE DIBIDO
CADA VALOR MAXIMO EN CADA PIXEL
kernel=[1 1 1;1 1 1; 1 1 1]; %SE CREA UNA MASCARA CON ESAS
CARACTERISTICAS , LAS CUALES SE EVALUARA 3X3 PIXELES
conv_imag=conv2(isi,kernel,'same'); %AGRUPARE EN UNA MATRIZ LOS VALORES
DE MI MASCARA Y EL RESULTADO DE isi
conv_imag2=conv_imag.*isi; %A DICHA MATRIZ LE MULTIPLICO EL VALOR DE isi
[y x]=find(conv_imag2==2); % BUSCO LOS VALORES QUE SEAN 2 Y LAS ASIGNO EN
[X Y], QUE SON LAS COORDENADAS DONDE SE ENCUENTRA MI PUNTO DE TERMINACION
coordenadas=cat(1,[x y]); %CONCATENO LAS COORDENADAS EN FILAS
numberPoints=length(x); %ATRAVEZ DE LA FUNCION LENGTH OBTENGO CUANTOS
PUNTOS SE HAN ENCONTRADO
%%
%ETAPA DE GRAFICACION DE LOS PUNTOS DE TERMINACION
for m=1:size(coordenadas,1) % DESDE 1 HASTA LA CANTIDAD DE PUNTOS QUE HA
ENCONTRADO
hold on
plot(coordenadas(m,1),coordenadas(m,2),'b*') %PLOTEO(DIBUJO) CADA
PUNTO, LLAMANDO A CADA COORDENADA Y LE ASIGNO UN COLOR AZUL
end
%%
%ETAPA DE PROCESO DE UBICACION DE LOS PUNTOS DE INTERSECCION
%Interseccion
isi1=double(J)./double(max(J(:))); %A MI IMAGEN ESQUELETIZADA LE DIBIDO
CADA VALOR MAXIMO EN CADA PIXEL
kernel=[1 1 1;1 1 1; 1 1 1]; %SE CREA UNA MASCARA CON ESAS
CARACTERISTICAS , LAS CUALES SE EVALUARA 3X3 PIXELES
conv_imag=conv2(isi1,kernel,'same'); %AGRUPARE EN UNA MATRIZ LOS VALORES
DE MI MASCARA Y EL RESULTADO DE isi1
conv_imag2=conv_imag.*isi1; %A DICHA MATRIZ LE MULTIPLICO EL VALOR DE
isi1
[y1 x1]=find(conv_imag2>4); % BUSCO LOS VALORES QUE SEAN MAYORES A 4 Y
LAS ASIGNO EN [X Y], QUE SON LAS COORDENADAS DONDE SE ENCUENTRA MI PUNTO
DE TERMINACION
coordenadas1=cat(1,[x1 y1]); %CONCATENO LAS COORDENADAS EN FILAS
numberPoints1=length(x1); %ATRAVEZ DE LA FUNCION LENGTH OBTENGO CUANTOS
PUNTOS SE HAN ENCONTRADO
%%
%ETAPA DE VIZUALISACION DE LOS PUNTOS DE INTERSECCION
for m=1:size(coordenadas1,1) % DESDE 1 HASTA LA CANTIDAD DE PUNTOS QUE HA
ENCONTRADO
hold on
plot(coordenadas1(m,1),coordenadas1(m,2),'rO')%PLOTEO(DIBUJO) CADA
PUNTO, LLAMANDO A CADA COORDENADA Y LE ASIGNO UN COLOR ROJO
end
[cA cH cV cD]=dwt2(I,'db2'); %APLICO LA FUNCION DE DOUSSCHEVIZZ(COMO SE
ESCRIBA), LA CUAL ME ENTREGA VALORES HORIZONTALES,VERTICALES Y LA
APROXIMACION EN PUNTOS A LA FIRMA
%%
%VIZUALIZO LOS VALORES ENTREGADOS POR LA FUNCION DE DOUSSCHEVIZZ
figure(4)
subplot(2,2,1);imshow(cA)
subplot(2,2,2);imshow(cH)
subplot(2,2,3);imshow(cV)
subplot(2,2,4);imshow(cD)
%%
%GUARDO LOS PUNTOS ENCONTRADOS EN MI VECTOR CARACTERIZTICA
Xcarac1=[Xcarac1 numberPoints];
Xcarac2=[Xcarac2 numberPoints1];
save('Caracteristicas.mat','Xcarac1','Xcarac2') %GUARDO MIS DATOS EN
CARACTERISTICAS.MAT
%%
%ASIGNACION DE LOS Fd A CADA CLASE
if kko==1 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES FALSA
Fd=0;
Carpeta1=[Carpeta1 Fd];
end
if kko==2 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES VERDADERA
Fd=1;
Carpeta2=[Carpeta2 Fd];
end
if kko==3 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES FALSA
Fd=0
Carpeta3=[Carpeta3 Fd]
end
if kko==4 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES VERDADERA
Fd=1;
Carpeta4=[Carpeta4 Fd];
end
if kko==5 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES VERDADERA
Fd=1;
Carpeta5=[Carpeta5 Fd];
end
if kko==6 %PARA LA PRIMERA CARPETA LE ASIGNO QUE ES FALSA
Fd=0;
Carpeta6=[Carpeta6 Fd];
end

end

end
save('Caracteristicas.mat','Xcarac1','Xcarac2')
Clasificar patrones con una red neuronal superficial
Además del ajuste de funciones, las redes neuronales también son buenas para reconocer
patrones.
Por ejemplo, suponga que desea clasificar un tumor como benigno o maligno, en función de la
uniformidad del tamaño de la célula, el grosor del grupo, la mitosis, etc. Tiene 699 casos de los
cuales tiene 9 datos y la clasificación correcta como benigno o maligno. .
Al igual que con el ajuste de funciones, hay dos formas de resolver este problema:
 Use la nprtoolGUI, como se describe en Uso de la aplicación de reconocimiento de patrones de
red neuronal .
 Use una solución de línea de comandos, como se describe en Uso de funciones de línea de
comandos .
En general, es mejor comenzar con la GUI y luego usar la GUI para generar automáticamente los
guiones de la línea de comandos. Antes de usar cualquiera de los métodos, el primer paso es
definir el problema seleccionando un conjunto de datos. La siguiente sección describe el formato
de los datos.

Definiendo un problema
A defina un problema de reconocimiento de patrones, organice un conjunto de vectores de
entrada Q como columnas en una matriz. Luego, organice otro conjunto de vectores
objetivo Q para que indiquen las clases a las que están asignados los vectores de entrada
(consulte “Estructuras de datos” para obtener una descripción detallada del formato de
datos para datos estáticos y de series de tiempo).
Cuando solo hay dos clases; establece cada valor objetivo escalar en 0 o 1, indicando a qué
clase pertenece la entrada correspondiente. Por ejemplo, puede definir el problema de
clasificación exclusiva o de dos clases de la siguiente manera:
entradas = [0 1 0 1; 0 0 1 1];
objetivos = [1 0 0 1; 0 1 1 0];

Cuando las entradas se clasifican en N clases diferentes, los vectores objetivo tienen N
elementos. Para cada vector objetivo, un elemento es 1 y los otros son 0. Por ejemplo, las
siguientes líneas muestran cómo definir un problema de clasificación que divide las
esquinas de un cubo de 5 por 5 por 5 en tres clases:
 El origen (el primer vector de entrada) en una clase
 La esquina más alejada del origen (el último vector de entrada) en una segunda clase
 Todos los demás puntos en una tercera clase.
 entradas = [0 0 0 0 5 5 5 5; 0 0 5 5 0 0 5 5; 0 5 0 5 0 5 0 5];
 objetivos = [1 0 0 0 0 0 0 0; 0 1 1 1 1 1 1 0; 0 0 0 0 0 0 0 1];

Los problemas de clasificación que involucran solo dos clases se pueden representar usando
cualquiera de los dos formatos. Los objetivos pueden consistir en elementos escalares 1/0 o
vectores de dos elementos, con un elemento que es 1 y el otro elemento que es 0.
La siguiente sección muestra cómo entrenar una red para reconocer patrones, mediante la
aplicación de reconocimiento de patrones neuronales red nprtool. Este ejemplo utiliza el
conjunto de datos de cáncer provisto con la caja de herramientas. Este conjunto de datos
consta de 699 vectores de entrada de nueve elementos y vectores de destino de dos
elementos. Hay dos elementos en cada vector objetivo, porque hay dos categorías (benignas
o malignas) asociadas con cada vector de entrada.
Uso de la aplicación de reconocimiento de patrones de red neuronal
1. Si es necesario, abra la GUI de inicio de red neuronal con este comando:
2. nnstart

3. Haga clic en la aplicación Reconocimiento de patrones para abrir la aplicación


Reconocimiento de patrones de red neuronal. (También puedes usar el
comando nprtool.)
4. Haga clic en Siguiente para continuar. Se abre la ventana Seleccionar datos.
5. Haga clic en Cargar conjunto de datos de ejemplo . Se abrirá la ventana Selector de
conjunto de datos de reconocimiento de patrones.
6. Seleccione Breast Cancer y haga clic en Importar . Regresará a la ventana
Seleccionar datos.
7. Haga clic en Siguiente para continuar con la ventana Validación y datos de prueba.

Los conjuntos de datos de validación y prueba se configuran cada uno al 15% de los
datos originales. Con estos ajustes, los vectores de entrada y los vectores de destino se
dividirán aleatoriamente en tres conjuntos de la siguiente manera:
o El 70% se utiliza para la formación.
o El 15% se usa para validar que la red se está generalizando y para detener el
entrenamiento antes del sobreajuste.
o El último 15% se utiliza como una prueba completamente independiente de la
generalización de la red.
(Consulte “Dividir los datos” para obtener más información sobre el proceso de división
de datos).
8. Haga clic en siguiente .
La red estándar que se utiliza para el reconocimiento de patrones es una red de avance
de dos capas, con una función de transferencia sigmoide en la capa oculta y una función
de transferencia de softmax en la capa de salida. El número predeterminado de neuronas
ocultas se establece en 10. Es posible que desee volver y aumentar este número si la red
no funciona tan bien como espera. El número de neuronas de salida se establece en 2,
que es igual al número de elementos en el vector objetivo (el número de categorías).
9. Haga clic en siguiente .
10. Haga clic en Tren .
La formación continúa durante 55 iteraciones.
11. En el panel Gráficos , haga clic en Confusión en la aplicación Reconocimiento de
patrones de red neuronal.
La siguiente figura muestra la confusión.matrices para entrenamiento, pruebas y
validación, y los tres tipos de datos combinados. Las salidas de la red son muy precisas,
como se puede ver por el alto número de respuestas correctas en los cuadrados verdes y
el bajo número de respuestas incorrectas en los cuadrados rojos. Los cuadrados azules
de la parte inferior derecha ilustran las precisiones generales.

12. Trazar la característica de operación del receptor (ROC) curva. En el panel Gráficos ,
haga clic en Características de operación del receptor en la aplicación
Reconocimiento de patrones de red neuronal.
Las líneas coloreadas en cada eje representan las curvas ROC. La curva ROC es un
gráfico de la tasa positiva verdadera (sensibilidad) versus la tasa positiva falsa
(especificidad 1) a medida que se varía el umbral. Una prueba perfecta mostraría puntos
en la esquina superior izquierda, con 100% de sensibilidad y 100% de
especificidad. Para este problema, la red funciona muy bien.
13. En la aplicación Reconocimiento de patrones de red neuronal, haga clic
en Siguiente para evaluar la red.
En este punto, puede probar la red con nuevos datos.
Si no está satisfecho con el rendimiento de la red en los datos originales o nuevos,
puede entrenarlos nuevamente, aumentar el número de neuronas o quizás obtener un
conjunto de datos de entrenamiento más amplio. Si el rendimiento en el conjunto de
entrenamiento es bueno, pero el rendimiento del conjunto de pruebas es
significativamente peor, lo que podría indicar un exceso de ajuste, la reducción del
número de neuronas puede mejorar sus resultados.
14. Cuando esté satisfecho con el rendimiento de la red, haga clic en Siguiente .
Use este panel para generar una función MATLAB o un diagrama de Simulink para
simular su red neuronal. Puede usar el código o diagrama generado para comprender
mejor cómo su red neuronal calcula las salidas de las entradas o implementa la red con
las herramientas del compilador MATLAB y otras herramientas de generación de
código MATLAB.
15. Haga clic en siguiente . Use los botones en esta pantalla para guardar sus resultados.
o Puede hacer clic en Simple Script o Advanced Script para crear
un código MATLAB ® que se puede usar para reproducir todos los pasos anteriores
desde la línea de comandos. La creación de código MATLAB puede ser útil si desea
aprender a usar la funcionalidad de línea de comandos de la caja de herramientas para
personalizar el proceso de capacitación. Al utilizar las funciones de la línea de
comandos , investigará los scripts generados con más detalle.
o También puede guardar la red como neten el área de trabajo. Puede realizar pruebas
adicionales en él o ponerlo a trabajar en nuevas entradas.
16. Cuando haya guardado los resultados, haga clic en Finalizar .
Uso de funciones de línea de comandos
La forma más sencilla de aprender a usar la funcionalidad de línea de comandos de la caja
de herramientas es generar scripts desde las GUI y luego modificarlos para personalizar la
capacitación de la red. Por ejemplo, mire la secuencia de comandos simple que se creó en el
paso 14 de la sección anterior.
% Resolver un problema Reconocimiento de Patrones con una red neuronal
% Script generado por NPRTOOL
%
% Este script asume estas variables se definen:
%
% cancerInputs - datos de entrada.
% cancerTargets - datos objetivo.
entradas = entradas de cáncer;
objetivos = cancerTargets; % Crear una red de reconocimiento de patrones
hiddenLayerSize = 10;
net = patternnet (hiddenLayerSize); % Configurar la División de Datos para
Entrenamiento, Validación, Pruebas
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100; % Train the Network
[net, tr] = train (red, entradas, objetivos); % De prueba de la red

salidas = red (entradas);


errores = gsubtract (objetivos, salidas);
performance = perform (neto, objetivos, resultados) % Ver la
vista de Red (neto) % Gráficos % Descomente estas líneas para habilitar varios
gráficos. % cifra, plotperform (tr) % figura, plottrainstate (tr) % figura,
plotconfusion (objetivos, salidas) % figura, ploterrhist (errores)

Puede guardar el script y luego ejecutarlo desde la línea de comandos para reproducir los
resultados de la sesión GUI anterior. También puede editar el script para personalizar el
proceso de capacitación. En este caso, siga cada paso del guión.
1. El script asume que los vectores de entrada y los vectores de destino ya están cargados
en el espacio de trabajo. Si los datos no están cargados, puede cargarlos de la siguiente
manera:
2. [entradas, objetivos] = cancer_dataset;

3. Crea la red. La red predeterminada para problemas de ajuste de funciones (o


regresión) patternnet,, es una red de avance con la función de transferencia tan-
sigmoide predeterminada en la capa oculta, y una función de transferencia de softmax
en la capa de salida. Usted asignó diez neuronas (algo arbitrarias) a una capa oculta en
la sección anterior.
o La red tiene dos neuronas de salida, porque hay dos valores objetivo (categorías)
asociados con cada vector de entrada.
o Cada neurona de salida representa una categoría.
o Cuando se aplica un vector de entrada de la categoría apropiada a la red, la neurona
correspondiente debe producir un 1, y las otras neuronas deben emitir un 0.
Para crear la red, ingrese estos comandos:
hiddenLayerSize = 10;
net = patternnet (hiddenLayerSize);

Nota

La elección de la arquitectura de red para los problemas de reconocimiento de patrones


sigue pautas similares para funcionar con los problemas de ajuste. Más neuronas
requieren más cómputo, y tienen una tendencia a ajustar los datos cuando el número es
demasiado alto, pero permiten que la red resuelva problemas más complicados. Más
capas requieren más cómputo, pero su uso podría resultar en que la red resuelva
problemas complejos de manera más eficiente. Para usar más de una capa oculta,
ingrese los tamaños de capa oculta como elementos de una matriz en
el patternnetcomando.
4. Configurar la división de datos.
5. net.divideParam.trainRatio = 70/100;
6. net.divideParam.valRatio = 15/100;
7. net.divideParam.testRatio = 15/100;

Con estos ajustes, los vectores de entrada y los vectores objetivo se dividirán
aleatoriamente, con un 70% utilizado para entrenamiento, un 15% para validación y un
15% para prueba.
(Consulte “Dividir los datos” para obtener más información sobre el proceso de división
de datos).
8. Entrena la red. La red de reconocimiento de patrones utiliza
el trainscgalgoritmo predeterminado de Gradiente de conjugado escalado ( ) para la
capacitación. Para entrenar la red, ingrese este comando:
9. [net, tr] = tren (net, entradas, objetivos);

Durante el entrenamiento, como en la función de ajuste, la ventana de entrenamiento se


abre. Esta ventana muestra el progreso del entrenamiento. Para interrumpir el
entrenamiento en cualquier momento, haga clic en Detener entrenamiento .
Esta capacitación se detuvo cuando el error de validación aumentó durante seis
iteraciones, lo que ocurrió en la iteración 24.
10. Prueba la red. Después de que la red haya sido entrenada, puede usarla para calcular las
salidas de la red. El siguiente código calcula las salidas de la red, los errores y el
rendimiento general.
11. salidas = red (entradas);
12. errores = gsubtract (objetivos, salidas);
13. rendimiento = realizar (red, objetivos, resultados)
14. rendimiento =
15.
16. 0.0307
17.

También es posible calcular el rendimiento de la red solo en el conjunto de pruebas,


utilizando los índices de prueba, que se encuentran en el registro de entrenamiento.
tInd = tr.testInd;
tstOutputs = net (entradas (:, tInd));
tstPerform = realizar (red, objetivos (:, tInd), tstOutputs)
tstPerform =

0.0257

18. Ver el diagrama de red.


19. vista (neto)

20. Trazar el entrenamiento, validación, y rendimiento de la prueba.


21. figura, plotperform (tr)
22. Usa la plotconfusionfunción para trazar la matriz de confusión.. Muestra los diversos
tipos de errores que ocurrieron en la red final entrenada.
23. figura, plotconfusion (objetivos, salidas)
Las celdas diagonales muestran el número de casos que se clasificaron correctamente, y las
celdas fuera de la diagonal muestran los casos mal clasificados. La celda azul en la parte
inferior derecha muestra el porcentaje total de casos clasificados correctamente (en verde) y
el porcentaje total de casos clasificados erróneamente (en rojo). Los resultados muestran
muy buen reconocimiento. Si necesita resultados aún más precisos, puede probar cualquiera
de los siguientes enfoques:
 Restablezca los pesos y sesgos iniciales de la red a nuevos valores con inity vuelva a
entrenar.
 Aumenta el número de neuronas ocultas.
 Incrementa la cantidad de vectores de entrenamiento.
 Aumente el número de valores de entrada, si hay más información relevante disponible.
 Intente con un algoritmo de entrenamiento diferente (vea "Algoritmos de entrenamiento" ).
En este caso, la respuesta de la red es satisfactoria y ahora puede poner la red en uso en
nuevas entradas.
Para obtener más experiencia en operaciones de línea de comandos, aquí hay algunas tareas
que puede probar:
 Durante el entrenamiento, abre una ventana de la trama (como la trama de confusión) y
mira cómo se anima.
 Trazar desde la línea de comandos con funciones como plotrocy plottrainstate.
Además, consulte la secuencia de comandos avanzada para obtener más opciones cuando
entrene desde la línea de comandos.
Cada vez que se entrena una red neuronal, puede resultar en una solución diferente debido a
los diferentes valores de sesgo y peso iniciales y diferentes divisiones de datos en
entrenamiento, validación y conjuntos de pruebas. Como resultado, diferentes redes
neuronales entrenadas en el mismo problema pueden dar diferentes salidas para la misma
entrada. Para asegurarse de que se ha encontrado una red neuronal de buena precisión,
vuelva a entrenar varias veces.
Hay varias otras técnicas para mejorar las soluciones iniciales si se desea una mayor
precisión. Para obtener más información, consulte Mejorar la generalización de la red
neuronal superficial y Evitar el sobre ajuste .

Potrebbero piacerti anche