T10937CAP2
-
Upload
julio-kafir -
Category
Documents
-
view
217 -
download
0
Transcript of T10937CAP2
-
7/22/2019 T10937CAP2
1/46
46
CAPTULO 2
ENTRENAMIENTO Y OPERACIN DE REDES
NEURONALES
2.1 INTRODUCCIN
En el presente captulo se desarrollar una aplicacin que permita estructurar y
entrenar redes neuronales de forma fcil e intuitiva. El propsito de esta tarea es
facilitar el desarrollo de una estructura RNA que pueda comprimir seales de voz.Mediante esta aplicacin se podrn crear y modificar fcilmente redes neuronales,
as como analizar su evolucin.
Este captulo se estructura de la siguiente forma: primero, se explicar y justificar
el lenguaje de programacin empleado; segundo, se detallar la parte del cdigo
referente al tema de inters, que es el funcionamiento de una RNA; tercero, se
crearn y probarn algunas redes de forma que se pueda verificar el correcto
funcionamiento de la aplicacin.
Gran parte del cdigo de la aplicacin est orientado a la interfaz grfica y su
funcin es facilitar el desarrollo de las estructuras, por lo que no ser analizado en
este captulo, sin embargo, se puede observar una gua de usuario en el Anexo A
y una breve explicacin del cdigo en el Anexo B.
2.2 LENGUAJE EMPLEADO
El programa que se desarroll para este trabajo fue realizado con el lenguaje de
programacin C++. El lenguaje C++ es una extensin del lenguaje C que aade al
lenguaje original varias caractersticas, de las cuales es de inters para este
proyecto la programacin orientada a objetos. El proyecto fue elaborado usando
Visual Studio 2003 y los archivos fuente se incluyen en un CD anexado a este
trabajo escrito.
-
7/22/2019 T10937CAP2
2/46
47
2.2.1 DESCRIPCIN Y JUSTIFICACIN DEL LENGUAJE
C++ est considerado por muchos como el lenguaje ms potente, debido a que
permite trabajar tanto a alto como a bajo nivel [7]. Este lenguaje genera, despus
del lenguaje ensamblador y del lenguaje C, el cdigo ms compacto y rpido en
comparacin de otros lenguajes [13], a pesar de que se deba escribir una mayor
cantidad de lneas de cdigo. Se puede utilizar C++ para generar cualquier t ipo de
programas, desde sistemas operativos hasta aplicaciones como la que se
propone en este trabajo. Su ventaja, es que es un lenguaje con varias dcadas de
existencia, estandarizado y que se puede compilar en diferentes entornos.
La caracterstica de mayor inters del lenguaje para este trabajo es que se puede
realizar cdigo que est orientado a objetos. La idea bsica de este tipo de
programacin es agrupar los datos y los procedimientos para manejarlos en una
nica entidad: el objeto [13]. Con este lenguaje se podr, por tanto, crear varios
objetos que representen los diferentes elementos que conforman una RNA, para
luego hacer que interacten simulando el funcionamiento de una red neuronal. La
principal ventaja de esto, es que se puede generar cdigo que representeclaramente las ideas expuestas en el primer captulo, facilitando la comprensin,
tanto del cdigo como de la teora de las RNAs.
2.2.2 FUNDAMENTOS DE LA PROGRAMACIN ORIENTADA A OBJETOS
La programacin orientada a objetos, referida posteriormente como POO, se
caracteriza principalmente por los siguientes conceptos:
Clase: Es una plantilla que define la estructura de un conjunto de objetos, que al
ser creados se llamarn las instancias de la clase. Esta estructura est
compuesta por la definicin de los atributos y la implementacin de las
operaciones (mtodos). [13]
-
7/22/2019 T10937CAP2
3/46
48
Objeto: Es la implementacin de una instancia de clase, es decir, una ocurrencia
de sta, que tiene los atributos definidos por la clase, y sobre la que se pueden
ejecutar las operaciones definidas en ella. [13]
Identidad: Caracterstica de cada objeto que lo diferencia de los dems,
incluyendo a aquellos que pudieran pertenecer a la misma clase y tener los
mismos valores en sus atributos. [13]
Herencia: Es la capacidad que tienen las clases para heredar propiedades y
mtodos de otras clases. [13]
Cada clase, como se mencion, posee atributos y mtodos. Un atributo es
representado dentro de la clase por una variable, la cual incorpora una
caracterstica de la estructura. Un mtodo es representado dentro de la clase por
una funcin, la cual define un procedimiento que puede describir cierto
comportamiento posible para la estructura. Como se ver posteriormente, esto se
adapta perfectamente al modelo de RNA que se desea implementar.
Si se requiere mayor informacin respecto a la POO o respecto al lenguaje en s,
se puede encontrar una referencia adecuada en [7].
2.2.3 ARCHIVOS FUENTE Y ENTORNO DE DESARROLLO
El presente trabajo incluye un CD con archivos fuente, archivos en formato
binario, instaladores y ejemplos que se utilizaron para su realizacin. Estos
archivos se organizan en el CD dentro de las carpetas BINARIOS, CDIGO
FUENTE, DOCUMENTOS y HERRAMIENTAS.
Dentro de la carpeta CDIGO FUENTE se encuentran los archivos fuente de los
programas desarrollados para este trabajo. Para la realizacin de los programas,
se empleo el Entorno Integrado de Desarrollo Microsoft Visual Studio 2003; dentro
-
7/22/2019 T10937CAP2
4/46
49
de este entorno, el proyecto est dividido en varias carpetas que almacenan los
archivos fuente segn las siguientes consideraciones:
BASES: Archivos que contienen el cdigo base del programa
GUI: Archivos que contienen el cdigo para la interfaz grfica
ARCHIVOS: Archivos que contienen cdigo para manipulacin de archivos
EXTRAS: Cabeceras generales para el programa
Para la interfaz grfica se contempla el uso de herramientas externas, como un
editor de texto, un grabador/reproductor de sonidos y un motor de grficos entre
otros. En la carpeta HERRAMIENTAS se incluyen instaladores de algunos
programas de cdigo abierto que se pueden usar como posibles herramientas
para este trabajo.
La carpeta BINARIOS contiene la versin pre-compilada del programa que puede
ser utilizada para no tener que generar el programa desde los archivos fuente. La
carpeta EJEMPLOS contiene archivos con los datos que se emplearon durante la
realizacin del trabajo. La carpeta DOCUMENTOS guarda diversos documentos
de inters, como por ejemplo, una copia digital del presente documento.
Si se desea revisar con mayor detalle los resultados y grficos que se presentan
en este trabajo escrito, es posible usar el contenido del CD adjunto para analizar
con ms facilidad los datos de inters.
2.3 CDIGO BASE PARA EL PROGRAMA
La funcin principal de este programa es permitir manejar y entrenar redes
neuronales artificiales, orientando su desarrollo a generar una estructura capaz de
comprimir una seal de voz. A continuacin se presentar lo que se ha
denominado como cdigo base del programa. Este cdigo es el encargado de
estructurar el sistema en cuestin y modelar su comportamiento.
-
7/22/2019 T10937CAP2
5/46
50
2.3.1 DESCRIPCIN GLOBAL
Primero se explicar de forma global, cmo se model el sistema RNA mediante
el lenguaje C++ y la POO.
2.3.1.1Redes Neuronales Artificiales
En el primer captulo se describi y explic el concepto de una RNA. Esta
estructura fue definida como un conjunto de elementos interconectados entre s,
que presentan un comportamiento sencillo, y que propagan informacin a travs
de la red.
Se indic que cada elemento es conocido como nodo o neurona, y que su
interconexin se realiza mediante enlaces o conexiones. Se explic que cada
neurona se caracteriza por tener dos funciones para procesar su informacin: la
Funcin de Redy la Funcin de Activacin. Estas funciones actuaran sobre la
informacin que les entregue cada una de sus conexiones de entrada. Las
conexiones de entrada se encargaran de transportar la salida de otras neuronasa la neurona de destino. Cada conexin, se caracteriza por un peso que pondera
la importancia relativa de una conexin respecto de otra.
Dados estos conceptos, se decidi abstraer el modelo de la RNA de la siguiente
manera:
Se creara una clase llamada CONEXION, que representara una va de
comunicacin entre dos elementos de la red. Esta clase tendra como atributo, un
valorpeso y como mtodo una funcin excitar. La funcin excitarse encargara de
leer el valor de salida del elemento origen, multiplicar este valor por el peso de la
conexin y entregar el resultado al elemento destino.
Para manejar los elementos mencionados anteriormente, se creara una clase
llamada NEURONA, que representara un elemento dentro de una RNA. Esta
-
7/22/2019 T10937CAP2
6/46
51
clase presentara como atributos, un valor de salida para su instancia y una lista
de CONEXIONES asociada. Como mtodo de la clase NEURONA, se creara la
funcin activar, la cual llama a su vez a dos funciones asociadas a su instancia,
las cuales representan a la Funcin de Red y a la Funcin de Activacin. El
propsito de la funcin activarsera recorrer la lista de CONEXIONES asociada,
llamando por cada una a su respectivo mtodo excitar. De esta forma, cada
instancia de NEURONA ser capaz de obtener la lista de valores de entrada a ser
procesados por las funciones de red y de activacin mencionadas. El mtodo
activardevolver un resultado que se asignar al atributo salida. Este valor, ser
ledo por alguna conexin para poder entregar a otro elemento un valor de
entrada.
Para poder agrupar los diferentes elementos en una red, se creara una clase
llamada RED, que representara una RNA. Esta clase tendra como atributo
principal, una lista de NEURONAS. Su mtodo ms importante sera una funcin
llamada propagar que tiene por objetivo organizar o sincronizar correctamente la
activacin de los diferentes elementos asociados.
Cada clase mencionada tendra ms atributos y mtodos que los mencionados
aqu, pero stos son los ms importantes. A medida que se vaya analizando el
programa, se detallarn y justificarn las caractersticas nuevas.
En las siguientes secciones se presentar y explicar el cdigo que conforma
cada una de las clases mencionadas.
2.3.2 CLASE CONEXION
La Tabla 2.1 presenta el cdigo que declara la clase CONEXION. Esta clase se
encargar de interconectar los diferentes nodos que conformen la red y permitir
que los datos fluyan de un elemento a otro.
-
7/22/2019 T10937CAP2
7/46
52
/* CLASE CONEXIN****************************************** ORIGEN: puntero a valor origen, neurona pre-sinptica** PESO: valor de la conexin - importancia relativa*/class CONEXION
{private:float peso;
float* origen;
public:void conectar(float, NEURONA*);// Establece los valores PESO y ORIGEN
void conectar(float*);// Establece los valores PESO y ORIGEN
float excitar();// Multiplica peso por origen y retorna el res
float addPeso(float);// Modifica el valor del peso de la conexin
NEURONA* getOrigen();// Obtiene la Neurona de origen
};
Tabla 2.1: Declaracin de la clase CONEXION
Esta clase tiene dos atributos privados: el primero es una variable tipo floatque
representa el peso relativo de una instancia de CONEXION respecto de otras; el
nombre de este atributo es peso. El segundo es un puntero a una variable tipo
floaty su nombre es origen; la variable a la que apunta ser el valor de salida de
un nodo de la red simulada.
Existen cinco mtodos en la clase CONEXION, de los cuales el segundo es
sobrecarga del primero. El primer mtodo se llama conectary se encargar de
asignar a una instancia un peso inicial y de indicarle cul es la salida especfica a
la que se conecta. La definicin de este mtodo se presenta en la Tabla 2.2. En
caso de no requerir especificar un valor para el atributo peso, se gener una
sobrecarga de la funcin con la cul solo se especifica el origen, y se asigna
como valor por defecto para peso un valor unitario. Su cdigo se presenta en la
Tabla 2.3.
-
7/22/2019 T10937CAP2
8/46
53
void CONEXION::conectar(float valor, NEURONA* ORIGEN){
peso = valor;if(ORIGEN) origen = &(ORIGEN->salida);
}
Tabla 2.2: Definicin del mtodo CONECTAR de la clase CONEXION
void CONEXION::conectar(float* ORIGEN){
peso = 1;if(ORIGEN) origen = ORIGEN;
}
Tabla 2.3: Sobrecarga del mtodo conectar de la clase CONEXION
El tercer mtodo se llama excitar. Este mtodo se encarga de leer el valor de la
variable apuntada pororigen y de multiplicar su valor por el valorpeso propio de
la instancia. El valor devuelto es el resultado de esta operacin y ser usado por
un elemento de la red como valor de entrada. El cdigo de este mtodo se
muestra en la Tabla 2.4.
float CONEXION::excitar(){
float salida = (*origen)*peso;return salida;
}
Tabla 2.4: Definicin del mtodo excitar de la clase CONEXION
El cuarto mtodo se llama addPeso y su propsito es modificar el peso de una
instancia de la clase CONEXION sumndole un valor diferencial. Esto permitir
entrenar a la red para un propsito especfico, modificando progresivamente los
diferentes pesos de la red. El cdigo asociado se lista en la Tabla 2.5.
-
7/22/2019 T10937CAP2
9/46
54
float CONEXION::addPeso(float delta){
peso+=delta;return peso;
}
Tabla 2.5: Definicin de la clase addPeso de la clase CONEXION
Este mtodo permite tambin obtener el peso actual de una instancia al
establecer el parmetro delta como cero.
Finalmente, el quinto mtodo llamado getOrigen, permite recuperar el puntero
llamado origen de la instancia. La Tabla 2.6 muestra su cdigo asociado.
NEURONA* CONEXION::getOrigen(){
return (NEURONA*)origen;}
Tabla 2.6: Definicin del mtodo getOrigen de la clase CONEXION
2.3.3 CLASE NEURONA
La Tabla 2.7 presenta el cdigo que declara la clase NEURONA.
/*CLASE NEURONA*********************************************salida: Corresponde al origen para una conexin**entradas: Nmero de entradas que tiene la neurona**entrada: Lista de punteros a cada neurona origen**f_red: Funcin de red**f_act: Funcin de activacin*/class NEURONA{private:
float salida;// Valor de salida
Tabla 2.7: Declaracin de la clase NEURONA
-
7/22/2019 T10937CAP2
10/46
55
float bias;// Bias de la neurona
float error;
// Error asignado en entrenamiento
CONEXION* entrada;// Conexin de entrada [Lista]
ENT num_in;// Nmero de entradas
public:friendclass CONEXION;NEURONA():entrada(0), num_in(0), bias(0.0f){};~NEURONA();
float (*f_red)(CONEXION*, int);// Funcin de red o suma
float (*f_act)(float);// Funcin de activacin
bool CrearConexiones(ENT n);// Establece NUM_IN y crea la lista entrada
CONEXION* conexion(ENT n);// Retorna la Nesima CONEXIONfloat repartirErr(float);// Distribuye el error
void repartirErr();// Distribuye el error
float addBias(float);// Modifica el Bias de la Neurona
float activar();// Calcula salida
float leer();// Devuelve salida
ENT getDimEntrada();// Obtiene el nmero de entradas o conexiones};
Tabla 2.7: (Continuacin) Declaracin de la clase NEURONA
Esta clase representa un nodo dentro de la red y hace referencia a la clase
CONEXION antes descrita. Su implementacin es ms compleja y posee siete
atributos. El primero es una variable tipo float llamada salida. Esta variable
almacenar el resultado de los procesos que realice la instancia sobre sus
-
7/22/2019 T10937CAP2
11/46
56
entradas. Esta variable ser leda por diferentes instancias de la clase
CONEXION durante la operacin del programa.
El segundo atributo es otra variable tipo float llamado bias. Esta variable
almacenar el valor bias de la neurona; se pudo haber modelado este valor como
una conexin ms, cuyo valor origen sea siempre igual a uno, pero se prefiri
manejarlo como una caracterstica interna de la neurona.
El tercer atributo es una variable tipo floatllamado error. Este atributo se emplear
durante el proceso de entrenamiento para propagar por la red un error para la
fase de aprendizaje. Se har uso del algoritmo de back-propagation .
A continuacin, existen dos atributos que se encargarn de manejar las entradas
de un elemento tipo NEURONA. El atributo entrada es un puntero a un elemento
tipo CONEXION y se emplea para apuntar al inicio de una lista de elementos tipo
CONEXION; esto debido a que cada nodo de la red manejar por lo general
muchas conexiones. Puesto que el nmero de conexiones es variable, el atributo
tipo ENT (unsigned int) llamado num_in registrar la dimensin de la lista
apuntada porentrada.
Para terminar con los atributos de la clase NEURONA, se definieron dos punteros
a funcin llamados f_redy f_act, que se utilizan para asignar a una instancia de
NEURONA funciones que procesen los datos de entrada a la misma. Con esta
asignacin se puede variar fcilmente en la aplicacin la forma en que operan los
diferentes elementos de la red.
En cuanto a los mtodos de la clase, existen ocho mtodos, un constructor y un
destructor. El constructor es una funcin que se llamar de forma automtica cada
vez que se cree una instancia para la clase NEURONA. Su propsito es inicializar
sus atributos a valores adecuados; su cdigo se muestra en la Tabla 2.8.
-
7/22/2019 T10937CAP2
12/46
57
NEURONA():entrada(0), num_in(0), bias(0.0f){};
Tabla 2.8: Definicin del constructor de la clase NEURONA
Este cdigo indica que cada nueva instancia de NEURONA tendr al inicio un
bias igual a cero, y ninguna entrada en su lista entrada.
El destructor, en cambio, es una funcin que se llama de forma automtica, cada
vez que una instancia de neurona es destruida, o eliminada del programa. Puesto
que el programa reservar de forma dinmica memoria para la creacin de los
diferentes elementos, este destructor se encargar de liberar toda la memoria
reservada por su respectiva instancia. Su cdigo se muestra en la Tabla 2.9.
NEURONA::~NEURONA(){
if(entrada && num_in>1)delete[] entrada;
}
Tabla 2.9: Definicin del destructor de la clase NEURONA
Este cdigo liberar toda la memoria que se reserv para la lista de entradas si
sta existe.
La forma de crear la lista de entradas para una instancia de NEURONA esmediante el mtodo CrearConexiones cuyo parmetro de entrada es el nmero de
conexiones a crear. Esta funcin reservar memoria para alojar la lista de
conexiones necesaria. El cdigo se presenta en la Tabla 2.10.
-
7/22/2019 T10937CAP2
13/46
58
bool NEURONA::CrearConexiones(ENT c){
if(entrada && num_in>1)delete[] entrada;
num_in = 0;if(c==0)returntrue;
entrada = new CONEXION[c];if(entrada==0)
returnfalse;else{
num_in = c;returntrue;
}}
Tabla 2.10: Definicin del mtodo CrearConexiones de la clase NEURONA
El cdigo destruir la lista de entradas previa, de existir dicha lista, y reservar
memoria para la nueva lista. Asignar al atributo num_in el valor adecuado y
retornar una respuesta booleana que indique si se tuvo o no xito.
Si se desea obtener un puntero a la n-sima conexin de la lista para una
determinada instancia, se puede usar el mtodo llamado conexion. El cdigo de
este mtodo se lista en la Tabla 2.11.
CONEXION* NEURONA::conexion(ENT n){
if(n > num_in) return 0;return entrada+n;
}
Tabla 2.11: Definicin del mtodo conexion de la clase NEURONA
Si se especifica un ndice en la lista mayor al nmero total de conexiones que
realmente existen, se retornar un puntero nulo. Para saber cul es la dimensin
de la lista de entradas en un nodo, se puede llamar al mtodo getDimEntrada,
cuyo cdigo se presenta en la Tabla 2.12.
-
7/22/2019 T10937CAP2
14/46
59
ENT NEURONA::getDimEntrada(){
return num_in;}
Tabla 2.12: Definicin del mtodo getDimEntrada de la clase NEURONA
La operacin primaria de la neurona se establece en el mtodo activar cuyo
propsito es recorrer la lista de conexiones asignada a la instancia NEURONA
llamando al mtodo excitar de cada instancia CONEXION encontrada. Este
proceso permite obtener una a una las diferentes entradas al nodo, procesar los
datos y generar una respuesta que se almacena en el atributo salida. Esteproceso no se implementa directamente en el mtodo activar sino que se
distribuye en las funciones de red y activacin asignadas en los atributos f_red y
f_act. Esto permite asignar diferentes procedimientos a cada nodo en la red.
float NEURONA::activar()
{float res = f_red(entrada, num_in);return salida = f_act(res+bias);
}
Tabla 2.13: Definicin del mtodo activarpara la clase NEURONA
Como se puede ver en la Tabla 2.13, la funcin activarse limita a llamar primero a
la funcin f_redasignada a la instancia y procesar su resultado en la funcin f_act
asignada a la instancia. Ntese aqu que en la Funcin de Activacin se toma en
cuenta el valor de bias asignado al nodo, sumndose este valor junto con el valor
devuelto por la Funcin de Red llamada anteriormente. El resultado de la suma se
usa como parmetro de la Funcin de Activacin, y el resultado de esta funcin se
asigna al atributo salida.
-
7/22/2019 T10937CAP2
15/46
60
El valor de salida de cada nodo se puede obtener usando el mtodo leer, cuyo
cdigo se lista en la Tabla 2.14.
float NEURONA::leer(){
return salida;}
Tabla 2.14: Definicin del mtodo leer para la clase NEURONA
Si se desea modificar el valor bias de una instancia NEURONA, se debe usar elmtodo addBias, el cual modifica el valor de bias mediante la suma de un
diferencial delta; su cdigo se presenta en laTabla 2.15.
float NEURONA::addBias(float delta){
bias+=delta;
return bias;}
Tabla 2. 15: Definicin del mtodo addBias para la clase NEURONA
Si se desea saber cul es el valor de bias para un nodo, se puede llamar a esta
funcin con un valor de delta nulo.
Finalmente, existen dos mtodos que permiten calcular y propagar errores por la
red. Puesto que se decidi trabajar con el mtodo de back-propagation para este
proyecto, los mtodos fueron implementados de forma que faciliten dicho proceso.
Estos mtodos se los revisar posteriormente, cuando se detalle el proceso de
entrenamiento implementado.
-
7/22/2019 T10937CAP2
16/46
61
2.3.4 CLASE RNA
A continuacin se describe la clase RNA, creada para representar una red
neuronal artificial.
/*CLASE RNA*********************************************capas: Nmero de capas que tiene la red**nodos: Lista de nodos por capa**total: Nmero total de nodos en la red**red: Lista total de nodos en la red*/class RNA{private:
ENT capas, *nodos, total;
NEURONA* red;
public:RNA(ENT, ENT*);
~RNA();
NEURONA* neurona(ENT,ENT);// Retorna una NEURONA segn sus coordenadas 2D
NEURONA* neurona(ENT);
// Retorna una NEURONA segn su indice.
void propagar(void);// Calcula en secuencia todas las salidas
void corregir();// Modifica el estado segn el error dado
void conectar(SISTEMA**);// Asocio a la red un sistema de E/S de datos
ENT getDimRed();// Obtiene la dimensin de la red
ENT getDimNodos();// Obtiene el nmero de nodos de la red
ENT getDimCapa(ENT c);// Obtiene la dimensin de una capa
ENT getDimConexiones(ENT,ENT);// Obtiene el nmero de conexiones de una Neurona
Tabla 2. 16: Declaracin de la clase RNA
-
7/22/2019 T10937CAP2
17/46
62
ENT getDimConexiones(ENT);// Obtiene el nmero de conexiones de una Neurona
ENT getOrigen(ENT,ENT,ENT, char='i');
// Obtiene el ndice de origen de una conexion
ENT getOrigen(ENT,ENT, char='i');// Obtiene el ndice de origen de una conexion
friendclass SISTEMA;};
Tabla 2.16: (Continuacin) Declaracin de la clase RNA
La clase RNA agrupa el conjunto de elementos que la componen. Estoselementos son en su totalidad objetos de la clase NEURONA. La interconexin de
cada uno de estos nodos se realiza dentro de su respectiva instancia. La clase
RNA se encarga de representar una estructura en capas de los diferentes nodos
que almacena. Tambin ofrece algunos mtodos que se usarn para desarrollar y
entrenar las redes neuronales artificiales.
Los atributos que conforman la clase RNA son cuatro. El principal atributo es unpuntero a un elemento de tipo NEURONA. Este puntero se utilizar para
referenciar la lista de nodos que conforman la red. Esta lista agrupa
absolutamente todos los nodos de la red, sin ordenarlos de forma especfica.
Sin embargo, debido a que se suele organizar a los nodos de una RNA por capas,
se definieron tres atributos que permiten visualizar a estos elementos por capas.
Uno de estos atributos es una variable de tipo ENT llamada capas. Esta variablealmacenar el nmero de capas en que se visualizarn los nodos. Dentro de cada
supuesta capa, se deber especificar el nmero de nodos que sta almacena.
Para ello se utiliza una lista de valores tipo ENT, referenciada por el atributo
nodos, que es un puntero al inicio de la lista. Finalmente, el atributo totalindicar
el nmero total de nodos en la lista red. La forma en que se asignarn los
diferentes nodos a cada supuesta capa es secuencial, es decir, los primeros X1
nodos en la capa 1, los siguientes X2 nodos a la capa 2, etc.
-
7/22/2019 T10937CAP2
18/46
63
En cuanto a los mtodos, existen 14 de ellos, de los cuales uno es un constructor
y otro es un destructor. El constructor toma por parmetros la cantidad de capas
con las que se desea visualizar la red y una lista de nodos por capa. Este
constructor generar las listas de nodos por capa nodos y de NEURONAS red
que manejar la estructura y asignar valores inciales a las diferentes variables;
su cdigo es el siguiente:
RNA::RNA(ENT nc, ENT* nn){
red = NULL;total = 0;
capas = nc;nodos = new ENT[nc];if(nodos==0){
capas=0;return;
}for(ENT i=0; i
-
7/22/2019 T10937CAP2
19/46
64
El mtodo propagar se encarga de que la informacin presente en la red se
propague a travs de la misma. Su cdigo permite que los nodos que se
encuentren en la primera capa lean datos de entrada y los propaguen, generando
resultados que sern a su vez procesados por nodos en capas superiores. El
proceso contina hasta que los nodos de la ltima capa generen un resultado. La
forma en que se ingresan datos a la red y en que se recupera un resultado se
podr ver posteriormente. El cdigo del mtodopropagarse lista en la Tabla 2.19.
void RNA::propagar(){
NEURONA* temp = red;for(ENT i=0; iactivar();
}
Tabla 2.19: Declaracin del mtodo propagar de la clase RNA
Como se puede observar, el cdigo de este mtodo es bastante sencillo, debido a
que la organizacin por capas en realidad no existe. Simplemente se recorre la
lista de nodos que posee la red, llamando en cada nodo a su mtodo activar, quese encarga, como se vio anteriormente, de recorrer su respectiva lista de
conexiones para obtener los valores de entrada, y para luego procesarlos en las
funciones de red y de activacin asignadas.
Los mtodos corregir y conectar se discutirn posteriormente al detallar la
implementacin del proceso de entrenamiento.
El resto de mtodos fueron definidos para permitir obtener datos de la estructura
as como para poder recorrer fcilmente la lista de nodos. Algunos mtodos
fueron sobrecargados para facilitar la comprensin del cdigo. Debido a que su
funcin no es primaria dentro de la operacin misma de una RNA, se omite aqu
su cdigo y se presenta solo una explicacin de qu hace cada mtodo. Se puede
revisar su cdigo en el CD adjunto a este trabajo escrito.
-
7/22/2019 T10937CAP2
20/46
65
El mtodo neurona obtiene un puntero a un nodo dentro de la lista red,
referenciado por su ubicacin por capa y posicin dentro de la capa. Si se utilizan
ndices mayores a los existentes, se considera la ltima capa y/o el ltimo nodo
en la capa. Existe una sobrecarga de este mtodo, pero se referencia la ubicacin
del nodo por su ndice en la lista red.
El mtodo getDimRed retorna el nmero de capas definidas en la red.
El mtodo getDimNodos retorna el nmero total de nodos creados para la red.
El mtodo getDimCapa retorna el nmero de nodos definidos para una
determinada capa. Si se especifica un ndice de capa mayor al definido, se
considera la ltima capa.
El mtodo getDimConexiones retorna el nmero de conexiones que se
establecieron para un determinado nodo. Se referencia al nodo por su ubicacin
por capa y posicin dentro de la capa.
El mtodo getOrigen permite ubicar el origen de la n-sima conexin de un nodo
definido por su ndice dentro de la lista de nodos de la red. Mediante el argumento
tipo se puede especificar si se desea ubicar el origen por la capa en la que se
encuentra, o la posicin dentro de la capa a la que pertenezca. La funcin est
sobrecargada para permitir tambin referirse al nodo de bsqueda por su
ubicacin por capa y posicin dentro de la capa.
2.3.5 CLASE SISTEMA
Hasta ahora se han descrito las clases definidas para representar los diferentes
elementos que conforman una RNA. Las estructuras que se diseen con la
aplicacin debern interactuar con informacin externa y con la aplicacin misma.
Para representar el estado de todo este sistema, se defini una nueva clase, cuyo
cdigo se muestra en la Tabla 2.20.
-
7/22/2019 T10937CAP2
21/46
66
/*CLASE SISTEMA*************************************************num_in: Nmero de datos de entrada al sistema**num_out: Nmero de datos de salida al sistema**entrada: Puntero a lista de datos de entrada
**salida: Puntero a lista de datos de salida**fentrada: Archivo asociado donde estn los datos de entrada**fsalida: Archivo asociado donde estn los datos de salida**ferror: Archivo asociado donde estn los errores generados**red: Puntero a RNA que procesar los datos*/class SISTEMA{private:
ENT num_in, num_out;
float *entrada, *salida;
FILE *fentrada, *fsalida, *ferror;
char *archivo1, *archivo2, *archivo3;
RNA *red;
public:SISTEMA();
~SISTEMA();
SISTEMA(ENT, ENT);
bool abrir();
// Abre los archivos asociados
void cerrar();// Cierra los archivos asociados
char* getArchivo(bool o)// Recupero alguno de los archivos de E/S{
if(o) return archivo1;else return archivo2;
}
bool (*ingresar)(float*, ENT, FILE*);
// Toma un dato del archivo y lo pone en el buffervoid (*egresar)(RNA*, float*, ENT, FILE*);// Toma un dato del buffer y lo pone en el archivo
bool ingreso()// Ejecuta ingresar{
return ingresar(entrada, num_in, fentrada);}
Tabla 2.20: Declaracin de la clase SISTEMA
-
7/22/2019 T10937CAP2
22/46
67
void egreso()// Ejecuta egresar{
egresar(red, salida, num_out, fsalida);
}
bool epoch();// Genera un ciclo de procesamiento
float entrenar();
float calcularError();
void conectar(RNA*);// Conecto el sistema a una RNA
void asociar(char*, char*);
// Asocio al sistema archivos de E/S
friendclass RNA;};
Tabla 2.20: (Continuacin) Declaracin de la clase SISTEMA
Los atributos de esta clase almacenarn el nmero de entradas y salidas del
sistema (num_in y num_out), los datos de entrada y salida (entrada y salida), los
nombres y manejadores de los archivos de donde se leen los datos de entrada yse escriben los datos de salida (archivo1, archivo2, archivo3, fentrada, fsalida y
ferror) y un puntero a la RNA con la que se est trabajando ( red). Adicionalmente,
se tienen dos punteros a funciones ( ingresar y egresar) que se usarn para
manejar la forma en que el sistema obtiene y saca datos de los archivos
seleccionados. Esto permite facilitar el empleo de archivos en diferentes formatos.
Algunos de los mtodos definidos se encargan de interactuar con los atributosdescritos. Por ejemplo, abrir, cerrar, getArchivo y asociar solicitan al sistema
operativo que se maneje de una u otra manera los archivos de datos. Otros
mtodos se encargan de pasar datos desde archivos hacia la red y viceversa;
estos mtodos son ingreso y egreso. El mtodo epoch en cambio, se encarga de
procesar los datos de entrada ingresados y generar los datos de salida a egresar.
Finalmente, los mtodos entrenar y calcularError se utilizarn y describirn en la
fase de entrenamiento de la red.
-
7/22/2019 T10937CAP2
23/46
68
2.3.6 OTROS ELEMENTOS IMPORTANTES
Hasta ahora, se han revisado las clases que permiten estructurar una red
neuronal artificial y hacer que opere. Tambin se revis la clase con la que dicha
red logra interactuar con datos externos, a travs de archivos. Se explic que
algunas de las funciones ms importantes del sistema sern definidas de forma
externa para tener una estructura ms adaptable.
A continuacin se mencionarn otros componentes que se implementaron en la
aplicacin para permitir esta adaptabilidad y para facilitar el desarrollo de la
estructura de inters para este trabajo.
2.3.6.1Funciones de manejo de archivos
Se mencion al describir la clase SISTEMA que la lectura y escritura de datos se
realiza mediante funciones externas asociadas. Este diseo se realiz pensando
en el manejo de archivos de diferentes formatos. De esta forma, se puede usar un
mismo sistema para procesar archivos binarios o en texto sin modificar ladefinicin de la clase en s. Adicionalmente, se puede emplear archivos cuyos
valores numricos estn en diferentes formatos; por ejemplo enteros o punto
flotante.
Las definiciones de estas funciones se encuentran en el archivo de cdigo
llamado archivos.cpp. Este archivo tambin contiene cdigo para otras
funciones, pero las de inters para el presente tema son:
out_float, in_float, out_NPC, in_NPC, out_ent, in_ent, out_txt, in_txt.
Con estas funciones se puede leer o escribir archivos binarios en diferentes
formatos y con diferentes mtodos. Para una explicacin ms detallada de cada
funcin, se puede revisar el archivo cdigo mencionado.
-
7/22/2019 T10937CAP2
24/46
69
2.3.6.2Funciones de red
En la clase NEURONA se indic que se podan asignar diferentes funciones de
red y activacin a cada nodo. Para la Funcin de Red, sin embargo, solo se
implement la funcin suma en la aplicacin, ya que no se requiri otra.
Esta funcin se llama suma y se encuentra en el archivo Funciones.cpp.
2.3.6.3Funcin de Activacin
En la clase NEURONA es til manejar diferentes funciones de activacin ya que
dependiendo de la aplicacin especfica que se desarrolle, puede ser necesario
variar las expresiones asociadas a esta funcin del nodo. En la aplicacin de
entrenamiento desarrollada aqu, se definieron las funciones linealy sigmoidque
se pueden encontrar en el archivo Funciones.cpp. Las ecuaciones para cada una
de estas funciones se presentan en la Tabla 2.21.
Nombre Funcin DescripcinLineal y = a*x + b; a=1, b=0 No modifica la entradaSigmoid y = 1/(1+e-bx), b=1 Derivable, acotada
Tabla 2.21: Funciones de activacin implementadas en el programa
Estas funciones son las ms empleadas en aplicaciones neuronales sencillas.
2.3.6.4Manejo de Formatos
Para facilitar el desarrollo de este trabajo, se implementaron funciones para
manejo de archivos que los conviertan de un formato a otro. Su objetivo es
facilitar y agilizar el anlisis de los datos obtenidos y empleados.
Las funciones permiten pasar de archivos WAV a RAW y vice-versa. Tambin
permiten pasar de una representacin binaria a una representacin ASCII y vice-versa. Estas funciones son: ComponerWav, ExtraerDatos, conv_BIN_TXT,
-
7/22/2019 T10937CAP2
25/46
70
conv_TXT_BIN, normalizar, restablecer, entre otras. Sus definiciones se
encuentran en los archivos Formatos.cpp y AudioFiles.cpp.
2.4 SISTEMA DE ENTRENAMIENTO
La presente seccin presentar el cdigo correspondiente al sistema de
entrenamiento del programa. Este sistema se basa exclusivamente en el mtodo
de back-propagation y considera las dos nicas funciones de transferencia
implementadas que son la funcin lineal y la funcin sigmoid.
2.4.1 ALGORITMO BACK-PROPAGATION
En el primer captulo se explic el algoritmo back-propagation y se indic que su
funcin era determinar en qu medida la salida de una neurona en la red
contribuye para el error obtenido en el resultado y en qu medida se deben
corregir los pesos asociados a su salida para minimizar dicho error.
El programa implementa el algoritmo mencionado mediante funciones encargadas
de organizar los ciclos de entrenamiento, de calcular el error a la salida de la red,
propagar el error por la red y corregir los parmetros de las neuronas para
minimizar el error calculado. A continuacin se presentan cada una de estas
funciones.
2.4.2 INTERCONEXIN A DATOS EXTERNOS
Las estructuras creadas en la aplicacin debern interactuar con datos y archivos
externos. Esta interaccin se iniciar con la interconexin de la red generada con
archivos externos que almacenan los datos de inters. Para realizar esta conexin
se desarroll el mtodo conectaren la clase RNA. Su cdigo asociado se lista en
la Tabla 2.22.
-
7/22/2019 T10937CAP2
26/46
71
void RNA::conectar(SISTEMA** origen){
if(*origen) delete *origen;*origen = new SISTEMA(*nodos,*(nodos+capas-1));
(*origen)->red = this;for(ENT i=0; iCrearConexiones(1);(red+i)->conexion(0)->conectar((*origen)->entrada+i);
}}
Tabla 2.22: Mtodo conectar de la clase RNA
Este mtodo crear una instancia de SISTEMA con buffers de entrada y salidacorrectamente dimensionados y conectar los buffers a las capas de entrada y
salida, de forma que los datos puedan entrar y salir de forma transparente a la red
RNA creada. Los mtodos de la clase SISTEMA ingreso y egreso permitirn llenar
los buffers de la instancia con datos de los archivos de entrada y salida asociados
al sistema. Tras la lectura y escritura de estos datos, se proceder a realizar
ciclos de entrenamiento, tal como se explica a continuacin.
2.4.3 CICLOS DE ENTRENAMIENTO
El ciclo de entrenamiento consta de las siguientes fases:
- Propagacin de los datos a travs de la red
- Clculo del error obtenido a la salida de la red
- Correccin de los parmetros de los nodos
Este ciclo se lo implement dentro de la clase SISTEMA en su mtodo entrenar.
El cdigo de este mtodo se detalla en la Tabla 2.23.
-
7/22/2019 T10937CAP2
27/46
72
float SISTEMA::entrenar(){
float error=0; unsignedint i= 0;fseek(fentrada, 0, SEEK_SET);
while(epoch()){error += calcularError();red->corregir();i++;
}fprintf(ferror, "%f\n", error/i);return error/i;
}
Tabla 2.23: Mtodo entrenar de la clase SISTEMA
La funcin ubica el puntero de lectura del archivo de entrada de datos en el inicio
e ingresa datos a la red hasta que se termine de leer todo el archivo. Con cada
lectura, una vez propagados los datos, se llama al procedimiento calcularError
que calcula el error obtenido a la salida de la red y se inicia el proceso de
correccin de parmetros de la red mediante el mtodo corregir definido en la
clase RNA. Tras recorrer todo el conjunto de datos de entrenamiento, la funcin
retorna con el error promedio obtenido.
2.4.4 CLCULO DE ERROR
El mtodo calcularError de la clase SISTEMA se presenta en la siguiente tabla:
float SISTEMA::calcularError()
{ float error; float e=0;
for(ENT i=0; ineurona(-1, i)->asignarErr(error);e += abs(error);
}return e/num_out;
}
Tabla 2. 24: Mtodo calcularError de la clase SISTEMA
-
7/22/2019 T10937CAP2
28/46
73
2.5 INTERFAZ GRFICA
Como se mencion anteriormente, gran parte del cdigo fue elaborado para la
interfaz grfica de la aplicacin. Este esfuerzo tuvo por objetivo desarrollar un
entorno que facilite el proceso de crear una RNA capaz de comprimir seales de
voz. Se propuso realizar un trabajo de investigacin, por lo que disponer de una
herramienta que permita concentrarse en la elaboracin de las redes y el anlisis
de los datos era esencial.
Los aspectos en los que se enfoc el diseo de la interfaz fueron:
1. Facilidad de la estructuracin y la recuperacin de redes2. Facilidad del manejo de datos3. Facilidad de anlisis del funcionamiento de las redes
Para esto, se desarroll la siguiente interfaz grfica
Figura 2.1: Ventana principal del programa desarrollado
-
7/22/2019 T10937CAP2
29/46
74
Esta ventana consta de un men y una barra de estado que sern de utilidad. La
barra de tareas muestra el nombre de la red con la que se est trabajando, el
nmero de capas y nodos en la red, el estado del sistema (entrenando,
procesando o ninguno de los dos), el error actual en caso de estar entrenando la
red y el nmero de epoch actual en el estado de entrenamiento.
En cuanto al men, ste permite crear redes, guardarlas y recuperarlas; guardar y
cargar un estado para la red; iniciar una ventana para editar la estructura, y
asignarle un sistema de entrada y salida de datos; iniciar un estado de
entrenamiento o de procesado de datos, as como detenerlo; ver la ayuda del
programa y lanzar herramientas externas como editores o un motor grfico para
anlisis. Si se desea ver una referencia de cmo usar la aplicacin, se puede
revisar el Anexo A.
2.5.1 EDITOR DE REDES
Para facilitar el desarrollo del proyecto se program un editor para las estructuras
con las que se trabajara. ste est hecho en la forma de Asistente, donde se
gua al usuario por varios pasos. Las Figuras 2.2 a 2.5 muestran el editor en sus
diferentes etapas.
Figura 2.2: Primera etapa del editor de redes
-
7/22/2019 T10937CAP2
30/46
75
Figura 2.3: Segunda etapa del editor de redes
Figura 2.4: Tercera etapa del editor de redes
Figura 2.5: Cuarta etapa del editor de redes
-
7/22/2019 T10937CAP2
31/46
76
2.5.2 MOTOR GRFICO
Una herramienta importante para el anlisis es un motor grfico, que permita
obtener de forma fcil curvas de aprendizaje o diagramas de la red usada. Como
motor grfico se emple el programa GNUPLOT de cdigo libre. Este motor
permite realizar una gran variedad de grficos y se integr fcilmente a la
aplicacin. Una versin de GNUPLOT se incluye en el CD adjunto a este trabajo
escrito, junto con una copia de su licencia.
Figura 2.6: Ventanas del motor grfico GNUPLOT empleado
2.6 PRUEBA DE FUNCIONAMIENTO BSICO
Una vez diseada la aplicacin, fue indispensable verificar su correcto
funcionamiento. Las pruebas de operacin se realizaron en dos fases; primero, se
prob que el sistema de lectura de datos, procesamiento y escritura de resultados
opere correctamente y segundo, se verific que el sistema de entrenamiento
opere correctamente.
La presente seccin muestra los resultados de la primera fase.
-
7/22/2019 T10937CAP2
32/46
77
2.6.1 APLICACIN ESCOGIDA
Primero, se escogi un sistema adecuado para probar la aplicacin. En esta
primera fase no se tom en cuenta el proceso de entrenamiento, para asegurar
que el procesamiento de informacin sea adecuado. Para esto, se necesitaba un
sistema cuyo funcionamiento sea conocido y predecible. Adicionalmente, se
escogi un sistema interesante y que tuviera relacin con el procesamiento digital
de seales.
La aplicacin escogida fue la Transformada Rpida de Fourier que se explica a
continuacin.
2.6.1.1La Transformada Rpida de Fourier
En procesamiento digital de seales, el dominio de la frecuencia suele ser de gran
inters para los cientficos e ingenieros. Para poder analizar en este dominio una
seal obtenida del mundo fsico, generalmente se debe aplicar sobre la seal
original la transformada de Fourier. Esta transformada, de calcularse mediante lasfrmulas originales planteadas, puede consumir una gran cantidad de recursos
informticos y tiempo de ejecucin. Por ello, un mtodo de cmputo ms eficiente
fue desarrollado; este mtodo se llama Transformada Rpida de Fourier o FFT,
por sus siglas en ingls, y se puede deducir siguiendo diferentes tipos de
razonamientos.
Un anlisis y explicacin de este mtodo se encuentra en [10] y se basa en ladescomposicin de una seal compleja en varias seales ms sencillas de tratar.
La ventaja de este anlisis, es que es fcil de entender y que su cmputo se
adapta perfectamente a una estructura de redes neuronales artificiales. Puesto
que esta transformada es muy conocida y ampliamente implementada en
diferentes entornos, su operacin es predecible y puede ser empleada para
verificar el funcionamiento de la aplicacin desarrollada. Adicionalmente, varios
mtodos de compresin de voz se basan en anlisis del espectro de frecuenciade la seal [16].
-
7/22/2019 T10937CAP2
33/46
78
2.6.1.2Descripcin del mtodo implementado
El principio bsico del mtodo implementado es la descomposicin de una seal
compleja en varias seales simples. La referencia original se puede observar en
[15].
El sistema se encarga de tomar una seal de n muestras, y descomponerla en n
seales de una muestra. Puesto que el espectro de una seal de una sola
muestra es su identidad, la obtencin de los espectros de todas las seales que
conformen la seal original se obtienen inmediatamente. El proceso de
recomposicin de la seal original marcar la forma en que se deben integrar los
diferentes espectros computados. Este proceso resuelve el problema de
componer una seal de n muestras con n seales de una sola muestra.
Para ilustrar el mtodo que se usa, se tomar por ejemplo una seal de 2
muestras con valores [a, c]. Se considerar que esta seal puede componerse
partiendo de dos seales de una sola muestra cada una, ay crespectivamente.
Para esto, se toma la primera seal y se inserta un cero a la derecha, obteniendo
una seal de dos muestras [a, 0]. Lo mismo se hace con la otra seal, pero
insertando un cero a la izquierda y obteniendo una seal de dos muestras [ 0, c].
Al sumar ambas seales, el resultado ser la seal original.
Si se desea componer una seal de 4 muestras, [a, b, c, d], el proceso es el
mismo, pero se realiza en 2 etapas. Primero se parte de las seales cuyos nicos
valores son ay cy se regenera una seal intermedia de valores [a, c]. Por otro
lado, se toman las seales cuyos nicos valores son by dy se regenera una
seal intermedia de valores [b, d]. Luego se insertan ceros en ambas seales
intermedias para obtener las seales de 4 muestras [a, 0, c, 0] y [0, b, 0, d]. La
suma de estas seales corresponder con la seal original.
El proceso de insercin de ceros es muy importante, pues permite emplear una
propiedad de la transformada discreta de Fourier para el cmputo de los nuevos
-
7/22/2019 T10937CAP2
34/46
79
espectros. Esta propiedad estipula que al diluir una seal con ceros, como se
explic en los ejemplos, el nuevo espectro se obtiene multiplicando los espectros
originales segn en esquema presentado a continuacin.
Figura 2.7: Combinacin de espectros para la FFT [12]
Puesto que este proceso es bastante simple y repetitivo, la obtencin del espectro
deseado se logra de forma rpida. El proceso de integracin de los espectros
graficado segn la Figura 2.7 pone en evidencia la posibilidad de implementar el
mtodo mediante redes neuronales, cuya estructura y estado estara determinado
desde un inicio.
Cabe destacar que la implementacin de este mtodo en una estructura tipo red
neuronal permite acelerar an ms la velocidad con la que se obtiene el espectro
total, ya que una RNA se caracteriza por manejar un procesamiento en paralelo
de las operaciones. Gracias a esta propiedad, el cmputo del espectro digital de
una seal de n muestras, solamente tomara 1)(log2 nc ciclos de
procesamiento, tal como se explica en las frmulas de la Tabla 2.25.
Parmetro ValorNmero de muestras nNmero de capas 1)(log2 nc
Nmero de nodos por capa nNmero total de nodos n*cNmero de enlaces 2*n*c
Tabla 2.25: Dimensiones para la red que calcula la FFT
-
7/22/2019 T10937CAP2
35/46
80
2.6.1.3Consideraciones tomadas en la aplicacin
El cdigo que se present previamente para la implementacin de las redes
considera el manejo de datos tipo flotante nicamente. El cmputo de la
transformada rpida de Fourier requiere el manejo de datos de tipo complejo en
todo instante. Para resolver este problema, se poda re-escribir el programa para
emplear datos complejos, pero se prefiri generar una estructura que maneje por
separado la parte real y la parte imaginaria de cada cmputo en nodos separados.
2.6.2 DISEO DE LA RED
La creacin de una red que permita realizar la FFT se implementa en la aplicacin
mediante la funcin makeFFT, que se encuentra en el archivo FFT.cpp. Esta
funcin escribe en un archivo la definicin de una red que pueda realizar los
clculos necesarios. El usuario puede llamar a esta funcin desde una ventana
que se despliega con la opcin: Archivos > Crear > FFT. Esta ventana solicita
como informacin el nmero de muestras a procesar, el nombre del archivo que
almacenar la estructura y el tipo de transformada a calcular: directa o inversa.
La forma en que se genera la red es la siguiente: para transformar seales de n
muestras, se generan 1)(log2 nc capas. De estas capas, la primera se utiliza
para ordenar convenientemente los datos de entrada. Este ordenamiento se debe
al proceso en que se divide consecutivamente la seal en componentes pares e
impares, hasta llegar a tener n seales de 1 sola muestra. Las dems capas se
emplearn para generar el espectro de la seal deseada, combinando losespectros generados en la primera capa hasta obtener el espectro final. Para
cada muestra que se maneje en una capa determinada, se asignarn dos nodos,
uno que genere el valor real de la muestra y otro que genere el valor imaginario.
Cada conexin que se genera de una capa a la siguiente tiene asignado un peso
adecuado. Este peso es, como se mencion anteriormente, un punto en el crculo
geomtrico determinado por el nmero de muestras a combinar. Puesto que los
-
7/22/2019 T10937CAP2
36/46
81
diferentes pesos estn determinados desde un inicio, no es necesario entrenar la
red.
La Figura 2.8 muestra la interfaz a usar en la aplicacin para crear redes que
calculen la FFT, directa o inversa. La Figura 2.9 muestra el esquema de una red
capaz de calcular la FFT de seales de 8 muestras.
Figura 2.8: Interfaz para crear redes que calculen la FFT
Figura 2.9: Esquema de red para calcular la FFT de seales de 8 muestras
-
7/22/2019 T10937CAP2
37/46
82
2.6.3 TRANSFORMADA DIRECTA
Se tomaron como redes de prueba estructuras que pudieran calcular el espectro
de seales de 256 muestras. La estructura generada con la aplicacin se llama
FFT256.rna, y se la puede encontrar en el CD adjunto en la carpeta
ejemplos/FFT. Estas redes se pueden cargar en la aplicacin mediante la opcin
Archivos>Cargar Red.
Para los datos a ser procesados, se generaron archivos de texto con dos seales
conocidas:
Sinusoide.txt: contiene 256 muestras de una sinusoide
SealMuestra.txt contiene 256 muestras de la seal sampling
La Figura 2.10 muestra los grficos obtenidos para estas seales con la
aplicacin, mediante el motor de grficos GNUPLOT.
Figura 2.10: Seales de entrada a la red de ejemplo FFT256
Las seales son procesadas con la estructura creada. La Figura 2.11 muestra los
grficos obtenidos a la salida de la red FFT256 tras excitarla con las seales
graficadas en la Figura 2.10.
n n
yy Seal de entrada 1 Seal de entrada 2
-
7/22/2019 T10937CAP2
38/46
83
Figura 2.11: Seales obtenidas con la red FFT256
Los resultados obtenidos son los esperados; para la seal sinusoidal se
obtuvieron dos impulsos que marcan la frecuencia de la sinusoide, y para la seal
sampling se obtuvo una seal paso en el dominio de la frecuencia. Estos
resultados son bien conocidos en el estudio de la transformada de Fourier.
2.6.4 TRANSFORMADA INVERSA
Para comprobar el correcto funcionamiento del sistema y que los resultados sean
acertados, se puede obtener la transformada mediante otros mtodos o
programas y hacer una comparacin. Otra forma de comprobar los resultados es
calculando la transformada inversa de las seales obtenidas anteriormente.
Puesto que las frmulas de la transformada inversa de Fourier y de la
transformada directa de Fourier son correspondientes, el resultado de procesar
n n
nn
y y
y ySeal de salida 1 Seal de salida 1
Seal de salida 2 Seal de salida 2
-
7/22/2019 T10937CAP2
39/46
84
las seales obtenidas en las pruebas anteriores con la misma red con la que
fueron generadas, debera ser seales correspondientes a las originales.
Se procesaron las seales obtenidas en el experimento anterior con la misma
estructura con la que se procesaron inicialmente y los resultados son los
siguientes:
Figura 2.12: Resultados obtenidos usando nuevamente la red FFT256
Como se puede ver, las seales calculadas son correspondientes a las seales
originales, pero no son idnticas debido a los siguientes dos puntos: primero, las
seales estn escaladas, debido a que la transformada inversa requiere incluir un
factor de escala que en este caso se omiti; segundo, las seales son simtricas
a las originales, debido a la periodicidad y simetra que considera la transformada
de Fourier.
Para tomar en cuenta la simetra de las seales y el factor de escala apropiado,
se puede agregar a la red diseada una capa de ajuste a la salida que permita
calcular correctamente la transformada inversa de Fourier. Esta red se genera
igual que la red anterior pero especificando la opcin inversa en el dilogo. En el
CD adjunto, la red inversa se encuentra en la carpeta ejemplos bajo el nombre
IFFT256.rna.
nn
y ySeal de salida 1 Seal de salida 2
-
7/22/2019 T10937CAP2
40/46
85
Los resultados obtenidos agregando esta capa se grafican en la Figura 2.13, y
como se puede apreciar, corresponden exactamente a las seales originales que
se generaron para realizar la presente prueba.
Figura 2.13: Resultados obtenidos usando la red inversa IFFT256
2.7 PRUEBA DEL SISTEMA DE ENTRENAMIENTO
Una vez que se comprob que el sistema bsico de funcionamiento de las redes
sea correcto, se procedi a verificar el funcionamiento del sistema de
entrenamiento, vital para este proyecto.
2.7.1 APLICACIN ESCOGIDA
Para realizar esta nueva prueba se decidi resolver el problema que en 1970 casi
logra acabar con la investigacin de las redes neuronales; este problema es la
resolucin de la funcin XOR.
En el libro Perceptrons: An Introduction to Computational Geometry, se critic la
imposibilidad de resolver problemas no lineales como la funcin XOR mediante
estructuras como las propuestas por McCulloc y Pitts. Aos despus se descubri
que para resolver problemas complejos como el citado, bastaba con crear redes
que tuvieran capas ocultas.
nn
y ySeal de salida 1 Seal de salida 2
-
7/22/2019 T10937CAP2
41/46
86
La presente seccin entrenar una estructura sencilla para que resuelva el
problema XOR.
2.7.1.1La funcin XOR
La funcin XOR es una de las funciones bsicas de la lgica que se usa en varios
campos de la ingeniera. Toma por argumentos dos expresiones lgicas y genera
una respuesta positiva cuando ambas expresiones dan resultados distintos, y una
respuesta negativa cuando sus resultados concuerdan.
Para ilustrar la no-linealidad del problema, se incluyen mapas bi-dimensionales
que resuelven las funciones AND, OR y XOR
Figura 2.14: Mapas bidireccionales que ilustran los problemas AND, OR y XOR
Como se puede ver en la Figura 2.14, tanto las funciones AND y OR pueden ser
resueltas dividiendo el mapa mediante una lnea recta. En ambos casos, la lnea
separa las opciones en las que se tiene una respuesta negativa y las opciones
que generan una respuesta positiva. El mapa de la funcin XOR no puede ser
resuelto mediante una lnea recta, y debe ser resuelto definiendo una zona en el
mapa que asle las repuestas correctas.
1,1
0,0
1,0
0,1
1,1
0,0
1,0
0,1
1,1
0,0
1,0
0,1
-
7/22/2019 T10937CAP2
42/46
87
2.7.1.2Descripcin de la solucin implementada
La definicin de zonas en mapas de n dimensiones es precisamente lo que se
logra mediante redes neuronales. Dimensionando correctamente el nmero de
nodos por capa y la cantidad de capas ocultas que integran una estructura de
este tipo se logra definir y moldear zonas en espacios n-dimensionales. La
complejidad de esta tarea es la razn por la que no existen frmulas para
determinar la configuracin de las redes y se deba entrenar a las mismas para
que se definan las zonas necesarias de forma experimental.
La solucin para la funcin XOR se realizar con una estructura con al menos una
capa oculta.
2.7.2 DISEO DE LA RED
A continuacin se presentan una estructuras que pueden resolver el problema
XOR.
Figura 2.15: Esquema de red capaz de resolver el problema XOR
-
7/22/2019 T10937CAP2
43/46
88
Esta estructura se cre mediante el editor de redes de la aplicacin, asignando los
siguientes parmetros iniciales:
1.- 3 capas, con 2 nodos en las dos primeras capas y un nodo en la ltima.
2.- Valores de bias igual a 0 en cada nodo.
3.- Funcin lineal para los nodos en la primera capa y sigmoid para los dems.
La primera capa se encarga de leer los datos y pasarlos a la capa oculta, donde la
red determina las caractersticas de la seal que permitirn resolver el problema
XOR. La ltima capa generar el resultado deseado.
Los datos de entrenamiento son las cuatro posibilidades que existen para la
funcin XOR. Estos datos se presentan en la Tabla 2.26 con su correspondiente
resultado esperado:
Par # Par de valores Resultado deseado
1 0 0 0
2 0 1 13 1 0 14 1 1 0
Tabla 2.26: Tabla de entrada/salida para la funcin XOR
Se espera que la red dispare un valor unitario cuando sus entradas sean distintas
y un valor nulo cuando las entradas sean iguales.
2.7.2.1Entrenamiento de la red.
Para entrenar el sistema, se emplea el mtodo de back-propagation, pues este
mtodo es el nico implementado en el programa desarrollado. La funcin que
calcula el error a la salida del sistema tiene el siguiente cdigo:
-
7/22/2019 T10937CAP2
44/46
89
for(ENT i=0; ineurona(-1, i)->asignarErr(error);e += abs(error);
}return e/num_out;
Tabla 2.27: Procedimiento para calcular el error de la red XOR
El error se calcula como la diferencia entre el valor ms adecuado para un caso
particular y la salida real de la red. Se considera como la respuesta ms acertada,
un valor unitario para datos de diferente valor y un valor nulo para datos de igual
valor. El proceso de entrenamiento se inicia mediante la opc in Entrenar red del
men Red.
La estructura evoluciona rpidamente y su entrenamiento se detiene tras 499466
ciclos, pues en este punto su error disminuye lentamente. El error obtenido al final
del entrenamiento es de 1,7039e-3. La Figura 2.16 muestra la evolucin que
present la red durante el entrenamiento.
Figura 2.16: Evolucin de la red XOR.rna durante 499466 ciclos
n
y
error
-
7/22/2019 T10937CAP2
45/46
90
Si se grafican los 10000 primeros ciclos, se puede observar que la red alcanz un
estado adecuado cerca del ciclo 1000 y que luego su estado se fue
perfeccionando para los datos dados. La Figura 2.17 muestra dicho grfico; el
punto de inflexin se encuentra cerca del ciclo 750.
Figura 2.17: Acercamiento al punto de inflexin de la curva de evolucin de la red
Los resultados que se obtienen para el conjunto de datos usados para el
entrenamiento se muestran en la Tabla 2.28.
Par # Par de valores Resultado Obtenido
Ciclo 0 Ciclo 1000 Ciclo 50000
1 0 0 0.707532 0.065094 0.0019572 0 1 0.736775 0.939955 0.9983733 1 0 0.751781 0.939928 0.9983734 1 1 0.809110 0.064682 0.001604
Tabla 2. 28: Resultados obtenidos durante el entrenamiento de la red XOR.rna
Las respuestas son adecuadas y se puede ver como la precisin aumenta a
medida que el sistema se entrena con ms repeticiones. Sin embargo, no se
espera que una red neuronal genere respuestas exactas, sino adecuadas. Por
ello, detener el entrenamiento en el ciclo 1000, tras la inflexin de la curva de
aprendizaje, y usar el estado obtenido en dicho punto es lo ms acertado.
nn
y y errorerror0.6
0.5
0.4
0.3
0.2
0.1
0
0.25
0.2
0.15
0.10
0.05
0 2000 4000 6000 8000 10000 0 200 400 600 800 1000 1200 1400
-
7/22/2019 T10937CAP2
46/46
91
2.8 RESUMEN DE RESULTADOS ALCANZADOS
El desarrollo de esta aplicacin permiti tener una forma rpida y fcil de manejar
RNAs. Gracias a esta aplicacin se podr experimentar libremente en el siguiente
captulo en busca de una red que permita comprimir seales de voz.
El sistema de funcionamiento y entrenamiento de las redes generadas y
empleadas en el programa es correcto. Se pudo comprobar que estructuras
complejas desarrolladas con el programa operan adecuadamente y que las
funciones de entrenamiento de las redes modifican satisfactoriamente los
parmetros de las mismas.
En el siguiente captulo se disearn y entrenarn redes neuronales artificiales
para que permitan comprimir seales de voz.