Advertisement
Guest User

Untitled

a guest
Dec 15th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.32 KB | None | 0 0
  1.  
  2. import numpy as np
  3. import os
  4. import random
  5. #import keras
  6. import scipy
  7. import math
  8.  
  9.  
  10.  
  11. class MLP(object):
  12. def __init__(self, layers_size, learning_rate, **args):
  13. '''
  14. learning_rate Constante de aprendizaje
  15. layers_size Dimension de los datos de entrada y salida y de las capas intermedias.
  16. ejemplos layers_size
  17. [100, 50, 10] 100 neuronas de entrada, 50 de capa oculta 1 y 10 de salida
  18. [100, 50, 20, 10] 100 neuronas de entrada, 50 de capa oculta 1, 50 de capa oculta 2 y 10 de salida
  19. [100, 50, 20, 50, 10] etc.
  20. '''
  21. matrizSalidas = []
  22. matrizEntradas = []
  23. matrizPesos = []
  24.  
  25. random.randint(0, 2)
  26.  
  27. for i in range(0, len(layers_size)):
  28. if (i != 0):
  29. matrizEntradas.append(np.ones((layers_size[i], layers_size[i - 1] + 1)))
  30. matrizPesos.append(np.ones((layers_size[i], layers_size[i - 1] + 1)))
  31. else:
  32. matrizEntradas.append(np.ones((layers_size[i], 1)))
  33. matrizPesos.append(np.ones((layers_size[i], 1)))
  34. matrizSalidas.append(np.ones((layers_size[i], 1)))
  35.  
  36. for i in range(0, len(layers_size)):
  37. for l in range(0, matrizPesos[i].shape[0]):
  38. for j in range(0, matrizPesos[i].shape[1]):
  39. matrizPesos[i][l, j] = (random.randint(0, 2) - 1)
  40.  
  41. self.learning_rate = learning_rate
  42. self.__dict__.update(args)
  43. # TODO
  44. self.layers_size = layers_size
  45. self.matricesEntrada = matrizEntradas
  46. self.matricesSalidas = matrizSalidas
  47. self.matricesPesos = matrizPesos
  48.  
  49. def fit(self, X_train, y_train, X_Test, y_test):
  50. '''
  51. Recibe los datos de entrada X y los datos de salida esperados y para entrenar el modelo de red neuronal.
  52.  
  53. X Matriz bidimiensional con forma (u,v) donde u es el número de tuplas y v el número de variables
  54. y Vector unidimensional con longitud u que contiene las salidas esperadas para cada una de las tuplas de X
  55. No devuelve nada
  56. '''
  57. # TODO
  58.  
  59.  
  60. if(X_Test == None):
  61. for i in range(150):
  62. actual = self.mse(X_train, y_train)
  63. self.backpropagation(X_train, y_train, actual)
  64. #print(actual)
  65. actual = self.mse(X_train, y_train)
  66. self.backpropagation(X_train, y_train, actual)
  67. anterior = 1000000000
  68. actual = self.mse(X_train, y_train)
  69. while(anterior > actual):
  70. print(actual)
  71. actual = anterior
  72. self.backpropagation(X_train, y_train, actual)
  73. actual = self.mse(X_train, y_train)
  74.  
  75. def backpropagation(self, X, y, mse):
  76. '''
  77. Recibe los datos de entrada X y los datos de salida esperados y para realizar una actualización en batch
  78. de los valores thetas
  79.  
  80. X Matriz bidimiensional con forma (u,v) donde u es el número de tuplas y v el número de variables
  81. y Vector unidimensional con longitud u que contiene las salidas esperadas para cada una de las tuplas de X
  82. No devuelve nada
  83. '''
  84. # TODO
  85. error = self.matricesSalidas
  86. for l in reversed(range(len(self.matricesSalidas))):
  87. if (l==len(self.matricesSalidas)-1):
  88. for i in range(0, self.matricesSalidas[l].shape[1]):
  89. error[l][i, 0] = (y[i]-self.matricesSalidas[l][i, 0])*(self.matricesSalidas[l][i, 0])*(1-self.matricesSalidas[l][i, 0])
  90. else:
  91. for i in range(0, self.matricesSalidas[l].shape[1]-1):
  92. error[l][i, 0] = self.matricesSalidas[l][i, 0]
  93. error[l][i,0] = error[l][i,0]* (1-self.matricesSalidas[l][i, 0])
  94. mult = np.multiply(error[l+1],self.matricesPesos[l+1])
  95. error[l][i,0] = error[l][i,0]*(np.sum(mult, axis=1))[i]
  96.  
  97. for l in range(0, len(error)):
  98. for i in range(0, self.matricesEntrada[l].shape[1]-1):
  99. for j in range(0, self.matricesEntrada[l].shape[0]-1):
  100. suma = self.learning_rate*error[l][i-1,0]
  101. suma = suma*self.matricesEntrada[l][j, i]
  102. self.matricesPesos[l][j,i]=self.matricesPesos[l][j,i]+suma
  103.  
  104.  
  105.  
  106. def sigmoid(self, x):
  107. return 1/(1+math.exp(-x))
  108.  
  109. def sigmoidDeriv(self, x):
  110. return sigmoid(x) * (1 - sigmoid(x))
  111.  
  112. def predict(self, X):
  113. '''
  114. Recibe los datos de entrada X para estimar la salida estimada y_ segun el modelo entrenado
  115.  
  116. X Matriz bidimiensional con forma (u,v) donde u es el número de tuplas y v el número de variables
  117. y Vector unidimensional con longitud u que contiene las salidas esperadas para cada una de las tuplas de X
  118. Devuelve un vector unidimensional y_ de longitud u el cual contiene el conjunto de salidas estimadas para X
  119. '''
  120. # TODO
  121. y=[]
  122. # for i in range(0, len(X)):
  123. # self.matricesSalidas[0]= np.matrix(X[i]).T
  124. for i in range(0, len(X)):
  125. self.matricesSalidas[0][i, 0] = X[i]
  126. #aqui ponemos la primera posicion del array de matrices de salidas lo igualamos a las entradas
  127. for p in range(0):
  128. for l in range(1, len(self.matricesEntrada)):
  129. for i in range(0, self.matricesEntrada[l].shape[0]-1):
  130. for j in range(0, self.matricesEntrada[l].shape[1]-1):
  131. self.matricesEntrada[l][i, j] = self.matricesSalidas[l - 1][j, 0]
  132. nuevoArray=np.sum(np.multiply(self.matricesEntrada[l],self.matricesPesos[l]), axis=1)
  133. for i in range(0,len(nuevoArray)-1):
  134. self.matricesSalidas[l][i,0] = self.sigmoid(nuevoArray[i])
  135.  
  136.  
  137. #self.matricesSalidas[l] = keras.activations.sigmoid(
  138. # np.sum(np.multiply(self.matricesEntrada[l], self.matricesPesos[l]), axis=0))
  139. # for i in range(1, self.matricesSalidas[-1].shape[1]):
  140. # np.concatenate(y, self.matricesSalidas[-1])
  141. y.append(self.matricesSalidas[-1])
  142. return y
  143.  
  144.  
  145. def mse(self, X, y):
  146. '''
  147. Recibe los datos de entrada X y los datos de salida esperados y para obtener el error cuadratico medio
  148. del modelo entrenado
  149.  
  150. X Matriz bidimiensional con forma (u,v) donde u es el número de tuplas y v el número de variables
  151. y Vector unidimensional con longitud u que contiene las salidas esperadas para cada una de las tuplas de X
  152. Devuelve el error cuadratico medio (float)
  153. '''
  154. # TODO
  155. '''
  156. pred = self.predict(X)
  157. numeroTuplas = len(X)
  158. suma = 0
  159. for i in range(numeroTuplas):
  160. suma = suma + ((pred[i] - y[i] ** 2))
  161. errorCuadraticoMedio = float(1 / float(numeroTuplas)) * suma
  162. return errorCuadraticoMedio
  163. '''
  164. hipotesis = self.predict(X)
  165. ErrorCuadraticoMedio = 0
  166. #Recorremos las columnas de nuestro array hipotesis
  167. for i in (range (len(hipotesis))):
  168. #.item en lugar de [i] nos evita bastantes errores
  169. #Aplicamos la fórmula del error cuadrático medio de la diapositiva 6 del tema 3 de regresión
  170. ErrorCuadraticoMedio = ErrorCuadraticoMedio + ((hipotesis[i] - y[i])**2)
  171.  
  172. #Devolvemos el sumatorio entre el número de tuplas
  173. mse = ErrorCuadraticoMedio/X.shape[0]
  174. return np.sum(mse)
  175.  
  176.  
  177.  
  178.  
  179. if __name__ == '__main__':
  180. from sklearn import datasets
  181.  
  182. # X = np.matrix([[0,0], [0,1], [1,0], [1,1]])
  183. # y = np.matrix([[0], [1], [1], [0]])
  184. # j = MLP([2,2,1], 0.5)
  185. # j.fit(X, y, None, None)
  186. # print(j.mse(X, y))
  187.  
  188. X, y = datasets.load_iris(return_X_y=True)
  189. np.random.permutation(list(zip(X,y)))
  190.  
  191. puntoCorte = int(len(X) * 0.7)
  192. X_Train = X[:puntoCorte]
  193. X_Test = X[puntoCorte:]
  194. y_Train = y[:puntoCorte]
  195. y_Test = y[puntoCorte:]
  196. zip(*(X,y))
  197. redIris = MLP([4, 4, 4, 3], 0.9)
  198. redIris.fit(X_Train, y_Train, X_Test, y_Test)
  199. print(redIris.mse(X,y))
  200.  
  201. # j = MLP([2, 2, 1], 0.5)
  202. # print("SalidaXor")
  203. #print(j.predict([0, 1]))
  204. #j.backpropagation([0, 1], [1], 0.5)
  205. #print(j.predict([0, 0]))
  206.  
  207. #redIris = MLP([X.shape[1], 50, 20, 3])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement