Compresión de Imágenes Usando Redes Neuronales IV

download Compresión de Imágenes Usando Redes Neuronales IV

of 40

description

Imagenes

Transcript of Compresión de Imágenes Usando Redes Neuronales IV

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 pxelesreferido 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) = nkdonderk representa el valor de lak-sima intensidad en el intervalo [0, 255] ynk es el nmero de pxeles que posee la intensidadrk ,suponiendo en este caso 256 niveles de grises.

El histograma puede estar normalizado, en tal caso:h(rk) = f(rk) / n = nk / n donden representa el nmero total de pxeles de la imagen.

Para ecualizar el histograma es necesario aplicar la siguiente funcin de distribucin acumulativa:

dondek 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; %%numero maximo de iteraciones

red.trainParam.lr = 0.2; %%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 cargararchivos, 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 tipoimagen, 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 deimagen) 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 digitalesms 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 elvector.

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; %%numero maximo de iteraciones

red.trainParam.lr = 0.2; %%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 elvector.

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 cargararchivos, 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 tipoimagen, 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 deimagen) 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 digitalesms 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.

HYPERLINK "http://www.640kbits.es/wp-content/uploads/2010/01/lenaBinaria.png"

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 errory la iteracin en la que se alcanza.

El empleo de una red multicapa permite solventar losincidentes relacionados con la simulacin deproblemas 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 postanterior ,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 funcinguidata(), 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 rutinamultiplica_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 WYSIWYGde 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 encuentraaqu. 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 vimosaqu. 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: 1e-5), 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.99621.00100.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) takes several arguments

PR xQ1 matrix ofQ1 sampleR-element input vectors

TSN xQ2 matrix ofQ2 sampleSN-element target vectors

SiSize ofith layer, (only hidden layers), default = [ ].(Output layer sizeSN is determined fromT.)

TFiTransfer function ofith layer. (Default ='tansig' forhidden layers and'purelin' for output layer.)

BTFBackpropagation network training function (default ='trainlm')

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

PFPerformance function. (Default ='mse')

IPFRow cell array of input processing functions. (Default = {'fixunknowns','removeconstantrows','mapminmax'})

OPFRow cell array of output processing functions. (Default = {'removeconstantrows','mapminmax'})

DDFData 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 , 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 23.0904 33.0548 34.3438 33.6690 27.2801 19.2086 16.2449 14.9396

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