import numpy as np
def nonlin(x,deriv=False):
if(deriv==True):
return x * (1 - x)
return 1/(1 + np.exp(-x))
X = np.array([[0,0,1],
[0,1,1],
[1,0,1],
[1,1,1]])
y = np.array([[0],
[1],
[1],
[0]])
np.random.seed(1)
# случайно инициализируем веса, в среднем - 0
syn0 = 2*np.random.random((3,4)) - 1
syn1 = 2*np.random.random((4,1)) - 1
for j in xrange(60000):
# проходим вперёд по слоям 0, 1 и 2
l0 = X
l1 = nonlin(np.dot(l0,syn0))
l2 = nonlin(np.dot(l1,syn1))
# как сильно мы ошиблись относительно нужной величины?
l2_error = y - l2
if (j % 10000) == 0:
print "Error:" + str(np.mean(np.abs(l2_error)))
# в какую сторону нужно двигаться?
# если мы были уверены в предсказании, то сильно менять его не надо
l2_delta = l2_error*nonlin(l2,deriv=True)
# как сильно значения l1 влияют на ошибки в l2?
l1_error = l2_delta.dot(syn1.T)
# в каком направлении нужно двигаться, чтобы прийти к l1?
# если мы были уверены в предсказании, то сильно менять его не надо
l1_delta = l1_error * nonlin(l1,deriv=True)
syn1 += l1.T.dot(l2_delta)
syn0 += l0.T.dot(l1_delta)
"""
X — матрица входного набор данных; строки – тренировочные примеры
y – матрица выходного набора данных; строки – тренировочные примеры
l0 – первый слой сети, определённый входными данными
l1 – второй слой сети, или скрытый слой
l2 – финальный слой, это наша гипотеза. По мере тренировки должен приближаться к правильному ответу
syn0 – первый слой весов, Synapse 0, объединяет l0 с l1.
syn1 – второй слой весов, Synapse 1, объединяет l1 с l2.
l2_error – промах сети в количественном выражении
l2_delta – ошибка сети, в зависимости от уверенности предсказания. Почти совпадает с ошибкой, за исключением уверенных предсказаний
l1_error – взвешивая l2_delta весами из syn1, мы подсчитываем ошибку в среднем/скрытом слое
l1_delta – ошибки сети из l1, масштабируемые по увеернности предсказаний. Почти совпадает с l1_error, за исключением уверенных предсказаний
"""
aW1wb3J0IG51bXB5IGFzIG5wCgpkZWYgbm9ubGluKHgsZGVyaXY9RmFsc2UpOgoJaWYoZGVyaXY9PVRydWUpOgogICAgICAgICAgIHJldHVybiB4ICogKDEgLSB4KQoJcmV0dXJuIDEvKDEgKyBucC5leHAoLXgpKQogICAgClggPSBucC5hcnJheShbWzAsMCwxXSwKICAgICAgICAgICAgWzAsMSwxXSwKICAgICAgICAgICAgWzEsMCwxXSwKICAgICAgICAgICAgWzEsMSwxXV0pCiAgICAgICAgICAgICAgICAKeSA9IG5wLmFycmF5KFtbMF0sCgkJCVsxXSwKCQkJWzFdLAoJCQlbMF1dKQoKbnAucmFuZG9tLnNlZWQoMSkKCiMg0YHQu9GD0YfQsNC50L3QviDQuNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdC8INCy0LXRgdCwLCDQsiDRgdGA0LXQtNC90LXQvCAtIDAKc3luMCA9IDIqbnAucmFuZG9tLnJhbmRvbSgoMyw0KSkgLSAxCnN5bjEgPSAyKm5wLnJhbmRvbS5yYW5kb20oKDQsMSkpIC0gMQoKZm9yIGogaW4geHJhbmdlKDYwMDAwKToKCgkjINC/0YDQvtGF0L7QtNC40Lwg0LLQv9C10YDRkdC0INC/0L4g0YHQu9C+0Y/QvCAwLCAxINC4IDIKICAgIGwwID0gWAogICAgbDEgPSBub25saW4obnAuZG90KGwwLHN5bjApKQogICAgbDIgPSBub25saW4obnAuZG90KGwxLHN5bjEpKQoKICAgICMg0LrQsNC6INGB0LjQu9GM0L3QviDQvNGLINC+0YjQuNCx0LvQuNGB0Ywg0L7RgtC90L7RgdC40YLQtdC70YzQvdC+INC90YPQttC90L7QuSDQstC10LvQuNGH0LjQvdGLPwogICAgbDJfZXJyb3IgPSB5IC0gbDIKICAgIAogICAgaWYgKGogJSAxMDAwMCkgPT0gMDoKICAgICAgICBwcmludCAiRXJyb3I6IiArIHN0cihucC5tZWFuKG5wLmFicyhsMl9lcnJvcikpKQogICAgICAgIAogICAgIyDQsiDQutCw0LrRg9GOINGB0YLQvtGA0L7QvdGDINC90YPQttC90L4g0LTQstC40LPQsNGC0YzRgdGPPwogICAgIyDQtdGB0LvQuCDQvNGLINCx0YvQu9C4INGD0LLQtdGA0LXQvdGLINCyINC/0YDQtdC00YHQutCw0LfQsNC90LjQuCwg0YLQviDRgdC40LvRjNC90L4g0LzQtdC90Y/RgtGMINC10LPQviDQvdC1INC90LDQtNC+CiAgICBsMl9kZWx0YSA9IGwyX2Vycm9yKm5vbmxpbihsMixkZXJpdj1UcnVlKQoKICAgICMg0LrQsNC6INGB0LjQu9GM0L3QviDQt9C90LDRh9C10L3QuNGPIGwxINCy0LvQuNGP0Y7RgiDQvdCwINC+0YjQuNCx0LrQuCDQsiBsMj8KICAgIGwxX2Vycm9yID0gbDJfZGVsdGEuZG90KHN5bjEuVCkKICAgIAogICAgIyDQsiDQutCw0LrQvtC8INC90LDQv9GA0LDQstC70LXQvdC40Lgg0L3Rg9C20L3QviDQtNCy0LjQs9Cw0YLRjNGB0Y8sINGH0YLQvtCx0Ysg0L/RgNC40LnRgtC4INC6IGwxPwogICAgIyDQtdGB0LvQuCDQvNGLINCx0YvQu9C4INGD0LLQtdGA0LXQvdGLINCyINC/0YDQtdC00YHQutCw0LfQsNC90LjQuCwg0YLQviDRgdC40LvRjNC90L4g0LzQtdC90Y/RgtGMINC10LPQviDQvdC1INC90LDQtNC+CiAgICBsMV9kZWx0YSA9IGwxX2Vycm9yICogbm9ubGluKGwxLGRlcml2PVRydWUpCgogICAgc3luMSArPSBsMS5ULmRvdChsMl9kZWx0YSkKICAgIHN5bjAgKz0gbDAuVC5kb3QobDFfZGVsdGEpCiAgICAKIiIiClgg4oCUINC80LDRgtGA0LjRhtCwINCy0YXQvtC00L3QvtCz0L4g0L3QsNCx0L7RgCDQtNCw0L3QvdGL0YU7INGB0YLRgNC+0LrQuCDigJMg0YLRgNC10L3QuNGA0L7QstC+0YfQvdGL0LUg0L/RgNC40LzQtdGA0YsKeSDigJMg0LzQsNGC0YDQuNGG0LAg0LLRi9GF0L7QtNC90L7Qs9C+INC90LDQsdC+0YDQsCDQtNCw0L3QvdGL0YU7INGB0YLRgNC+0LrQuCDigJMg0YLRgNC10L3QuNGA0L7QstC+0YfQvdGL0LUg0L/RgNC40LzQtdGA0YsKbDAg4oCTINC/0LXRgNCy0YvQuSDRgdC70L7QuSDRgdC10YLQuCwg0L7Qv9GA0LXQtNC10LvRkdC90L3Ri9C5INCy0YXQvtC00L3Ri9C80Lgg0LTQsNC90L3Ri9C80LgKbDEg4oCTINCy0YLQvtGA0L7QuSDRgdC70L7QuSDRgdC10YLQuCwg0LjQu9C4INGB0LrRgNGL0YLRi9C5INGB0LvQvtC5CmwyIOKAkyDRhNC40L3QsNC70YzQvdGL0Lkg0YHQu9C+0LksINGN0YLQviDQvdCw0YjQsCDQs9C40L/QvtGC0LXQt9CwLiDQn9C+INC80LXRgNC1INGC0YDQtdC90LjRgNC+0LLQutC4INC00L7Qu9C20LXQvSDQv9GA0LjQsdC70LjQttCw0YLRjNGB0Y8g0Log0L/RgNCw0LLQuNC70YzQvdC+0LzRgyDQvtGC0LLQtdGC0YMKc3luMCDigJMg0L/QtdGA0LLRi9C5INGB0LvQvtC5INCy0LXRgdC+0LIsIFN5bmFwc2UgMCwg0L7QsdGK0LXQtNC40L3Rj9C10YIgbDAg0YEgbDEuCnN5bjEg4oCTINCy0YLQvtGA0L7QuSDRgdC70L7QuSDQstC10YHQvtCyLCBTeW5hcHNlIDEsINC+0LHRitC10LTQuNC90Y/QtdGCIGwxINGBIGwyLgpsMl9lcnJvciDigJMg0L/RgNC+0LzQsNGFINGB0LXRgtC4INCyINC60L7Qu9C40YfQtdGB0YLQstC10L3QvdC+0Lwg0LLRi9GA0LDQttC10L3QuNC4CmwyX2RlbHRhIOKAkyDQvtGI0LjQsdC60LAg0YHQtdGC0LgsINCyINC30LDQstC40YHQuNC80L7RgdGC0Lgg0L7RgiDRg9Cy0LXRgNC10L3QvdC+0YHRgtC4INC/0YDQtdC00YHQutCw0LfQsNC90LjRjy4g0J/QvtGH0YLQuCDRgdC+0LLQv9Cw0LTQsNC10YIg0YEg0L7RiNC40LHQutC+0LksINC30LAg0LjRgdC60LvRjtGH0LXQvdC40LXQvCDRg9Cy0LXRgNC10L3QvdGL0YUg0L/RgNC10LTRgdC60LDQt9Cw0L3QuNC5CmwxX2Vycm9yIOKAkyDQstC30LLQtdGI0LjQstCw0Y8gbDJfZGVsdGEg0LLQtdGB0LDQvNC4INC40Lcgc3luMSwg0LzRiyDQv9C+0LTRgdGH0LjRgtGL0LLQsNC10Lwg0L7RiNC40LHQutGDINCyINGB0YDQtdC00L3QtdC8L9GB0LrRgNGL0YLQvtC8INGB0LvQvtC1CmwxX2RlbHRhIOKAkyDQvtGI0LjQsdC60Lgg0YHQtdGC0Lgg0LjQtyBsMSwg0LzQsNGB0YjRgtCw0LHQuNGA0YPQtdC80YvQtSDQv9C+INGD0LLQtdC10YDQvdC90L7RgdGC0Lgg0L/RgNC10LTRgdC60LDQt9Cw0L3QuNC5LiDQn9C+0YfRgtC4INGB0L7QstC/0LDQtNCw0LXRgiDRgSBsMV9lcnJvciwg0LfQsCDQuNGB0LrQu9GO0YfQtdC90LjQtdC8INGD0LLQtdGA0LXQvdC90YvRhSDQv9GA0LXQtNGB0LrQsNC30LDQvdC40LkKIiIi