Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.78 KB | None | 0 0
  1. import math
  2. import random
  3. import numpy
  4. import os
  5.  
  6. random.seed(0)
  7.  
  8. # gera numeros aleatorios obedecendo a regra: a <= rand < b
  9. def criar_linha():
  10. print("-",80)
  11.  
  12. def rand(a, b):
  13. return (b-a) * random.random() + a
  14.  
  15. # nossa funcao sigmoide - gera graficos em forma de S
  16. # funcao tangente hiperbolica
  17. def funcao_ativacao_tang_hip(x):
  18. return math.tanh(x)
  19.  
  20. # derivada da tangente hiperbolica
  21. def derivada_funcao_ativacao(x):
  22. t = funcao_ativacao_tang_hip(x)
  23. return 1 - t**2
  24.  
  25. class RedeNeural:
  26. def __init__(self, nos_entrada, nos_ocultos, nos_saida):
  27. # camada de entrada
  28. self.nos_entrada = nos_entrada + 1 # +1 por causa do no do bias
  29. # camada oculta
  30. self.nos_ocultos = nos_ocultos
  31. # camada de saida
  32. self.nos_saida = nos_saida
  33. # quantidade maxima de interacoes
  34. self.max_interacoes = 1000
  35. # taxa de aprendizado
  36. self.taxa_aprendizado = 0.5
  37.  
  38. # activations for nodes
  39. # cria uma matriz, preenchida com uns, de uma linha pela quantidade de nos
  40. self.ativacao_entrada = numpy.ones(self.nos_entrada)
  41. self.ativacao_ocultos = numpy.ones(self.nos_ocultos)
  42. self.ativacao_saida = numpy.ones(self.nos_saida)
  43.  
  44. # contém os resultados das ativações de saída
  45. self.resultados_ativacao_saida = numpy.ones(self.nos_saida)
  46.  
  47. # criar a matriz de pesos, preenchidas com zeros
  48. self.wi = numpy.zeros((self.nos_entrada, self.nos_ocultos))
  49. self.wo = numpy.zeros((self.nos_ocultos, self.nos_saida))
  50.  
  51. # adicionar os valores dos pesos
  52. # vetor de pesos da camada de entrada - intermediaria
  53. for i in range(self.nos_entrada):
  54. for j in range(self.nos_ocultos):
  55. self.wi[i][j] = rand(-0.2, 0.2)
  56.  
  57. # vetor de pesos da camada intermediaria - saida
  58. for j in range(self.nos_ocultos):
  59. for k in range(self.nos_saida):
  60. self.wo[j][k] = rand(-2.0, 2.0)
  61.  
  62. def fase_forward(self, entradas):
  63. # input activations: -1 por causa do bias
  64. for i in range(self.nos_entrada - 1):
  65. self.ativacao_entrada[i] = entradas[i]
  66.  
  67. # calcula as ativacoes dos neuronios da camada escondida
  68. for j in range(self.nos_ocultos):
  69. soma = 0
  70. for i in range(self.nos_entrada):
  71. soma = soma + self.ativacao_entrada[i] * self.wi[i][j]
  72. self.ativacao_ocultos[j] = funcao_ativacao_tang_hip(soma)
  73.  
  74. # calcula as ativacoes dos neuronios da camada de saida
  75. # Note que as saidas dos neuronios da camada oculta fazem o papel de entrada
  76. # para os neuronios da camada de saida.
  77. for j in range(self.nos_saida):
  78. soma = 0
  79. for i in range(self.nos_ocultos):
  80. soma = soma + self.ativacao_ocultos[i] * self.wo[i][j]
  81. self.ativacao_saida[j] = funcao_ativacao_tang_hip(soma)
  82.  
  83. return self.ativacao_saida
  84.  
  85.  
  86. def fase_backward(self, saidas_desejadas):
  87. # calcular os gradientes locais dos neuronios da camada de saida
  88. output_deltas = numpy.zeros(self.nos_saida)
  89. erro = 0
  90. for i in range(self.nos_saida):
  91. erro = saidas_desejadas[i] - self.ativacao_saida[i]
  92. output_deltas[i] = derivada_funcao_ativacao(self.ativacao_saida[i]) * erro
  93.  
  94. # calcular os gradientes locais dos neuronios da camada escondida
  95. hidden_deltas = numpy.zeros(self.nos_ocultos)
  96. for i in range(self.nos_ocultos):
  97. erro = 0
  98. for j in range(self.nos_saida):
  99. erro = erro + output_deltas[j] * self.wo[i][j]
  100. hidden_deltas[i] = derivada_funcao_ativacao(self.ativacao_ocultos[i]) * erro
  101.  
  102. # a partir da ultima camada ate a camada de entrada
  103. # os nos da camada atual ajustam seus pesos de forma a reduzir seus erros
  104. for i in range(self.nos_ocultos):
  105. for j in range(self.nos_saida):
  106. change = output_deltas[j] * self.ativacao_ocultos[i]
  107. self.wo[i][j] = self.wo[i][j] + (self.taxa_aprendizado * change)
  108.  
  109. # atualizar os pesos da primeira camada
  110. for i in range(self.nos_entrada):
  111. for j in range(self.nos_ocultos):
  112. change = hidden_deltas[j] * self.ativacao_entrada[i]
  113. self.wi[i][j] = self.wi[i][j] + (self.taxa_aprendizado * change)
  114.  
  115.  
  116. # calcula erro
  117. erro = 0
  118. for i in range(len(saidas_desejadas)):
  119. erro = erro + 0.5 * (saidas_desejadas[i] - self.ativacao_saida[i]) ** 2
  120. return erro
  121.  
  122. def test(self, entradas_saidas):
  123. for p in entradas_saidas:
  124. array = self.fase_forward(p[0])
  125. print("Entradas: " + str(p[0]) + ' - Saída encontrada/fase forward: ' + str(array[0]))
  126.  
  127. def treinar(self, entradas_saidas):
  128. for i in range(self.max_interacoes):
  129. erro = 0
  130. for p in entradas_saidas:
  131. entradas = p[0]
  132. saidas_desejadas = p[1]
  133. self.fase_forward(entradas)
  134. erro = erro + self.fase_backward(saidas_desejadas)
  135. if i % 100 == 0:
  136. print("Erro = %2.3f",erro)
  137.  
  138.  
  139. def iniciar():
  140.  
  141. # Ensinar a rede a reconhecer o padrao XOR
  142. entradas_saidas = [
  143. [[ -0.02 , 0.94 ], [ 0.999955780327 ]],
  144. [[ 0.07 , -0.9 ], [ 0.999959010293 ]],
  145. [[ -0.34 , 0.3 ], [ 0.999983940189 ]],
  146. [[ 0.24 , 0.03 ], [ 0.999994195033 ]],
  147. [[ -0.23 , 0.22 ], [ 0.999992290042 ]],
  148. [[ -0.09 , 0.49 ], [ 0.999987185034 ]],
  149. [[ -0.45 , 0.29 ], [ 0.999975545498 ]],
  150. [[ -0.65 , -0.28 ], [ 0.999953831953 ]],
  151. [[ -0.65 , 0.93 ], [ 0.999914508924 ]],
  152. [[ -0.76 , 0.58 ], [ 0.999925424355 ]],
  153. [[ -0.36 , 0.36 ], [ 0.999980560259 ]],
  154. [[ 0.8 , 0.54 ], [ 0.999921425064 ]],
  155. [[ -0.63 , -0.21 ], [ 0.999958106664 ]],
  156. [[ -0.75 , 0.86 ], [ 0.999906775472 ]],
  157. [[ -0.82 , 0.75 ], [ 0.999904641544 ]],
  158. [[ -0.16 , 0.2 ], [ 0.999995440012 ]],
  159. [[ 0.43 , -0.75 ], [ 0.999953385994 ]],
  160. [[ -0.1 , 0.11 ], [ 0.999998395002 ]],
  161. [[ -0.2 , 0.56 ], [ 0.99998032012 ]],
  162. [[ 0.63 , -0.48 ], [ 0.999948792055 ]],
  163. [[ 0.41 , 0.22 ], [ 0.999980770324 ]],
  164. [[ 0.13 , 0.33 ], [ 0.999992865017 ]],
  165. [[ -0.34 , -0.85 ], [ 0.999952315769 ]],
  166. [[ 0.4 , -0.97 ], [ 0.999936956378 ]],
  167. [[ -0.77 , 0.84 ], [ 0.999905435814 ]],
  168. [[ 0.02 , 0.81 ], [ 0.999967155181 ]],
  169. [[ 0.71 , 0.6 ], [ 0.999931593502 ]],
  170. [[ -1.0 , 0.56 ], [ 0.999884331608 ]],
  171. [[ 0.26 , -0.15 ], [ 0.999992115054 ]],
  172. [[ -0.38 , 0.86 ], [ 0.99994858097 ]],
  173. [[ -0.17 , 0.8 ], [ 0.999965110271 ]],
  174. [[ -0.84 , -0.52 ], [ 0.999915925963 ]],
  175. [[ 0.45 , -0.44 ], [ 0.999970070622 ]],
  176. [[ -0.39 , -0.64 ], [ 0.999964310613 ]],
  177. [[ 0.39 , 0.14 ], [ 0.999983810246 ]],
  178. [[ -0.77 , -0.8 ], [ 0.999908715583 ]],
  179. [[ -0.19 , 0.3 ], [ 0.999991890033 ]],
  180. [[ 0.25 , -0.73 ], [ 0.999967105324 ]],
  181. [[ -0.23 , 0.41 ], [ 0.999986305084 ]],
  182. [[ -0.26 , 0.8 ], [ 0.999961240433 ]],
  183. [[ -0.69 , 0.4 ], [ 0.999944392658 ]],
  184. [[ -0.15 , 0.38 ], [ 0.99999053003 ]],
  185. [[ -0.48 , 0.54 ], [ 0.999962380902 ]],
  186. [[ 0.4 , 0.5 ], [ 0.999971500482 ]],
  187. [[ -0.27 , 0.13 ], [ 0.999991865059 ]],
  188. [[ -0.77 , 0.52 ], [ 0.999927194347 ]],
  189. [[ -0.02 , -0.19 ], [ 0.999998155001 ]],
  190. [[ 0.47 , -0.39 ], [ 0.999970305666 ]],
  191. [[ -0.26 , -0.53 ], [ 0.999979195174 ]],
  192. [[ -0.52 , -0.53 ], [ 0.999958916144 ]],
  193. [[ -0.92 , 0.56 ], [ 0.999899688531 ]],
  194. [[ 0.68 , -0.34 ], [ 0.999947982411 ]],
  195. [[ 0.21 , -0.83 ], [ 0.999961145369 ]],
  196. [[ -0.78 , 0.73 ], [ 0.999912520441 ]],
  197. [[ 0.93 , -0.67 ], [ 0.999891074505 ]],
  198. [[ -0.62 , -0.91 ], [ 0.999920158355 ]],
  199. [[ -0.8 , 0.79 ], [ 0.999904801255 ]],
  200. [[ 0.38 , 0.74 ], [ 0.999958180729 ]],
  201. [[ 0.0 , 0.8 ], [ 0.999968000171 ]],
  202. [[ 0.34 , -0.3 ], [ 0.999983940189 ]],
  203. [[ 0.33 , -0.4 ], [ 0.999981110216 ]],
  204. [[ -0.45 , 0.73 ], [ 0.999953106068 ]],
  205. [[ 0.5 , 0.07 ], [ 0.999974755631 ]],
  206. [[ 0.48 , -0.3 ], [ 0.999972460638 ]],
  207. [[ 0.15 , 0.26 ], [ 0.999994370015 ]],
  208. [[ 0.69 , 0.64 ], [ 0.999931913312 ]],
  209. [[ 0.79 , -0.09 ], [ 0.99993718892 ]],
  210. [[ -0.79 , -0.17 ], [ 0.999936148985 ]],
  211. [[ 0.56 , -0.71 ], [ 0.99994343688 ]],
  212. [[ 0.24 , 0.5 ], [ 0.999981740131 ]],
  213. [[ 0.61 , -0.15 ], [ 0.999961666427 ]],
  214. [[ -0.52 , -0.38 ], [ 0.999965740935 ]],
  215. [[ -0.96 , 0.87 ], [ 0.999870007219 ]],
  216. [[ -0.31 , -0.71 ], [ 0.99996518544 ]],
  217. [[ 0.8 , -0.44 ], [ 0.999926324731 ]],
  218. [[ -0.05 , -0.57 ], [ 0.999983505048 ]],
  219. [[ -0.15 , 0.09 ], [ 0.999997345006 ]],
  220. [[ -0.85 , -0.75 ], [ 0.999899632383 ]],
  221. [[ -0.63 , 0.78 ], [ 0.999929892937 ]],
  222. [[ -0.44 , -0.89 ], [ 0.999941036403 ]],
  223. [[ 0.46 , 0.62 ], [ 0.999959620916 ]],
  224. [[ 0.36 , 0.54 ], [ 0.999972460392 ]],
  225. [[ 0.74 , -0.82 ], [ 0.999911625028 ]],
  226. [[ -0.94 , -0.69 ], [ 0.999887845004 ]],
  227. [[ 0.62 , -0.52 ], [ 0.999948042028 ]],
  228. [[ 0.55 , 0.47 ], [ 0.999958706269 ]],
  229. [[ -0.7 , 0.0 ], [ 0.999951002401 ]],
  230. [[ -0.77 , -0.06 ], [ 0.999940533526 ]],
  231. [[ -0.71 , -0.91 ], [ 0.999908189914 ]],
  232. [[ 0.55 , -0.95 ], [ 0.999924627619 ]],
  233. [[ -0.51 , -0.53 ], [ 0.999959946075 ]],
  234. [[ 0.83 , -0.69 ], [ 0.99990731148 ]],
  235. [[ 0.22 , -0.47 ], [ 0.999984115097 ]],
  236. [[ 0.86 , -0.85 ], [ 0.999889923359 ]],
  237. [[ 0.73 , -0.95 ], [ 0.999901590584 ]],
  238. [[ 0.39 , 0.08 ], [ 0.999984470236 ]],
  239. [[ 0.58 , -0.75 ], [ 0.99993823721 ]],
  240. [[ -0.34 , -0.83 ], [ 0.99995399573 ]],
  241. [[ -0.44 , -0.82 ], [ 0.999947021214 ]],
  242. [[ 0.65 , -0.23 ], [ 0.999955106898 ]]
  243. ]
  244.  
  245. # cria rede neural com duas entradas, duas ocultas e um no de saida
  246. n = RedeNeural(2, 2, 1)
  247. criar_linha()
  248. # treinar com os padrões
  249. n.treinar(entradas_saidas)
  250. # testar
  251. criar_linha()
  252. n.test(entradas_saidas)
  253.  
  254. if __name__ == '__main__':
  255. iniciar()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement