sábado, 30 de octubre de 2010

Calculo de las salidas: taller en C++

En este taller nos dedicaremos a mostrar las librerias que utilizaremos en futuro para programar nuestra red neuronal. Ademas de hacer un programa que lea un valor y le aplique la funcion sigmoide, para posteriormente darnos la salida.
Doy por hecho que quien esta interesado en esto sabe compilar un programa escrito en C++, si no es ese el caso dejar un comentario que con gusto respondere segun sea el caso.

Dejo el codigo fuente y paso a explicar una de las funciones que nos interesan:

#include <iostream>
#include <math.h>

float entrada, salida;

using namespace std;

int main(){
cin>>entrada;
salida=1/(1+exp(-1*entrada));
cout<<salida<<endl;
return 0;


Como podreis ver, en el programa se incluye la libreria matematica "math.h" que es una libreria standar en C, y en la linea 10 hacemos una llamada a una funcion de esta libreria, que es la funcion exponencial ( basicamente es el numero de nepper, elevado a la potencia indicada por el argumento de la funcion )


Esta funcion como dijimos antes, da valores de salida que van desde el 0 para numero negativos grandes, y da 1 para numeros positivos grandes. Una curiosidad es que poniendose al centro, pasandole como argumento el 0, obtendremos 0.5 como salida.
Ahora, si queremos obtener un simple perceptron, en el cual le pasamos los datos de ingreso, los pesos sinapticos se inicializan aleatoriamente y da como salida la suma de las entradas por los pesos, aplicandoles la funcion sigmoide, obtendremos un programa de salida como el siguiente:

#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define NUM_ENTRADAS 2

float entrada[NUM_ENTRADAS], 
      pesos[NUM_ENTRADAS],
      salida;
int i;

using namespace std;

int main(){
  srand48(time(NULL));
  for( i=0; i<NUM_ENTRADAS; i++ ){
  pesos[i]=drand48(); //se aplican valores aleatorios a las entradas
  }
  for( i=0; i<NUM_ENTRADAS; i++ ){
    cout<<"Entrada "<<i+1<<": "; 
    cin>>entrada[i]; //se pide al usuario las entradas
  }
  salida=0.0;      //preventivamente se inicia la salida con 0
  for( i=0; i<NUM_ENTRADAS; i++ ){
    salida+=(entrada[i])*(pesos[i]);//se va a la salida la 
  }                                     //suma de las entradas por los pesos
  salida=1/(1+exp(-1*salida));       //se aplica a la salida la funcion sigmoide
  cout<<"Salida: "<<salida<<endl;               //se imprime la salida
  cout<<"Pesos: "<<pesos[1]<<" "<<pesos[2]<<endl; //muestra los pesos usados
  return 0;
}


En este caso es necesario incluir mas librerias, ya que usamos las funciones para generar numeros aleatorios ( srand48() y drand48() ) que estan en la libreria standar "stdlib.h" y para poder generar numeros aleatorios siempre distintos se usa la libreria "time.h", de modo que muy improbablemente se repetira la misma secuencia de numeros aleatorios ( cosa que sucede con el rand() )

1 comentario:

  1. Buena gracias, estoy en redes neuronales y tengo que hacer un programa en matlab, y esto me sirvio para guiarme

    ResponderEliminar