T10937CAP2

download T10937CAP2

of 46

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.