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.
- 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).
- Guargar las variables con la funcion save('datos_espectron.mat','w1','w2','w3','u2','u3','u4').
- Guardar el archivo.mat junto con el archivo de python
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
Este comentario ha sido eliminado por el autor.
ResponderEliminar