Advertisement
cardel

Implementacion BackPropagation

Feb 12th, 2019
342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.54 KB | None | 0 0
  1. # encoding: utf-8
  2. # Autor Carlos Delgado.
  3.  
  4. import numpy as np
  5. import math
  6.  
  7. datos = np.array(
  8. [
  9.     [0,0,0,0],
  10.     [0,0,1,1],
  11.     [0,1,0,1],
  12.     [0,1,1,0],
  13.     [1,0,0,1],
  14.     [1,0,1,0],
  15.     [1,1,0,0],
  16.     [1,1,1,1]
  17. ])
  18.  
  19.  
  20.  
  21. def funcionActivacion(x):
  22.     return 1/(1+math.exp(-x))
  23.  
  24. def derivadaFuncionActivacion(x):
  25.     return funcionActivacion(x)*(1-funcionActivacion(x))
  26.  
  27. def redNeuronal(entradas,pesosCapa1, umbralCO, pesosCapa2, umbralCS):
  28.     entradaNetaC1 = np.dot(pesosCapa1,entradas)+(1)*umbralCO
  29.    
  30.     #Vectorizar una función
  31.     #https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html
  32.     f = np.vectorize(funcionActivacion)
  33.    
  34.     #Salida capa 1
  35.     salidaCO = f(entradaNetaC1)
  36.    
  37.     entradaNetaC2 = np.dot(pesosCapa2,salidaCO)+(1)*umbralCS
  38.    
  39.     salidaCS = f(entradaNetaC2)
  40.    
  41.     return salidaCS,salidaCO,entradaNetaC1,entradaNetaC2
  42.  
  43. def calcularErrorCuadraticoMedio(entradas, salidasDeseadas, pesosCO, umbralCO,pesosCS,umbralCS):
  44.    
  45.     numeroDatos = entradas.shape[0]
  46.     errorCM = 0
  47.     for i in range(0, numeroDatos):
  48.         salidaObtenida,salidaCO,entradaCO, entradaCS = redNeuronal(entradas[i,:], pesosCO, umbralCO,pesosCS,umbralCS)
  49.        
  50.         errorCM = errorCM + math.pow(salidasDeseadas[i]-salidaObtenida,2)/2
  51.  
  52.     return errorCM
  53.  
  54. def backPropagation(datos, factorEntrenamiento, maxIteraciones):
  55.    
  56.     df = np.vectorize(derivadaFuncionActivacion)
  57.    
  58.     #1. Inicializar los pesos aleatoriamente entre -1 y 1
  59.     pesosCO = 2*np.random.rand(2,3)-1
  60.     umbralCO = 2*np.random.rand(2)-1
  61.    
  62.     pesosCS = 2*np.random.rand(2)-1
  63.     umbralCS = (2*np.random.rand(1)-1)[0]
  64.    
  65.     entradas = datos[:,0:3]
  66.     salidasEsperadas = datos[:,3]
  67.    
  68.     numeroDatos = entradas.shape[0]
  69.    
  70.     #Calcular el error cuadrático medio
  71.     errorC = 0
  72.     it = 0
  73.     #Regla de actualización de los pesos (para neuronal capa oculta)
  74.     while it < maxIteraciones:
  75.         it = it + 1
  76.         for i in range(0,numeroDatos):
  77.             salidaObtenida,salidaCO,entradaCO, entradaCS = redNeuronal(entradas[i,:], pesosCO, umbralCO,pesosCS,umbralCS)
  78.            
  79.             errorCM = calcularErrorCuadraticoMedio(entradas, salidasEsperadas, pesosCO, umbralCO,pesosCS,umbralCS)
  80.            
  81.             print errorCM
  82.            
  83.             diferencia = salidasEsperadas[i]-salidaObtenida
  84.            
  85.             #Actualizo los pesos de salida
  86.             errorCS = diferencia*df(entradaCS)
  87.             pesosCS[0] = pesosCS[0]+factorEntrenamiento*errorCS*salidaCO[0]
  88.             pesosCS[1] = pesosCS[1]+factorEntrenamiento*errorCS*salidaCO[1]
  89.             umbralCS = umbralCS + factorEntrenamiento*errorCS*(1)
  90.             umbralCS = umbralCS + factorEntrenamiento*errorCS*(1)
  91.            
  92.             #Actualizo los pesos de la capa oculta
  93.            
  94.             errorCO = np.dot(pesosCS,errorCS)*df(entradaCO)
  95.            
  96.             pesosCO[0][0] = pesosCO[0][0] + factorEntrenamiento*errorCO[0]*entradas[i,0]
  97.             pesosCO[0][1] = pesosCO[0][1] + factorEntrenamiento*errorCO[0]*entradas[i,1]
  98.             pesosCO[0][2] = pesosCO[0][2] + factorEntrenamiento*errorCO[0]*entradas[i,2]
  99.            
  100.             pesosCO[1][0] = pesosCO[1][0] + factorEntrenamiento*errorCO[1]*entradas[i,0]
  101.             pesosCO[1][1] = pesosCO[1][1] + factorEntrenamiento*errorCO[1]*entradas[i,1]
  102.             pesosCO[1][2] = pesosCO[1][2] + factorEntrenamiento*errorCO[1]*entradas[i,2]
  103.            
  104.             umbralCO[0] = umbralCO[0]+ factorEntrenamiento*errorCO[0]*(1)
  105.             umbralCO[1] = umbralCO[1]+ factorEntrenamiento*errorCO[1]*(1)
  106.     return pesosCO, umbralCO, pesosCS, umbralCS
  107.  
  108. backPropagation(datos, 0.2,200)
  109. #pesosCapa1 = np.array(
  110.     #[
  111.         #[0.1,0.3,-0.5],
  112.         #[0.3,-0.7,0.8]
  113.     #]
  114. #)
  115.  
  116. #pesosCapa2 = np.array(
  117.     #[0.3,0.6]
  118. #)
  119.  
  120. #umbralC1 = np.array([0.6,0.3])
  121. #umbralC2 = -1.2
  122.  
  123.  
  124. #for i in range(0,8):
  125.     #s = redNeuronal(datosEntrada[i,:], pesosCapa1, umbralC1,pesosCapa2,umbralC2)
  126.     #print(s)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement