-
Notifications
You must be signed in to change notification settings - Fork 98
/
Copy pathlesson 3. Back propagation.py
54 lines (43 loc) · 2.09 KB
/
lesson 3. Back propagation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import numpy as np
def f(x):
return 2/(1 + np.exp(-x)) - 1
def df(x):
return 0.5*(1 + x)*(1 - x)
W1 = np.array([[-0.2, 0.3, -0.4], [0.1, -0.3, -0.4]])
W2 = np.array([0.2, 0.3])
def go_forward(inp):
sum = np.dot(W1, inp)
out = np.array([f(x) for x in sum])
sum = np.dot(W2, out)
y = f(sum)
return (y, out)
def train(epoch):
global W2, W1
lmd = 0.01 # шаг обучения
N = 10000 # число итераций при обучении
count = len(epoch)
for k in range(N):
x = epoch[np.random.randint(0, count)] # случайных выбор входного сигнала из обучающей выборки
y, out = go_forward(x[0:3]) # прямой проход по НС и вычисление выходных значений нейронов
e = y - x[-1] # ошибка
delta = e*df(y) # локальный градиент
W2[0] = W2[0] - lmd * delta * out[0] # корректировка веса первой связи
W2[1] = W2[1] - lmd * delta * out[1] # корректировка веса второй связи
delta2 = W2*delta*df(out) # вектор из 2-х величин локальных градиентов
# корректировка связей первого слоя
W1[0, :] = W1[0, :] - np.array(x[0:3]) * delta2[0] * lmd
W1[1, :] = W1[1, :] - np.array(x[0:3]) * delta2[1] * lmd
# обучающая выборка (она же полная выборка)
epoch = [(-1, -1, -1, -1),
(-1, -1, 1, 1),
(-1, 1, -1, -1),
(-1, 1, 1, 1),
(1, -1, -1, -1),
(1, -1, 1, 1),
(1, 1, -1, -1),
(1, 1, 1, -1)]
train(epoch) # запуск обучения сети
# проверка полученных результатов
for x in epoch:
y, out = go_forward(x[0:3])
print(f"Выходное значение НС: {y} => {x[-1]}")