Advertisement
Guest User

Untitled

a guest
Nov 21st, 2014
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.12 KB | None | 0 0
  1. import math
  2. import random
  3. import numpy
  4.  
  5. random.seed(0)
  6.  
  7. # gera numeros aleatorios obedecendo a regra: a <= rand < b
  8. def criar_linha():
  9. print("-",80)
  10.  
  11. def rand(a, b):
  12. return (b-a) * random.random() + a
  13.  
  14. # nossa funcao sigmoide - gera graficos em forma de S
  15. # funcao tangente hiperbolica
  16. def funcao_ativacao_tang_hip(x):
  17. return math.tanh(x)
  18.  
  19. # derivada da tangente hiperbolica
  20. def derivada_funcao_ativacao(x):
  21. t = funcao_ativacao_tang_hip(x)
  22. return 1 - t**2
  23.  
  24. class RedeNeural:
  25. def __init__(self, nos_entrada, nos_ocultos, nos_saida):
  26. # camada de entrada
  27. self.nos_entrada = nos_entrada + 1 # +1 por causa do no do bias
  28. # camada oculta
  29. self.nos_ocultos = nos_ocultos
  30. # camada de saida
  31. self.nos_saida = nos_saida
  32. # quantidade maxima de interacoes
  33. self.max_interacoes = 1000
  34. # taxa de aprendizado
  35. self.taxa_aprendizado = 0.5
  36.  
  37. # activations for nodes
  38. # cria uma matriz, preenchida com uns, de uma linha pela quantidade de nos
  39. self.ativacao_entrada = numpy.ones(self.nos_entrada)
  40. self.ativacao_ocultos = numpy.ones(self.nos_ocultos)
  41. self.ativacao_saida = numpy.ones(self.nos_saida)
  42.  
  43. # contém os resultados das ativações de saída
  44. self.resultados_ativacao_saida = numpy.ones(self.nos_saida)
  45.  
  46. # criar a matriz de pesos, preenchidas com zeros
  47. self.wi = numpy.zeros((self.nos_entrada, self.nos_ocultos))
  48. self.wo = numpy.zeros((self.nos_ocultos, self.nos_saida))
  49.  
  50. # adicionar os valores dos pesos
  51. # vetor de pesos da camada de entrada - intermediaria
  52. for i in range(self.nos_entrada):
  53. for j in range(self.nos_ocultos):
  54. self.wi[i][j] = rand(-1, 1)
  55.  
  56. # vetor de pesos da camada intermediaria - saida
  57. for j in range(self.nos_ocultos):
  58. for k in range(self.nos_saida):
  59. self.wo[j][k] = rand(-1, 1)
  60.  
  61. def fase_forward(self, entradas):
  62. # input activations: -1 por causa do bias
  63. for i in range(self.nos_entrada - 1):
  64. self.ativacao_entrada[i] = entradas[i]
  65.  
  66. # calcula as ativacoes dos neuronios da camada escondida
  67. for j in range(self.nos_ocultos):
  68. soma = 0
  69. for i in range(self.nos_entrada):
  70. soma = soma + self.ativacao_entrada[i] * self.wi[i][j]
  71. self.ativacao_ocultos[j] = funcao_ativacao_tang_hip(soma)
  72.  
  73. # calcula as ativacoes dos neuronios da camada de saida
  74. # Note que as saidas dos neuronios da camada oculta fazem o papel de entrada
  75. # para os neuronios da camada de saida.
  76. for j in range(self.nos_saida):
  77. soma = 0
  78. for i in range(self.nos_ocultos):
  79. soma = soma + self.ativacao_ocultos[i] * self.wo[i][j]
  80. self.ativacao_saida[j] = funcao_ativacao_tang_hip(soma)
  81.  
  82. return self.ativacao_saida
  83.  
  84.  
  85. def fase_backward(self, saidas_desejadas):
  86. # calcular os gradientes locais dos neuronios da camada de saida
  87. output_deltas = numpy.zeros(self.nos_saida)
  88. erro = 0
  89. for i in range(self.nos_saida):
  90. erro = saidas_desejadas[i] - self.ativacao_saida[i]
  91. output_deltas[i] = derivada_funcao_ativacao(self.ativacao_saida[i]) * erro
  92.  
  93. # calcular os gradientes locais dos neuronios da camada escondida
  94. hidden_deltas = numpy.zeros(self.nos_ocultos)
  95. for i in range(self.nos_ocultos):
  96. erro = 0
  97. for j in range(self.nos_saida):
  98. erro = erro + output_deltas[j] * self.wo[i][j]
  99. hidden_deltas[i] = derivada_funcao_ativacao(self.ativacao_ocultos[i]) * erro
  100.  
  101. # a partir da ultima camada ate a camada de entrada
  102. # os nos da camada atual ajustam seus pesos de forma a reduzir seus erros
  103. for i in range(self.nos_ocultos):
  104. for j in range(self.nos_saida):
  105. change = output_deltas[j] * self.ativacao_ocultos[i]
  106. self.wo[i][j] = self.wo[i][j] + (self.taxa_aprendizado * change)
  107.  
  108. # atualizar os pesos da primeira camada
  109. for i in range(self.nos_entrada):
  110. for j in range(self.nos_ocultos):
  111. change = hidden_deltas[j] * self.ativacao_entrada[i]
  112. self.wi[i][j] = self.wi[i][j] + (self.taxa_aprendizado * change)
  113.  
  114.  
  115. # calcula erro
  116. erro = 0
  117. for i in range(len(saidas_desejadas)):
  118. erro = erro + 0.5 * (saidas_desejadas[i] - self.ativacao_saida[i]) ** 2
  119. return erro
  120.  
  121. def test(self, entradas_saidas):
  122. for p in entradas_saidas:
  123. array = self.fase_forward(p[0])
  124. print("Entradas: " + str(p[0]) + ' - Saída encontrada/fase forward: ' + str(array[0]))
  125.  
  126. def treinar(self, entradas_saidas):
  127. for i in range(self.max_interacoes):
  128. erro = 0
  129. for p in entradas_saidas:
  130. entradas = p[0]
  131. saidas_desejadas = p[1]
  132. self.fase_forward(entradas)
  133. erro = erro + self.fase_backward(saidas_desejadas)
  134. if i % 100 == 0:
  135. print("Erro = %2.3f",erro)
  136.  
  137. def func1(x,y):
  138. result = math.cos(y/100)/(1+(x/100)**2)
  139. return result;
  140.  
  141.  
  142. def iniciar():
  143. MatrizEntrada = numpy.zeros((100, 2))
  144. MatrizSaida = numpy.zeros((100))
  145.  
  146. for x in range(100):
  147. for y in range(2):
  148. MatrizEntrada[x][0] = random.randrange(-10000,10000,1)/10
  149. MatrizEntrada[x][1] = random.randrange(-10000,10000,1)/10
  150. for x in range(100):
  151. MatrizSaida[x] = func1(MatrizEntrada[x][0],MatrizEntrada[x][1])
  152.  
  153. # Ensinar a rede a reconhecer o padrao XOR
  154. entradas_saidas = [
  155. [MatrizEntrada,MatrizSaida]
  156. ]
  157.  
  158. # cria rede neural com duas entradas, duas ocultas e um no de saida
  159. n = RedeNeural(2, 30, 1)
  160. criar_linha()
  161. # treinar com os padrões
  162. n.treinar(entradas_saidas)
  163. # testar
  164. criar_linha()
  165. n.test(entradas_saidas)
  166.  
  167. if __name__ == '__main__':
  168. iniciar()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement