53 lines
1.4 KiB
Python
53 lines
1.4 KiB
Python
import math
|
|
import random
|
|
|
|
def sigmoid(x):
|
|
if x >= 0:
|
|
z = math.exp(-x)
|
|
return 1 / (1 + z)
|
|
else:
|
|
z = math.exp(x)
|
|
return z / (1 + z)
|
|
|
|
def sigmoid_derivative(x):
|
|
s = sigmoid(x)
|
|
return s * (1 - s)
|
|
|
|
class SimpleNN:
|
|
def __init__(self):
|
|
# инициализация весов случайными числами
|
|
self.w1 = random.uniform(-1, 1)
|
|
self.b = random.uniform(-1, 1) # смещение
|
|
self.w_out = random.uniform(-1, 1)
|
|
self.b_out = random.uniform(-1, 1)
|
|
self.lr = 0.001 # скорость обучения
|
|
|
|
def forward(self, x1):
|
|
# прямой проход
|
|
self.z1 = self.w1 * x1 + self.b
|
|
self.a1 = sigmoid(self.z1) # активация скрытого слоя
|
|
self.z2 = self.w_out * self.a1 + self.b_out
|
|
self.a2 = sigmoid(self.z2) # выход сети
|
|
return self.a2
|
|
|
|
def backward(self, x1, y):
|
|
# вычисляем ошибку
|
|
error = self.a2 - y # dL/da2
|
|
|
|
# производные для выходного слоя
|
|
d_out = error * sigmoid_derivative(self.z2)
|
|
self.w_out -= self.lr * d_out * self.a1
|
|
self.b_out -= self.lr * d_out
|
|
|
|
# производные для скрытого слоя
|
|
d_hidden = d_out * self.w_out * sigmoid_derivative(self.z1)
|
|
self.w1 -= self.lr * d_hidden * x1
|
|
self.b -= self.lr * d_hidden
|
|
|
|
def train(self, dataset, answs, epochs=1000):
|
|
for _ in range(epochs):
|
|
for i in range(len(dataset)):
|
|
self.forward(dataset[i])
|
|
self.backward(dataset[i], answs[i])
|
|
|