Sie sind auf Seite 1von 40

Compresin de imgenes usando redes neuronales IV

(Histograma ecualizado en Matlab)

March 31st, 2010


By 640kbits

Write comment

En el post anterior mostr la teora para llevar a cabo la equalizacin de una imagen.
Desde el punto de vista prctico, en este post mostrar que funciones emplear en Matlab
para su implementacin.
El cdigo mostrado a continuacin indica como generar un histograma a partir de una
imagen previamente convertida a escala de grises:
I=imread('imagen.jpg'); % almacenamos la imagen en I.
II=rgb2gray(I);
% convertimos de color a escala de grises.
[nk, rk]=imhist(II); % generamos el histograma.
bar(rk, nk, 1); % mostramos el histograma

Partiendo de esta imagen de Lena, una vez convertida a escala de grises:

El histograma que obtenemos es el siguiente:

Si queremos obtener el histograma normalizado de la imagen, con frecuencias relativas


debemos hacer lo siguiente:
nkk=nk./sum(nk(:,1));

bar(rk, nkk, 1);

Obteniendo el siguiente histograma:

El paso siguiente es obtener la grfica de la funcin de distribucin acumulada:


d=cumsum(nkk);
bar(rk, d, 1);

El paso siguiente es obtener cuales son el mximo y mnimo valor de grises para la funcin
de distribucin acumulada, y despus ecualizar la imagen a partir de la original:

>> minimo=min(d)
minimo = 0
>> maximo=max(d)
maximo = 1
res(:,:)=255*( d(II(:,:)+1) -minimo) / ( maximo-minimo );

Ntese, que Matlab emplea ndices que comienzan en uno (no en 0), por eso es necesario
sumar 1 al recorrer la imagen original (II).
La ltima sentencia representa la frmula Zs expuesta en el post anterior:

En Zs tenemos la imagen ecualizada, sin embargo tenemos que convertir el formato de la


matriz de double a enteros sin signos de 8 bits:
res=uint8(res)

La imagen ecualizada en res , puede mostrarse empleando imshow, siendo ste el


resultado:

y ste su histograma ecualizado:

La ecualizacin del histograma tambin puede realizarse en Matlab, fcilmente a travs de


la funcin histeq:
III=histeq(II, 256); % En III estar la imagen ecualizada
Informtica . Matemticas
Write comment

Compresin de imgenes usando redes neuronales III


(Backpropagation con histograma ecualizado, teora)

March 21st, 2010


By 640kbits

Write comment

Las redes neuronales Feed-Fordward ,usando el algoritmo de entrenamiento


Backpropagation para la minimizacin del error cuadrtico medio, son muy populares
para la compresin de imgenes.
Por lo general, las imgenes usadas para la compresin son de muy diferente ndoles:
imgenes de alta intensidad, negativos, imgenes naturales, imgenes mdicas, de satlite
Cuando son comprimidas usando una red neuronal Backpropagation pueden necesitar
mucho tiempo para converger. Esto se debe a que la imagen dada contiene distintos niveles
de grises con pequeas diferencias entre pxeles vecinos (correlacin interpxeles), siendo
esto informacin redundante para obtener un nivel de compresin alto y una convergencia
ms rpida de la red neuronal .
Para conseguir una convergencia ms rpida y una compresin ms alta, llevaremos a
cabo una fase de preprocesamiento en la que ecualizaremos el histograma de la imagen
original, reduciendo la correlacin entre pxeles, al hacer uso de todos los niveles de grises
posibles ,es decir, consiguiendo una distribucin ms uniforme entre el nmero de
pxeles referido a los diferentes niveles de intensidad presentes en la imagen, (lo que yo
denomino ensanchar el histograma), presentando as unos valores de entrada mejores y
ms tiles para la red neuronal.
Una de las grandes virtudes de las redes neuronales para la compresin de imgenes es su
capacidad para trabajar con datos con ruidos o incompletos. Las redes neuronales tienen la
habilidad de procesar patrones de entrada y producir patrones sencillos de salida con pocas
componentes. Otro punto a favor de las tcnicas de compresin basadas en redes neuronales
es que adems de proveer un buen radio de compresin tambin mantienen los datos
seguros, ya que los datos comprimidos son enviados codificados y slo en el destino
recuperan su forma original.
El entrenamiento de la red neuronal y todo el proceso de compresin en si, es el expuesto
en el post anterior, la diferencia es el preprocesamiento de la imagen original para adaptarla
mejor a la red neuronal como ya se ha dicho. Lo primero es conocer que es exactamente un
histograma para una imagen en escala de grises:
El histograma de una imagen en escala de grises es un grfico que relaciona los niveles de
intensidad de una imagen y el nmero de pxeles que poseen tal nivel de intensidad, es
decir:
f(rk) = nk

donde rk representa el valor de la k-sima intensidad en el intervalo [0, 255] y nk es el


nmero de pxeles que posee la intensidad rk ,suponiendo en este caso 256 niveles de grises.

El histograma puede estar normalizado, en tal caso:


h(rk) = f(rk) / n = nk / n
donde n representa el nmero total de pxeles de la imagen.
Para ecualizar el histograma es necesario aplicar la siguiente funcin de distribucin
acumulativa:

donde k va tomando valores en el intervalo [o,255] (para n igual al nmero total de


pxeles)
El algoritmo que ecualiza un histograma cumple los siguientes pasos:
[1] Se obtiene el histograma.
[2] El nivel de intensidad f(rk) se sustituye por mk.
[3] Repetir (paso 2) para los 256 niveles de grises .
[4] mk es una funcin de distribucin acumulada, por lo tanto continua, creciente y con
rango entre 0 y 1. Sin embargo debemos transformar el dominio de esta funcin para
tener en cuenta todo el rango de grises, para ello necesitamos saber el valor normalizado
mnimo ( min(mk) ) y mximo (=1) de la funcin de distribucin acumulada:
Ymax=max(mk)=1 ; Ymin=min(mk);

Supongamos Fs(Xs) es el valor de mk (func. distribucin acumulada) para un pixel de


entrada (Xs) con un determinado valor de grises; y L=256 (son los niveles de grises), la
frmula para ecualizar la imagen original es descrita por Zs:

Ejemplo de funcin de distribucin acumulada:

EJEMPLO DE HISTOGRAMA ECUALIZADO:

Una vez mapeada la imagen original a partir del histograma ecualizado, puede procederse
como en el post anterior, para comprimir la imagen.
En este post se estudi algo de teora relacionada con los histogramas y la ecualizacin de
imgenes, en el post siguiente , se presentar lo dicho aqu como un caso prctico de
implementacin usando Matlab

Informtica . Matemticas
Write comment

Compresin de Imgenes usando redes neuronales.

March 20th, 2010


By 640kbits

Write comment

Almacenar una imagen requiere gran cantidad de memoria en un computador, empleando


tcnicas de compresin de datos es posible eliminar la informacin redundante contenida en
las imgenes permitiendo almacenarlas en un espacio menor y enviarlas de un computador
a otro dentro de una red de forma ms rpida .
Las redes neuronales pueden usarse para la compresin de imgenes , como veremos en
este post.
Una arquitectura de red neuronal que puede ser usada para comprimir imgenes (de cuello
de botella) es mostrada abajo:

La red cuenta con una capa de entrada de gran tamao (64 componentes , una imagen de
88) que alimenta una pequea capa oculta (en este caso de 16 neuronas, denominada
cuello de botella) , que a su vez alimenta una capa de salida de gran tamao (64
componentes tambin).
En este caso la red puede usarse para la compresin de imgenes si se divide en dos
partes, como se muestra en la parte de abajo:

El transmisor codifica y luego transmite la salida a la capa oculta de la red (4 veces menor
que la capa de entrada). Por otro lado, el receptor recibe y decodifica los 16 valores de
entrada (provenientes de la salida de la capa oculta) y genera de nuevo 64 valores de salida
(reconstruyendo la imagen original).
En este instante, aunque el cuello de botella de la capa oculta nos permite pasar de 64
nodos a 16 nodos, an no se ha llevado a cabo la compresin realmente, ya que los 64
pxeles de entrada, constituidos cada uno por 8 bits (256 niveles de grises) son
transformados por la capa oculta en valores reales entre (-1 y 1), cada uno de estos valores
reales puede requerir un nmero infinito de bits para su transmisin. La verdadera
compresin ocurre cuando las salidas de la capa oculta son cuantificadas antes del proceso
de transmisin de un computador a otro. La figura mostrada abajo muestra un ejemplo de
cuantificacin usando 3 bits para codificar cada entrada. Como puede verse, se pueden
formar 8 cdigos binarios:

Cada cdigo representa un rango de valores para las salidas de la capa oculta. Por ejemplo,
cuando el valor da salida esta entre -1.0 y -0.75 , el cdigo transmitido es 000.
El entrenamiento de la red neuronal se lleva a cabo de la siguiente manera, se emplea una
imagen de entrenamiento de 256 x 256 pxeles para entrenar la red cuello de botella para
aprender el identity map requerido. Los pares de entrenamiento (input/output) son

producidos extrayendo bloques de 88 de la imagen elegidos de forma aleatoria. La


forma ms sencilla de extraer los bloques aleatorios es generar un par de enteros aleatorios
para usarlos como ndices (partiendo de la esquina superior izquierda) para extraer bloques.
En este caso, elegimos valores enteros para i y j entre 0 y 248.
Los valores de cada pxel del bloque de 88 elegido son enviados (de izquierda a derecha, y
de arriba a abajo), construyendo un vector de 64 componentes que se usa de entrada para la
red neuronal. La meta es aprender el identity map, por tanto, el target deseado para
construir la entrada es esta misma, por tanto, los pares de entrenamiento son usados para
actualizar los pesos de la red.

En trminos matemticos podemos podemos expresar los procesos de


codificacin/decodificacin de la imagen de entrenamiento as:

El sumatorio de arriba refleja el proceso de codificacin, a partir de un vector X (de 64


componentes) se produce un vector de salida H de componentes reales (16 elementos) para
la capa oculta.
Una vez codificada toda la imagen, el proceso de decodificacin en la mquina de destino
se lleva a cabo con el sumatorio mostrado abajo, que parte de los valores codificados en H:

En el dibujo mostrado a continuacin puede comprenderse mejor lo dicho hasta este


momento:

Si expresamos los procesos de codificacin/decodificacin mediante notacin matricial,


obtendremos algo as:
[h] = [W]T[x]
[x] = [W'][h]=[W'][W]T[x]
Este post es una traduccin aproximada con algunas adiciones del artculo: Image
Compression using Backprop escrito por Paul Watta, Brijesh Desaie, Norman Dannug,
Mohamad Hassoun (1996), que puede encontrarse aqu.

Informtica . Matemticas
Write comment

Cdigo completo del programita de OCR.

January 20th, 2010


By 640kbits

Write comment

En este nuevo post se hace uso de los conceptos descritos en los tres posts anteriores:

1. Herramientas de MATLAB para el procesamiento de imgenes. Parte 1.


2. Herramientas de MATLAB para el procesamiento de imgenes. Parte 2.
3. Implementando la red neuronal para nuestro pequeo programa de OCR.
De aqu podis descargar un archivo comprimido (.zip) con el cdigo del programa (.m) y
el archivo que especifica la interfaz de usuario (.fig), tambin se incluyen un conjunto de
imgenes correspondientes a 5 tipografas diferentes y un archivo T_file (MAT file) con los
valores de salida esperados para estas 5 tipografas que se emplearn en el entrenamiento de
la red.
El funcionamiento del programa es muy sencillo, lanzar MATLAB, ajustar el path de
MATLAB para que recoja la carpeta donde se encuentra nuestro programa y ejecutar
ocr ,en la consola de comandos de MATLAB. Podremos cargar una imagen de una letra
para su reconocimiento con el primer botn. Puede usarse una de las imgenes empleadas
en el entrenamiento (u otra similar, sin embargo debe ser relativamente parecida a una de
las cinco tipografas con las que se entren la red, para tener xito). Antes de presionar
reconocer, se debe entrenar la red, una vez hecho esto , podemos ver el resultado del
reconocimiento pulsando el tercer botn.
Si la fase de entrenamiento recogiera un mayor nmero de tipografas, incluso muestras de
nuestra letra manuscrita, resultara cada vez ms inteligente y eficaz para el reconocimiento
de un carcter.
Con esta pequea demostracin podemos reconocer un solo carcter a partir de una imagen
de ste , ahora el reto es cmo reconocer un documento con ms de una letra ?

Informtica
Write comment

Implementando la red neuronal para nuestro pequeo


programa de OCR.

January 20th, 2010


By 640kbits

Write comment

En los dos post anteriores (1parte , 2parte ) procesamos las imgenes de los caracteres
para adecuarlos a la entrada de la red neuronal.
En este nuevo post proceder a implementar la red neuronal que nos ayudar a reconocer
cada carcter de las imgenes de entrada.

El cdigo para crear la red podra ser algo as, mezclando pseudocdigo con cdigo
MATLAB, explicado en los dos post anteriores :
LOOP (contador): PARA CADA IMAGEN QUE REPRESENTA UNA LETRA
imagen = ObtenerImagen %%usando uigetfile() y imread().
imgGris = PasarAgrises %%con rgb2gray(imagen).
blackwhite = BinarizarImagen %%usando im2bw y graythresh.
imgRecortada=RecortarImagen(blackwhite) %%explicado anteriormente.
vectorCaracteristico=obtenerVectorPorcentajes(imgRecortada) %
%explicado.
P( : ,contador ) = vectorCaracteristico %%Parmetros de entrada a la
red.
END LOOP
%%Un vector por cada letra con todo cero menos un valor uno.
load T_file;
T=carac_esperados;
%% Creamos y entrenamos la red neuronal
red = newff( P,T, [100 100],{'tansig','tansig' 'purelin'},'traingd');
red.trainParam.goal = 0.01; %%Objetivo para converger
red.trainParam.show = 60;

