fork download
  1. import numpy as np
  2.  
  3. def nonlin(x,deriv=False):
  4. if(deriv==True):
  5. return x * (1 - x)
  6. return 1/(1 + np.exp(-x))
  7.  
  8. X = np.array([[0,0,1],
  9. [0,1,1],
  10. [1,0,1],
  11. [1,1,1]])
  12.  
  13. y = np.array([[0],
  14. [1],
  15. [1],
  16. [0]])
  17.  
  18. np.random.seed(1)
  19.  
  20. # случайно инициализируем веса, в среднем - 0
  21. syn0 = 2*np.random.random((3,4)) - 1
  22. syn1 = 2*np.random.random((4,1)) - 1
  23.  
  24. for j in xrange(60000):
  25.  
  26. # проходим вперёд по слоям 0, 1 и 2
  27. l0 = X
  28. l1 = nonlin(np.dot(l0,syn0))
  29. l2 = nonlin(np.dot(l1,syn1))
  30.  
  31. # как сильно мы ошиблись относительно нужной величины?
  32. l2_error = y - l2
  33.  
  34. if (j % 10000) == 0:
  35. print "Error:" + str(np.mean(np.abs(l2_error)))
  36.  
  37. # в какую сторону нужно двигаться?
  38. # если мы были уверены в предсказании, то сильно менять его не надо
  39. l2_delta = l2_error*nonlin(l2,deriv=True)
  40.  
  41. # как сильно значения l1 влияют на ошибки в l2?
  42. l1_error = l2_delta.dot(syn1.T)
  43.  
  44. # в каком направлении нужно двигаться, чтобы прийти к l1?
  45. # если мы были уверены в предсказании, то сильно менять его не надо
  46. l1_delta = l1_error * nonlin(l1,deriv=True)
  47.  
  48. syn1 += l1.T.dot(l2_delta)
  49. syn0 += l0.T.dot(l1_delta)
  50.  
  51. """
  52. X — матрица входного набор данных; строки – тренировочные примеры
  53. y – матрица выходного набора данных; строки – тренировочные примеры
  54. l0 – первый слой сети, определённый входными данными
  55. l1 – второй слой сети, или скрытый слой
  56. l2 – финальный слой, это наша гипотеза. По мере тренировки должен приближаться к правильному ответу
  57. syn0 – первый слой весов, Synapse 0, объединяет l0 с l1.
  58. syn1 – второй слой весов, Synapse 1, объединяет l1 с l2.
  59. l2_error – промах сети в количественном выражении
  60. l2_delta – ошибка сети, в зависимости от уверенности предсказания. Почти совпадает с ошибкой, за исключением уверенных предсказаний
  61. l1_error – взвешивая l2_delta весами из syn1, мы подсчитываем ошибку в среднем/скрытом слое
  62. l1_delta – ошибки сети из l1, масштабируемые по увеернности предсказаний. Почти совпадает с l1_error, за исключением уверенных предсказаний
  63. """
Success #stdin #stdout 1.84s 25352KB
stdin
Standard input is empty
stdout
Error:0.496410031903
Error:0.00858452565325
Error:0.00578945986251
Error:0.00462917677677
Error:0.00395876528027
Error:0.00351012256786