Red Neuronal de Matlab Con Arduino
Red Neuronal de Matlab Con Arduino
Red Neuronal de Matlab Con Arduino
Objetivo
Diseñar una red neuronal que simule una compuerta XOR e implementarla en una placa de
Arduino.
Paso 1: Matlab
En Matlab, primero obtendremos los “pesos (w)” y “bias (b)” que se utilizarán para crear una
red neuronal de dos capas y tres neuronas mostrada en la siguiente figura.
Donde:
b son las bias. El sesgo que controla que tan predispuesta esta la neurona a
disparar un 1 o 0 independiente de los pesos.
Vamos a crear la matriz p en Matlab que tendrá las entradas de las compuertas y la matriz t
que tendrá los valores de salida para realizar el entrenamiento de la red neuronal.
Ahora declaramos una variable para nuestra red “net” y con el comando newff vamos a
realizar el entrenamiento con retro propagación.
Donde:
net=newff(minmax(p),[2 1],{'tansig','purelin'},'traincgf');
net=init(net);
net.trainParam.epochs=500;
net.trainParam.goal=1e-6;
net=train(net,p,t);
a=sim(net,p)
pesos1=net.iw{1,1}
bias1=net.b{1,1}
pesos2=net.lw{2,1}
bias2=net.b{2,1}
%-------------------------------------------
Paso 2: Arduino
En el siguiente esquema, se presenta también de forma general la red neuronal a crear, donde
se puede ver las funciones que se aplican entre neuronas (tansig) y la función que se utiliza
para la salida (lineal).
El programa en Arduino para copiar es el siguiente, en el cual las entradas son los puertos 7 y 8
de Arduino y la salida el 13.
//---------------------------------------------------
#include<math.h> //incluida porque necesitamos función tangente
hiperbólica
byte p1,p2;
float n1,n2,n3;
float a1,a2;
float e=2.7182818;
void setup() {
pinMode(7,INPUT);
pinMode(8,INPUT);
pinMode(13,OUTPUT);
Serial.begin(9600);
}
void loop() {
p1=digitalRead(7);
p2=digitalRead(8);
Serial.print(p1);
Serial.print(" ");
Serial.print(p2);
Serial.print(" ");
//Primer neurona = entrada1*(peso 1,1) + entrada2*(peso 1,2) + (bias
1)
n1=p1*(-3.3326)+p2*(-1.9228)+(4.6732);
a1=tansig(n1);
a2=tansig(n2);
//Tercer neurona
n3=a1*(0.7170)+a2*(-1.1662)+(-0.7903);
n3=round(n3); //Redondeo de la salida
digitalWrite(13,n3);
Serial.println(n3);