%%Actualizar salida cada ciertos epoch

red.trainParam.epochs = 5000;
red.trainParam.lr = 0.2;

%%numero maximo de iteraciones

%%Velocidad de convergencia

red.divideFcn ='';
red = train(red,P,T);

%%Entrenamiento de la red

En este caso se ha implementado una red neuronal Feed Forward de dos capas ocultas con
100 neuronas cada una, que se comporta bien para el reconocimiento de los caracteres.

Herramientas bsicas de MATLAB para el


procesamiento de imgenes. Parte 1 de 2.

January 2nd, 2010


Posted in Informtica . Matemticas

By 640kbits

Write comment

En el presente post quiero mostraros algunas funciones de las bibliotecas de MATLAB para
permitir procesar/tratar imgenes. Se describen tan slo unas pocas rutinas, las
fundamentales para nuestro propsito futuro; ya que lo que aqu se explica ser de utilidad

para los posts siguientes, donde tratar de implementar una pequea aplicacin de tipo
OCR, empleando MATLAB, que nos permita reconocer caracteres alfabticos empleando
redes neuronales.
La primera funcin que voy a ensearos es uigetfile() , que nos permite cargar archivos, de
un medio de almacenamiento secundario, en matlab, la interfaz de la funcin es muy
sencilla y la explicar con un pequeo ejemplo:
[filename,pathname] = uigetfile({'*.bmp';'*.jpg';'*.gif'}
, 'Seleccione imgenes:');

El primer argumento es un cell array de string donde se especifican las extensiones de los
archivos , en este caso de tipo imagen, que podremos abrir en MATLAB a travs de un
cuadro de dilogo que nos permitir navegar por el sistema de archivos de nuestro
computador.
El segundo argumento simplemente es el ttulo que queremos mostrar en el cuadro de
dilogo. Al invocar uigetfile(), se obtendr algo similar a esto, dependiendo de los tipos de
archivos especificados y del ttulo establecido como argumento:

La salida de la funcin son: el nombre del archivo seleccionado (filename) y la ruta en


donde se ubica (pathname).
uigetfile() nos permite seleccionar un determinado archivo (en este caso un archivo
de imagen) empleando un cuadro de dilogo, y conocer su nombre y path. Sin embargo si
queremos abrir el archivo debemos emplear otra funcin: imread().
Como ya hicimos anteriormente, explicar la sintaxis de la rutina imread() mediante un
sencillo ejemplo:
imagen=imread([pathname,filename]);

En matlab, trabajar con imgenes significa trabajar con matrices, como veremos a
continuacin.
pathname y filename son argumentos idnticos a los parmetros de salida de uigetfile(). Por
otro lado la funcin devuelve una matriz (de tipo uint8) que contiene la imagen. Si el
archivo guarda una imagen en escala de grises , imagen es una matriz de 2 dimensiones
(MxN), si por el contrario, el archivo contiene una imagen de tipo truecolor, imagen es
una matriz tridimensional (MxNx3) , excepto imgenes de formato *.tiff que tienen un
espacio de colores que requiere una matriz de MxNx4:

Para mostrar una imagen, se emplea la funcin imshow() , slo es necesario pasarle como
argumento una matriz de imagen , producto de imread():
imshow(imagen);

Otra funcin interesante a la hora de procesar y trabajar con imgenes es rgb2gray(), como
su nombre indica, convierte una imagen de tipo RGB a escala de grises , eliminando el
matiz (hue) y la saturacin y manteniendo la luminancia. Un ejemplo de su uso podra ser
este:
imagen_grises = rgb2gray(imagen);

Recibe como argumento una matriz imagen RGB (como las que produce imread()) y
devuelve otra matriz imagen , pero en este caso con 256 niveles de grises.
Una de las etapas de preprocesamiento de imgenes digitales ms importante es la
segmentacin. El objetivo de esta es poder llegar a distinguir los objetos del fondo,
requiere una serie de operaciones sobre la imagen en tratamiento, que generalmente
empiezan con su binarizacin.
El objetivo de la binarizacin es obtener una imagen que slo sea representada por dos
tonos de color, generalmente, blanco y negro. Para ello slo debemos decidir cal de los
dos tonos de color dar a cada pxel de la imagen de entrada. Esta tarea se lleva a cabo
especificando un valor umbral o lmite, de modo que aquellos pxeles cuyo valor est por
encima del umbral tendrn un tono, y todos aquellos que no lleguen al umbral tendrn otro.

Para realizar la binarizacin de una imagen se suele partir de una versin en escala de grises
de esta. La imagen expuesta a continuacin puede ser un ejemplo de binarizacin, en este
caso se parti de una foto en escala de grises y se le aplic una binarizacin con un valor
umbral de 120. Dependiendo del valor umbral elegido, podremos obtener una imagen
binarizada con mejor o peor resultado para nuestros propositos.

Para llevar a cabo la binarizacin en MATLAB partimos de una imagen en escala de grises
(como la obtenida con rgb2gray() ); con la funcin graythresh() obtenemos un valor
ptimo para el umbral, necesario en la binarizacin.
A = graythresh(imgGray))

Una vez que tenemos un valor normalizado para el umbral ( (0,1) ), ahora s podemos
proceder a binarizar la imagen haciendo uso de la siguiente funcin:
im2bw() : Convierte una imagen en escala de grises o rgb en una imagen binaria en blanco
y negro.
im2 = im2bw(im, thresh)
im: M x N x 3 imagen rgb o M x N imagen escala de grises.
thresh: Valor normalizado del umbral (0,1).
im2: imagen en blanco y negro, matriz con valores booleanos.

Para pasar a la segunda parte de este post, pulse aqu.

Herramientas bsicas de MATLAB para el


procesamiento de imgenes. Parte 2 de 2.

January 3rd, 2010


Posted in Informtica

By 640kbits

Write comment

En el post anterior repasamos algunas funciones bsicas en MATLAB ,para manipular


imgenes y explicamos que es la segmentacin y una de sus etapas o pasos previos ms
importantes: la binarizacin.
Otra operacin importante en el tratamiento de imgenes, necesaria para el reconocimiento
de caracteres (OCR), es el recorte de las imgenes, para llevar a cabo dicha accin ser
necesario hacer uso de algunos mtodos implementados en MATLAB, que describiremos a
continuacin.
[numFilas,numColumnas] = size(matriz)

Se trata de una funcin que determina el tamao de la matriz pasada como parmetro, dicho
de otra forma, determina el nmero de filas y columnas de dicha matriz.
Por otro lado, si tras binarizar una imagen tenemos mucho espacio libre alrededor,
podemos recortar la imagen eliminando ese espacio sobrante, reajustando el tamao de la
imagen. Tenemos la opcin de recortar cada uno de sus flancos (izquierda, derecha , arriba
y abajo). Para llevar a cabo las tareas de recorte puede ser til la funcin sum de
MATLAB.
s=sum(x)

Dado un vector x, la funcin devuelve la suma de todas sus componentes (s). Teniendo en
cuenta que un pixel blanco en la imagen binarizada corresponde con un valor 1, podemos
eliminar las lineas libres (en blanco) ,por ejemplo, a la izquierda de la imagen, de la
siguiente manera:
[filas,columnas]=size(imagen); %tamao de la imagen binarizada.
x=1;
aux=1;
while( sum( imagen(:,aux) ) == filas )
x=x+1;
aux=aux+1;
end

El valor de la variable x hace referencia a la primera columna con algn pixel negro a la
izquierda de la imagen.
Una vez establecidos los lmites de recorte de la imagen por izquierda, arriba, derecha y
abajo, podemos usar la funcin imcrop() para recomponer la nueva imagen recortada (sin
espacios blancos alrededor):
imagen_recortada = imcrop( imagen, [ nuevaIzq, nuevaArr, nuevaAbaj,
nuevaDer ] );

Nuestro objetivo final, como se dijo anteriormente, es construir un software, con la ayuda
de MATLAB, que permita reconocer caracteres de distintas tipografas a partir de imgenes
aproximadas de los mismos, para llevar a cabo dicha tarea se emplear una red neuronal
multicapa de tipo Feed-Forward entrenada mediante Backpropagation.
Partiendo de que una imagen binarizada no es ms que una matriz bidimensional de ceros y
unos, podramos considerar cada uno de stos como un elemento de la capa de entrada de
la red neuronal, sin embargo, se tratara de una red difcil de computar. Nuestro
preocupacin ,en este instante, es simplificar la que ser la capa de entrada a la red
neuronal, para ello seguiremos trabajando sobre la imagen binarizada recortada producto de
las operaciones anteriores.
El enfoque a seguir es dividir la imagen binarizada de partida en celdas ms pequea, por
ejemplo de 1010 elementos, y sobre cada una de estas celdas calcular una propiedad
caracterstica, por ejemplo el porcentaje de pixeles blancos, simplemente sumando los
elementos de cada celda 1010 con la rutina sum de MATLAB (recordad que un pixel
negro tiene un valor 0 ). Para facilitar la representacin (y pensando ya en las entradas de la
red neuronal), representaremos cada letra como un vector caracterstico de porcentajes,
donde cada uno corresponde a cada celda de 1010. Un ejemplo de cdigo para realizar lo
descrito en este prrafo puede verse a continuacin:
%Trabajamos partiendo de una imagen binarizada de 30x50 pixeles.
for filas=1:3
for columnas=1:5
%Calculamos porcentaje para cada celda de 10 x 10
percent=sum( imagen( (filas*10-9:filas*10),
(columnas*10-9:columnas*10) ) );
%Almacenamos el porcentaje, en su posicin en el vector.
vector_carac( (filas-1)*5+columnas )=sum(percent);
end
end
vector_carac=( (100-vector_carac)/100 ); %Normalizamos el vector.

El hecho de emplear una matriz de 30 x 50 es algo casual, que depende mucho de la


naturaleza de las imgenes con las que trabajemos. En cualquier caso (y terminando con el
post) podemos escalar nuestra imagen, produciendo una de nuevas dimensiones, empleando
el siguiente comando:
nueva_imagen = imresize ( imagen_original,[nuevas_filas,nuevas_columnas] ) ;

Implementando la red neuronal para nuestro pequeo


programa de OCR.

January 20th, 2010


Posted in Informtica

By 640kbits

Write comment

En los dos post anteriores (1parte , 2parte ) procesamos las imgenes de los caracteres
para adecuarlos a la entrada de la red neuronal.
En este nuevo post proceder a implementar la red neuronal que nos ayudar a reconocer
cada carcter de las imgenes de entrada.
El cdigo para crear la red podra ser algo as, mezclando pseudocdigo con cdigo
MATLAB, explicado en los dos post anteriores :
LOOP (contador): PARA CADA IMAGEN QUE REPRESENTA UNA LETRA
imagen = ObtenerImagen %%usando uigetfile() y imread().
imgGris = PasarAgrises %%con rgb2gray(imagen).
blackwhite = BinarizarImagen %%usando im2bw y graythresh.
imgRecortada=RecortarImagen(blackwhite) %%explicado anteriormente.
vectorCaracteristico=obtenerVectorPorcentajes(imgRecortada) %
%explicado.
P( : ,contador ) = vectorCaracteristico %%Parmetros de entrada a la
red.
END LOOP
%%Un vector por cada letra con todo cero menos un valor uno.
load T_file;
T=carac_esperados;
%% Creamos y entrenamos la red neuronal
red = newff( P,T, [100 100],{'tansig','tansig' 'purelin'},'traingd');
red.trainParam.goal = 0.01; %%Objetivo para converger
red.trainParam.show = 60;

%%Actualizar salida cada ciertos epoch

red.trainParam.epochs = 5000;
red.trainParam.lr = 0.2;

%%numero maximo de iteraciones

%%Velocidad de convergencia

red.divideFcn ='';
red = train(red,P,T);

%%Entrenamiento de la red

En este caso se ha implementado una red neuronal Feed Forward de dos capas ocultas con
100 neuronas cada una, que se comporta bien para el reconocimiento de los caracteres.

Herramientas bsicas de MATLAB para el


procesamiento de imgenes. Parte 2 de 2.

January 3rd, 2010


By 640kbits

Write comment

En el post anterior repasamos algunas funciones bsicas en MATLAB ,para manipular


imgenes y explicamos que es la segmentacin y una de sus etapas o pasos previos ms
importantes: la binarizacin.
Otra operacin importante en el tratamiento de imgenes, necesaria para el reconocimiento
de caracteres (OCR), es el recorte de las imgenes, para llevar a cabo dicha accin ser
necesario hacer uso de algunos mtodos implementados en MATLAB, que describiremos a
continuacin.
[numFilas,numColumnas] = size(matriz)

Se trata de una funcin que determina el tamao de la matriz pasada como parmetro, dicho
de otra forma, determina el nmero de filas y columnas de dicha matriz.
Por otro lado, si tras binarizar una imagen tenemos mucho espacio libre alrededor,
podemos recortar la imagen eliminando ese espacio sobrante, reajustando el tamao de la
imagen. Tenemos la opcin de recortar cada uno de sus flancos (izquierda, derecha , arriba
y abajo). Para llevar a cabo las tareas de recorte puede ser til la funcin sum de
MATLAB.
s=sum(x)

Dado un vector x, la funcin devuelve la suma de todas sus componentes (s). Teniendo en
cuenta que un pixel blanco en la imagen binarizada corresponde con un valor 1, podemos
eliminar las lineas libres (en blanco) ,por ejemplo, a la izquierda de la imagen, de la
siguiente manera:
[filas,columnas]=size(imagen); %tamao de la imagen binarizada.
x=1;
aux=1;
while( sum( imagen(:,aux) ) == filas )
x=x+1;
aux=aux+1;
end

El valor de la variable x hace referencia a la primera columna con algn pixel negro a la
izquierda de la imagen.
Una vez establecidos los lmites de recorte de la imagen por izquierda, arriba, derecha y
abajo, podemos usar la funcin imcrop() para recomponer la nueva imagen recortada (sin
espacios blancos alrededor):
imagen_recortada = imcrop( imagen, [ nuevaIzq, nuevaArr, nuevaAbaj,
nuevaDer ] );

Nuestro objetivo final, como se dijo anteriormente, es construir un software, con la ayuda
de MATLAB, que permita reconocer caracteres de distintas tipografas a partir de imgenes
aproximadas de los mismos, para llevar a cabo dicha tarea se emplear una red neuronal
multicapa de tipo Feed-Forward entrenada mediante Backpropagation.
Partiendo de que una imagen binarizada no es ms que una matriz bidimensional de ceros y
unos, podramos considerar cada uno de stos como un elemento de la capa de entrada de
la red neuronal, sin embargo, se tratara de una red difcil de computar. Nuestro
preocupacin ,en este instante, es simplificar la que ser la capa de entrada a la red
neuronal, para ello seguiremos trabajando sobre la imagen binarizada recortada producto de
las operaciones anteriores.
El enfoque a seguir es dividir la imagen binarizada de partida en celdas ms pequea, por
ejemplo de 1010 elementos, y sobre cada una de estas celdas calcular una propiedad
caracterstica, por ejemplo el porcentaje de pixeles blancos, simplemente sumando los
elementos de cada celda 1010 con la rutina sum de MATLAB (recordad que un pixel
negro tiene un valor 0 ). Para facilitar la representacin (y pensando ya en las entradas de la
red neuronal), representaremos cada letra como un vector caracterstico de porcentajes,
donde cada uno corresponde a cada celda de 1010. Un ejemplo de cdigo para realizar lo
descrito en este prrafo puede verse a continuacin:
%Trabajamos partiendo de una imagen binarizada de 30x50 pixeles.
for filas=1:3
for columnas=1:5
%Calculamos porcentaje para cada celda de 10 x 10
percent=sum( imagen( (filas*10-9:filas*10),
(columnas*10-9:columnas*10) ) );
%Almacenamos el porcentaje, en su posicin en el vector.
vector_carac( (filas-1)*5+columnas )=sum(percent);
end
end
vector_carac=( (100-vector_carac)/100 ); %Normalizamos el vector.

El hecho de emplear una matriz de 30 x 50 es algo casual, que depende mucho de la


naturaleza de las imgenes con las que trabajemos. En cualquier caso (y terminando con el
post) podemos escalar nuestra imagen, produciendo una de nuevas dimensiones, empleando
el siguiente comando:
nueva_imagen = imresize ( imagen_original,[nuevas_filas,nuevas_columnas]

Herramientas bsicas de MATLAB para el


procesamiento de imgenes. Parte 1 de 2.

January 2nd, 2010


By 640kbits

Write comment

En el presente post quiero mostraros algunas funciones de las bibliotecas de MATLAB para
permitir procesar/tratar imgenes. Se describen tan slo unas pocas rutinas, las
fundamentales para nuestro propsito futuro; ya que lo que aqu se explica ser de utilidad
para los posts siguientes, donde tratar de implementar una pequea aplicacin de tipo
OCR, empleando MATLAB, que nos permita reconocer caracteres alfabticos empleando
redes neuronales.
La primera funcin que voy a ensearos es uigetfile() , que nos permite cargar archivos, de
un medio de almacenamiento secundario, en matlab, la interfaz de la funcin es muy
sencilla y la explicar con un pequeo ejemplo:
[filename,pathname] = uigetfile({'*.bmp';'*.jpg';'*.gif'}
, 'Seleccione imgenes:');

El primer argumento es un cell array de string donde se especifican las extensiones de los
archivos , en este caso de tipo imagen, que podremos abrir en MATLAB a travs de un
cuadro de dilogo que nos permitir navegar por el sistema de archivos de nuestro
computador.
El segundo argumento simplemente es el ttulo que queremos mostrar en el cuadro de
dilogo. Al invocar uigetfile(), se obtendr algo similar a esto, dependiendo de los tipos de
archivos especificados y del ttulo establecido como argumento:

La salida de la funcin son: el nombre del archivo seleccionado (filename) y la ruta en


donde se ubica (pathname).
uigetfile() nos permite seleccionar un determinado archivo (en este caso un archivo
de imagen) empleando un cuadro de dilogo, y conocer su nombre y path. Sin embargo si
queremos abrir el archivo debemos emplear otra funcin: imread().

Como ya hicimos anteriormente, explicar la sintaxis de la rutina imread() mediante un


sencillo ejemplo:
imagen=imread([pathname,filename]);

En matlab, trabajar con imgenes significa trabajar con matrices, como veremos a
continuacin.
pathname y filename son argumentos idnticos a los parmetros de salida de uigetfile(). Por
otro lado la funcin devuelve una matriz (de tipo uint8) que contiene la imagen. Si el
archivo guarda una imagen en escala de grises , imagen es una matriz de 2 dimensiones
(MxN), si por el contrario, el archivo contiene una imagen de tipo truecolor, imagen es
una matriz tridimensional (MxNx3) , excepto imgenes de formato *.tiff que tienen un
espacio de colores que requiere una matriz de MxNx4:

Para mostrar una imagen, se emplea la funcin imshow() , slo es necesario pasarle como
argumento una matriz de imagen , producto de imread():
imshow(imagen);

Otra funcin interesante a la hora de procesar y trabajar con imgenes es rgb2gray(), como
su nombre indica, convierte una imagen de tipo RGB a escala de grises , eliminando el
matiz (hue) y la saturacin y manteniendo la luminancia. Un ejemplo de su uso podra ser
este:
imagen_grises = rgb2gray(imagen);

Recibe como argumento una matriz imagen RGB (como las que produce imread()) y
devuelve otra matriz imagen , pero en este caso con 256 niveles de grises.
Una de las etapas de preprocesamiento de imgenes digitales ms importante es la
segmentacin. El objetivo de esta es poder llegar a distinguir los objetos del fondo,
requiere una serie de operaciones sobre la imagen en tratamiento, que generalmente
empiezan con su binarizacin.

El objetivo de la binarizacin es obtener una imagen que slo sea representada por dos
tonos de color, generalmente, blanco y negro. Para ello slo debemos decidir cal de los
dos tonos de color dar a cada pxel de la imagen de entrada. Esta tarea se lleva a cabo
especificando un valor umbral o lmite, de modo que aquellos pxeles cuyo valor est por
encima del umbral tendrn un tono, y todos aquellos que no lleguen al umbral tendrn otro.
Para realizar la binarizacin de una imagen se suele partir de una versin en escala de grises
de esta. La imagen expuesta a continuacin puede ser un ejemplo de binarizacin, en este
caso se parti de una foto en escala de grises y se le aplic una binarizacin con un valor
umbral de 120. Dependiendo del valor umbral elegido, podremos obtener una imagen
binarizada con mejor o peor resultado para nuestros propositos.

Para llevar a cabo la binarizacin en MATLAB partimos de una imagen en escala de grises
(como la obtenida con rgb2gray() ); con la funcin graythresh() obtenemos un valor
ptimo para el umbral, necesario en la binarizacin.
A = graythresh(imgGray))

Una vez que tenemos un valor normalizado para el umbral ( (0,1) ), ahora s podemos
proceder a binarizar la imagen haciendo uso de la siguiente funcin:
im2bw() : Convierte una imagen en escala de grises o rgb en una imagen binaria en blanco
y negro.
im2 = im2bw(im, thresh)
im: M x N x 3 imagen rgb o M x N imagen escala de grises.
thresh: Valor normalizado del umbral (0,1).
im2: imagen en blanco y negro, matriz con valores booleanos.

Simulando puertas lgicas con MATLAB y una red


neuronal Feed Forward.

January 1st, 2010


By 640kbits

Write comment

Con este post pretendo realizar un resumen sobre los temas expuestos en artculos
anteriores. La captura de pantalla ,que puede verse arriba, es la interfaz grfica de un
sencillo programa que he implementado usando guide de MATLAB, cuyo cdigo
(archivos *.m y *.fig) podis descargar aqu . El programa sirve para emular el
comportamiento de cualquier puerta lgica de dos entradas, empleando para ello, una red
neuronal de tipo Feed Forward, con una capa oculta y empleando el mtodo del gradiente
descendiente (traingd) para entrenar la red.
La aplicacin nos permite introducir cualquier combinacin de valores esperados para los
dos bits de entrada, pudiendo simular cualquier tipo de puerta lgica (al fin y al cabo se
trata de un problema de reconocimiento de patrones); podemos modificar el nmero de
neuronas en la capa oculta, as como la funcin de transferencia de sta (la func. de
transferencia de la capa de salida es de tipo lineal purelin), tambin podemos ajustar
algunos parmetros relacionados con el mtodo del gradiente descendente para reducir el
error cuadrtico medio de nuestra red: lr, epochs, goal para ms informacin sobre estos
valores se recomienda consultar este post.

Una vez creada la red (botn create), podemos tratar de simularla con los valores
aleatorios que asigna MATLAB para las matrices de pesos y ganancias (Wi y Bi) , como
cabe esperar el resultado se aleja bastante de lo esperado, es necesario entrenar la red
previamente para obtener un resultado aceptable , por debajo de la cota de error fijada por
el argumento goal. Si simulamos , despus de haber entrenado adecuadamente la red,
obtendremos los resultados esperados, podemos ver el progreso de minimizacin del ECM
en el plot de la interfaz, as como el valor final del error y la iteracin en la que se alcanza.
El empleo de una red multicapa permite solventar los incidentes relacionados con la
simulacin de problemas linealmente NO separables con redes de una sla capa
(Perceptrn) , como el tpico ejemplo de las puertas XOR.
Como bien se dijo al principio del post, esta pequea aplicacin reune conceptos explicados
anteriormente en el blog:

Creacin de GUIs usando MATLAB y guide. Visitar post .


Implementar redes neuronales multicapa BackPropagation con toolkit de MATLAB.
Visitar post.

Minimizar el Error Cuadrtico Medio empleando el mtodo del Gradiente


Descendiente. Regla delta Widrow-Hoff. Visitar post.

Error cuadrtico medio de un estimador. Visitar post.

Error Cuadrtico medio de un estimador.

December 31st, 2009


Posted in Informtica . Matemticas

By 640kbits

Write comment

