Redes neuronales en python

Redes neuronales en Python

La siguiente imagen corresponde a la red neuronal que se ha implementado en python, tomando como referencia el curso de redes neuronales del canal de youtube de Javier Garcia.
Para crear el archi datos_espectron.mat del codigo, debemos crear crearlo en matlab siguiendo los siguientes pasos.
  1. crear los pesos y los umbrales con la funcion rand(filas,columnas), por ejemplo para los mesos de la capa 2 seria w2=rand(n2,n3).
  2. Guargar las variables con la funcion save('datos_espectron.mat','w1','w2','w3','u2','u3','u4').
  3. Guardar el archivo.mat junto con el archivo de python
Este es codigo fuente del programa, el funcionamiento se explica en el video:


CODIGO FUENTE DE REDES NEURONALES EN PYTHON

"""
Created on Tue Sep 22 08:31:07 2020

@author: alexp
"""
import numpy as np
import scipy.io as sio
n1=3
n2=16
n3=8
n4=2

#----------------------------------------------------------------------------------
"""
FUNCION QUE CALCULA LA SALIDA DEL ESCPECTRON MULTICAPA
"""
def espectron_salida(x,w1,w2,w3,u2,u3,u4):
    a2=np.zeros(n2)
    a3=np.zeros(n3)
    a4=np.zeros(n4)
    for i in range(0,n2):
        sumax=0
        for j in range(0,n1):
            sumax=sumax+x[j]*w1[j][i]
        a2[i]=f(u2[0][i]+sumax)
    for i in range(0,n3):
        sumax=0
        for j in range(0,n2):
            sumax=sumax+a2[j]*w2[j][i]
        a3[i]=f(u3[0][i]+sumax)
    for i in range(0,n4):
        sumax=0
        for j in range(0,n3):
            sumax=sumax+a3[j]*w3[j][i]
        a4[i]=f(u4[0][i]+sumax)
    return a2,a3,a4
"""
EN ESTA PERTE SE CALCULA LA BAC_PROPAGATION
"""
"""FUNCION QUE CAULCULA LAS VARIACIONES DE SALIDA CON RESPECTO A LOS PESOS"""

def error_parcial_pesos_umbrales(x,s,a2,a3,a4,w1,w2,w3,u2,u3,u4):
    p_e_w1=np.zeros([n1,n2])
    p_e_w2=np.zeros([n2,n3])
    p_e_w3=np.zeros([n3,n4])
    
    p_e_u2=np.zeros(n2)
    p_e_u3=np.zeros(n3)
    p_e_u4=np.zeros(n4)
    for j in range(0,n3):
        for i in range(0,n4):
            p_e_w3[j,i]=a3[j]*(a4[i]-s[i])*a4[i]*(1-a4[i])
            
                
    for k in range(0,n3):
        for  j in range(0,n2):
            sumax=0
            for i in range(0,n4):
                sumax=sumax+w3[k][i]*a4[i]*(1-a4[i])*(a4[i]-s[i])
            p_e_w2[j,k]=a2[j]*a3[k]*(1-a3[k])*sumax
    for k in range(0,n2):
        for j in range(0,n1):
            suma1x=0
            for p in range(0,n3):
                suma2x=0
                for i in range(0,n4):
                    suma2x=suma2x+w3[p][i]*a4[i]*(1-a4[i])*(a4[i]-s[i])
                suma1x=suma1x+w2[k][p]*a3[p]*(1-a3[p])*suma2x
            p_e_w1[j,k]=x[j]*a2[k]*(1-a2[k])*suma1x

    for i in range(0,n4):
        p_e_u4[i]=(a4[i]-s[i])*a4[i]*(1-a4[i])
    for k in range(0,n3):
        sumax=0
        for i in range(0,n4):
            sumax=sumax+w3[k][i]*(a4[i]-s[i])*a4[i]*(1-a4[i])
        p_e_u3[k]=a3[k]*(1-a3[k])*sumax
    for k in range(0,n2):
        sumax2=0
        for p in range(0,n3):
            sumax1=0
            for i in range(0,n4):
                sumax1=sumax1+w3[p][i]*(a4[i]-s[i])*a4[i]*(1-a4[i])
            sumax2=sumax2+w2[k][p]*a3[p]*(1-a3[p])*sumax1
        p_e_u2[k]=a2[k]*(1-a2[k])*sumax2
    
    return p_e_w1,p_e_w2,p_e_w3,p_e_u2,p_e_u3,p_e_u4

"""FUNCION QUE HACE UN REAJUSTE DE LOS PARAMETROS DEL ESPECTRON"""
def reemplazo_pesos_umbrales(alfa,x,s,p_e_w1,p_e_w2,p_e_w3,p_e_u2,p_e_u3,p_e_u4,w1,w2,w3,u2,u3,u4):
    wn1=np.zeros([n1,n2])
    wn2=np.zeros([n2,n3])
    wn3=np.zeros([n3,n4])
    #------------------------------------
    un2=np.zeros(n2)
    un3=np.zeros(n3)
    un4=np.zeros(n4)
    for i in range(0,n4):
        for j in range(0,n3):
            wn3[j,i]=w3[j][i]-alfa*p_e_w3[j,i]
    for i in range(0,n3):
        for j in range(0,n2):
            wn2[j,i]=w2[j][i]-alfa*p_e_w2[j,i]
    for i in range(0,n2):
        for j in range(0,n1):
            wn1[j,i]=w1[j][i]-alfa*p_e_w1[j,i]
    
    for k in range(0,n4):
        un4[k]=u4[0][k]-alfa*p_e_u4[k]
    for k in range(0,n3):
        un3[k]=u3[0][k]-alfa*p_e_u3[k]
    for k in range(0,n2):
        un2[k]=u2[0][k]-alfa*p_e_u2[k]
    
    return wn1,wn2,wn3,un2,un3,un4


"""FUNCION QUE CALCULA LA SALIDA DEL ESPECTRON
   salida_red_neuronal(x)
   x=ENTRADA DEL ESPECTRON 
"""
def salida_red_neuronal(x):
    mat=sio.loadmat('datos_espectron.mat')
    w1=mat['w1']
    w2=mat['w2']
    w3=mat['w3']
    u2=mat['u2']
    u3=mat['u3']
    u4=mat['u4']
    a2,a3,a4=espectron_salida(x,w1,w2,w3,u2,u3,u4)
    return print('La salida es:',a4 )

"""AJUSTE DE LOS PARAMETROS DEL ESPECTRON MULTICAPA U TILIZANDO LAS FUNCIONES CREDAS ANTERIORMENTE"""
"""REAUJUSTANDO DE LOS VALORES CON CADA EJECUCION Y DESPUES LOS NUEVOS PARAMETROS SE GUARDAN"""   
"""back_progation(alfa,x,s)
    alfa=razon de aprendizaje
    x=entrada del espectron multicapa
    s=la salida deseada del espectron
"""   
def back_progation(alfa,x,s):
    mat=sio.loadmat('datos_espectron.mat')
    w1=mat['w1']
    w2=mat['w2']
    w3=mat['w3']
    u2=mat['u2']
    u3=mat['u3']
    u4=mat['u4']
    
    a2,a3,a4=espectron_salida(x,w1,w2,w3,u2,u3,u4)
    p_e_w1,p_e_w2,p_e_w3,p_e_u2,p_e_u3,p_e_u4=error_parcial_pesos_umbrales(x,s,a2,a3,a4,w1,w2,w3,u2,u3,u4)
    wn1,wn2,wn3,un2,un3,un4=reemplazo_pesos_umbrales(alfa,x,s,p_e_w1,p_e_w2,p_e_w3,p_e_u2,p_e_u3,p_e_u4,w1,w2,w3,u2,u3,u4)
    sio.savemat('datos_espectron.mat', {'w1': wn1, 'w2': wn2,'w3':wn3,'u2':un2,'u3':un3,'u4':un4})
    return a4

def f(x):
    funcion=1/(1+ np.exp(-x))
    return funcion

1 Comentarios