Para entender como funciona el algoritmo de entrenamiento de una red neuronal Adaline
(regla delta Widrow-Hoff o LMS) es necesario entender que es el Error Cuadrtico Medio
de un estimador.
Sea T un estimador para un parmetro q. Se define el Error Cuadrtico Medio (ECM) como
la esperanza matemtica del cuadrado de la diferencia entre el estimador T y el parmetro q
que quiere estimar, es decir:
ECM(T) = E {

(T - q)

Como veremos al entrenar una red Adaline, BackPropagation nuestro objetivo es


minimizar el ECM entre el valor de salida obtenido en el momento actual ( nuestro q ) y el

valor esperado (nuestro T), recordemos que se tratan de redes neuronales de aprendizaje
supervisado, entrenamos la red partiendo de tuplas (x,t), donde x es un patrn de entrada y t
la salida esperada para ese patrn.
Para saber por qu es tan importante el ECM para medir la calidad de un estimador,
llevaremos a cabo el siguiente desarrollo:
ECM(T) = E{(T - q)} = E(T - 2Tq + q) = E(T) - 2qE(T) +q

Este desarrollo es posible gracias a las propiedades de la diferencia al cuadrado y de la


esperanza matemtica.
Ahora podemos emplear un pequeo truco que consiste en sumar y restar en un lado de la
ecuacin [E(T)]:
ECM(T) = {E(T) - [E(T)]}+ {[E(T)] - 2qE(T) + q}

Podemos expresar:
V(T)= {E(T) - [E(T)]}
[q - E(T)]= {[E(T)] - 2qE(T) + q}
ECM(T) = V(T) + [q - E(T)]

Por lo tanto, el ECM recoge dos propiedades importantes para un estimador:

La varianza del estimador (valor siempre positivo)


El cuadrado del sesgo del estimador (valor siempre positivo)

Como podis imaginar cuanto mas pequeo sea el ECM mejor estimador T obtendremos
para q. Por esto algunas redes neuronales se basan en minimizar el ECM para ajustar los
valores de sus pesos y entrenar la red adecuadamente.

Construir una interfaz grfica de usuario (GUI) en


MATLAB. Parte 2 de 2.

December 31st, 2009


By 640kbits

Write comment

En la segunda parte de este post, describir como implementar la lgica asociada a la


interfaz, programando la funciones callbacks , que se ejecutan como respuesta a los eventos

lanzados por los componentes (por ejemplo el evento de hacer click sobre el botn de
nuestra GUI).
El primer paso es abrir el archivo *.m que se gener con el editor visual de interfaces que
empleamos en el post anterior , en el editor de cdigo debemos hacer click sobre el icono
, mostrndose en pantalla la lista de funciones declaradas en el archivo *.m:

Pulsamos sobre la funcin correspondiente a la primera caja de texto


editable: m1_Callback() y aadimos el siguiente cdigo (despus realizamos el mismo
procedimiento con la segunda caja de texto editable):
input = str2num(get(hObject,'String'));
if (isempty(input))
set(hObject,'String','0')
end
guidata(hObject, handles);

El cdigo anterior, simplemente, comprueba que la entrada de la caja de texto est bien
definida (que se trata de un nmero). La funcin guidata() , se aade al final de cada rutina
callback() y se encarga de actualizar las estructuras handles, con informacin de los
componentes grficos.
El paso siguiente es aadir cdigo a la rutina multiplica_Callback() del botn definido en
la interfaz:
a = get(handles.m1,'String');
b = get(handles.m2,'String');

Como puede imaginarse , estas dos sentencias asignan a las variables a y b los valores
almacenados por las dos cajas de texto editables.
Las variables a y b guardan cadenas de texto (Strings) que no pueden multiplicarse sin
hacer previamente una conversin explcita a nmero:
total= (str2num(a) * str2num(b));

Una vez realizado el producto debemos convertir de nuevo a cadena de texto este resultado,
para poder asignrselo a la caja de texto esttico que guarda el producto de los dos
nmeros.
c = num2str(total);

La sentencia escrita abajo actualiza el valor de la caja de texto esttica producto con el
valor guardado en c:
set(handles.producto,'String',c);

Para terminar actualizamos la estructura de handles:


guidata(hObject, handles);

Con esta ltima sentencia terminamos el programa, para ejecutarlo basta con teclear el
nombre de la aplicacin sobre la consola de MATLAB, ajustando previamente el path para
que MATLAB pueda localizar los archivos *.fig y *.m de nuestro SW.

Construir una interfaz grfica de usuario (GUI) en


MATLAB. Parte 1 de 2.

December 31st, 2009


By 640kbits

Write comment

En este post tratar de explicar como crear una sencilla interfaz grfica de usuario para
multiplicar 2 nmeros empleando MATLAB , con ello pretendo exponer los conceptos
bsicos de la construccin de GUIs en MATLAB.
El primer paso es lanzar la herramienta guide desde la consola de comandos de
MATLAB:

En el cuadro de dilogo siguiente escoger interfaz de usuario en blanco (Blank GUI):

Se nos mostrar algo parecido a esto:

Crear la apariencia para nuestra aplicacin es muy sencillo usando el editor WYSIWYG de
arriba (WhatYouSeeIfWhatYouGet). Slo tenemos que arrastrar aquellos componentes que
vayamos a utilizar.
Para este sencillo ejemplo son necesarios:

2 componentes de texto editables.

3 componentes de texto esttico.

1 pushbutton.

Ahora es el momento de modificar las propiedades de los componentes aadidos,


empezaremos modificando los componentes de texto esttico (doble click en el
componente) , cambiando el texto que muestran por : x y = ; y modificando el tamao
de dicho texto a 24 unidades:

Para el tercer componente de texto esttico, modificamos el tamao de la letra a 24, el


contenido (String) mostrado a 0 y tambin cambiamos la etiqueta (Tag) que identifica al
componente, llamndolo, por ejemplo, producto.

El siguiente paso es modificar las propiedades de los componentes de texto editables


(multiplicadores) de nuestra sencilla aplicacin, cambiando el valor de String a 0 y el de
Tag a m1 y a m2 , respectivamente para el segundo multiplicador:

Por ltimo debemos cambiar las propiedades del Pushbutton, estableciendo los atributos
String y Tag con el valor Multiplica.
Cambiando adems el tamao estndar del botn , deberamos obtener algo parecido a la
captura de pantalla siguiente:

Una vez hemos construida la interfaz de la aplicacin guardamos el proyecto, con la opcin
Save as, lo que genera dos archivos *.fig y *.m . El *.fig contiene la interfaz
propiamente dicha y el archivo *.m contiene el cdigo o lgica para construir y gobernar
dicha interfaz.

Como implementar redes neuronales multicapa


Backpropagation con el toolkit que ofrece MATLAB.
Parte 3 de 3.

December 31st, 2009


By 640kbits

Write comment

Para controlar de forma ms exhaustiva el entrenamiento de una red de tipo


Backpropagation podemos emplear, por ejemplo, el algoritmo de entrenamiento Batch
Gradient Descent (traingd), cuya explicacin terica se encuentra aqu. En este
procedimiento, los pesos y las ganancias (biases) son actualizados en la direccin del
gradiente negativo del error medio cuadrtico. El algoritmo de entrenamiento del gradiente
descendiente (traingd) cuenta con 7 parmetros de entrada asociados:
1. epochs
2. show
3. goal
4. time

5. min_grad
6. max_fail
7. lr
lr (learning rate): Se trata de una constante que se multiplica al gradiente negativo para
determinar los valores de los nuevos pesos y ganancias, sirve para controlar la velocidad de
convergencia del algoritmo, como ya vimos aqu. Si el radio de aprendizaje es muy grande,
el algoritmo se vuelve inestable; y si el radio de aprendizaje es demasiado pequeo el
algoritmo tarda mucho en converger.
show: Sirve para determinar cada cuantas iteraciones (con que frecuencias) ser mostrado
el estado de entrenamiento. Si show es puesto a NaN, el estado de entrenamiento nunca
es mostrado.
El resto de parmetros determina cuando termina el entrenamiento:
epochs: Determina el nmero mximo de iteraciones que llevar a cabo el algoritmo, si no
se cumple alguna de las condiciones de parada antes.
goal: Si el error cuadrtico medio (ECM) cae por debajo del valor de goal (ejemplo: 1e5 ), ya no se llevan a cabo ms iteraciones.
mingrad: Si la magnitud del gradiente es menor que mingrad, termina el entrenamiento.
time: Si el algoritmo no encuentra la convergencia en el tiempo expresado en segundos por
time finaliza el entrenamiento.
Veamos un ejemplo ,de como entrenar una red Feed Forward mediante Backpropagation
con el algoritmo de gradiente descendiente con el toolkit de MATLAB:
Determinamos las matrices con los parmetros de entrada a la red y los targets o salidas
esperadas:
p = [-1 -1 2 2; 0 5 0 5]; t = [-1 -1 1 1];

Creamos la red Feed Forward:


net = newff(p,t,3,{},'traingd');

Modificamos los valores de entrenamiento de la red por defecto:


net.trainParam.show = 50; net.trainParam.lr = 0.05; net.trainParam.epochs
= 300; net.trainParam.goal = 1e-5;

La sentencia presentada abajo es importante para la simulacin que estamos llevando a


cabo, su cometido es desactivar la divisin ,que hace el toolkit de MATLAB, de los

patrones de entrada en : patrones de entrenamiento, patrones de validacin y patrones de


test. Dado que se emplean pocas entrada, para caracterizar la red neuronal, y todas los
patrones son crticos y necesarios para realizar la generalizacin, no podemos emplear un
subconjunto de estos patrones como entrenamiento, debemos usar todas las muestras como
entradas de entrenamiento:
net.divideFcn ='';

Entrenamos la red:
[net,tr]=train(net,p,t);

Realizamos la simulacin, con los mismos valores de entrada:


a = sim(net,p) a=
-1.0026 -0.9962 1.0010 0.9960

Como implementar redes neuronales multicapa


Backpropagation con el toolkit que ofrece MATLAB.
Parte 2 de 3.

December 31st, 2009


By 640kbits

Write comment

Si el post anterior no cubre tus expectativas, es posible tener un mayor control sobre el
entrenamiento de nuestra red neuronal , para as obtener mejores resultados.
Una primera idea es reiniciar la red y volver a entrenarla (obteniendo as resultados
diferentes, pues, por ejemplo, los valores iniciales de las ganancias y las matrices de
pesos , usados como punto de partida, son diferentes, ofreciendo el mtodo del gradiente
descendiente otra convergencia.) . Para reiniciar la red se usa el comando init:
net = init(net);
net = train(net,houseInput,houseTargets);

Una segunda opcin es incrementar el nmero de neuronas en la capa oculta, esto puede
permitir obtener mejores resultados en la simulacin, pues se cuenta con ms parmetros
para obtener una mejor optimizacin. Sin embargo, existe una cota superior para el nmero
de neuronas en las capa ocultas, demasiadas neuronas podran conseguir que los patrones
de entrada fueran memorizados (overfitting), de manera que ningn tipo de
generalizacin fuera posible, haciendo que la red fuera intil con nuevos datos de entrada.
Aunque el EMC obtenido es muy pequeo, para los patrones de entranamieno, resulta muy

grande cuando nuevos datos son presentados a la red. Nuestra red ha memorizado las
muestras de entrenamiento, pero no ha aprendido el comportamiento a seguir en situaciones
nuevas (patrones de entrada no empleados en la fase de entrenamiento).
Por defecto, las redes entrenadas con Backpropagation transforman, con 3 funciones, los
datos de entrada/salida en los procedimientos sim() y train().
La primera funcin ( fixunknowns() ) recodifica los valores de entrada desconocidos
(unknown), representados por NaN , en valores numricos sobre los que puede operar
directamente la red neuronal.
La segunda funcin ( removeconstantrows() ) elimina aquellas muestras o patrones
repetidos en las entradas a la red, tales entradas no contienen informacin. Por ltimo, la
funcin mapminmax() se encarga de normalizar [0,1] los valores de entrada o de
mapearlos dentro del rango [-1,1]. Las fases de entrenamiento a menudo son ms rpidas
cuando los valores de entrada estn normalizados.
Volviendo de nuevo a la funcin newff() ,que nos permite construir redes neuronales
(Feed Forward), puede observarse que esta rutina requiere al menos tres argumentos de
entrada y devuelve un objeto de tipo red neuronal , como salida. El primer argumento de
entrada es una matriz con los parmetros de entrada a la red (vectores columna); el segundo
argumento lo conforma una matriz con las salidas esperadas (o targets) de la red; el tercer
argumento es un array que contiene el numero de neuronas de cada capa oculta.
La funcin newff() cuenta con ms parmetros opcionales, por ejemplo, el cuarto
argumento puede ser un array con los nombres de las funciones de transferencia usadas en
cada capa (capas ocultas y de salida). El quinto parmetro contiene el nombre de la funcin
de entrenamiento usada para educar la red. Si slo se especifican los tres primeros
parmetros , la funcin de transferencia en las capas ocultas ser tansig y en la capa de
salida purelin. El algoritmo de entrenamiento por defecto es trainlm.
newff(P,T,[S1 S2...S(N-l)],{TF1 TF2...TFNl}, BTF,BLF,PF,IPF,OPF,DDF)

several arguments
P

SN

Si

Size of ith layer, (only hidden layers), default = [ ].


(Output layer size SN is determined from T.)

TFi

Transfer function of ith layer. (Default = 'tansig' for


hidden layers and 'purelin' for output layer.)

BTF

Backpropagation network training function (default = 'trainlm')

BLF

Backpropagation weight/bias learning function (default = 'learngdm')

x Q1 matrix of Q1 sample R-element input vectors


x Q2 matrix of Q2 sample SN-element target vectors

takes

PF

Performance function. (Default = 'mse')

IPF

Row cell array of input processing functions. (Default =


{'fixunknowns','removeconstantrows','mapminmax'})

OPF

Row cell array of output processing functions. (Default =


{'removeconstantrows','mapminmax'})

DDF

Data divison function (default = 'dividerand')

Como implementar redes neuronales multicapa


Backpropagation con el toolkit que ofrece MATLAB.
Parte 1 de 3.

December 31st, 2009


By 640kbits

Write comment

Para entender bien las posibilidades que ofrece el toolkit de MATLAB para redes
neuronales , haremos uso de la gua que proporciona el propio MATLAB.
El primer paso en la construccin de una red supervisada multicapa, entrenada con
Backpropagation, es crear dos vectores columna de entrada que definan, por un lado, los
patrones de entrada a la red y por otro, los valores esperados a la salida, denominados
comnmente targets.
Para esta ocasin vamos a cargar, empleando la consola de MATLAB, un archivo que
contiene unos parmetros de entrenamiento ,de ejemplo, para una red supervisada (vector
de entradas o patrones a la red neuronal y los targets o salidas esperadas). Se trata de 506
parmetros de entrada, cada vector de entrada tiene 13 componentes y cada target un nico
valor de salida. Para cargar en el espacio de trabajo de MATLAB estos datos usamos el
comando load:
load house_dataset;

En el cuadro mostrado debajo pueden verse los 10 primeros parmetros de entrada del
vector de entradas:

Y a continuacin los 10 primeros valores esperados de la red:

Ahora el paso siguiente es crear y entrenar la red hasta que esta sea capaz de comprender la
relacin existente entre los parmetros de entrada y los valores esperados.
La red neuronal ms comn , empleada con la regla de aprendizaje de Backpropagation, es
una red neuronal Feed-Forward, de 3 capas (capa de entrada + capa oculta + capa de
salida). Podemos crear esta red por defecto usando el comando newff :
net = newff(houseInputs,houseTargets,20);

De este modo crearemos la red net , una red neuronal de tres capas (1 capa oculta) con las
tuplas de valores <p,t>, <houseInputs,houseTargets> y 20 neuronas en la capa oculta.
Una vez creada la red, debemos entrenarla con un buen nmero de patrones de entrada:
net = train(net,houseInputs,houseTargets);

El aspecto de la utilidad de entrenamiento de MATLAB es el siguiente:

Si se hace click sobre el botn Performance se puede ver una grfica de la evolucin del
EMC (Error Cuadrtico Medio) con relacin al nmero de iteraciones realizadas por el
algoritmo de entrenamiento.

En la grfica se puede observar como el error medio cuadrtico va disminuyendo, es decir,


como la red neuronal va aprendiendo el comportamiento a seguir. El grfico muestra 3
lneas, esto se debe a que los 506 patrones de entrada son divididos en 3 conjuntos. El 60%
de las muestras se emplean para realizar el entrenamiento, un 20% son empleadas para
validar como de buena es la red entrenada. El entrenamiento de la red continua mientras
se consiga reducir el EMC de los vectores de validacin. El 20% restante de los vectores
sirven para realizar un test, independiente del proceso de generalizacin de la red, con datos
que nunca han sido usados.

Una vez entrenada la red, puede usarse con el conjunto de vectores original.
Para llevar a cabo la simulacin se emplea el siguiente comando:
y = sim(net,houseInputs);

Los 9 primeros valores de salida para la red neuronal simulada son:


26.1053
16.2449

23.0904
14.9396

33.0548

34.3438

33.6690

27.2801

19.2086

Puede observarse que se aproximan, en cierta medida, a los targets esperados.

Das könnte Ihnen auch gefallen