Первый прототип нейросети готов

This commit is contained in:
2025-08-18 20:04:38 +07:00
parent c301c9f825
commit a3337ef60c
5 changed files with 42 additions and 47 deletions

View File

@@ -1,48 +1,28 @@
import math
import random
from auto_diff import auto_diff
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)
def func_active(x):
return
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 # скорость обучения
self.w_out = auto_diff.Node(random.uniform(-1, 1), label="w_out")
self.b_out = auto_diff.Node(random.uniform(-1, 1), label="b_out")
self.lr = 0.02 # скорость обучения
def forward(self, x1):
def forward(self, x):
# прямой проход
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
self.z1 = self.w_out * x + self.b_out
return self.z1
def backward(self, x1, y):
def backward(self, x, y):
# вычисляем ошибку
error = self.a2 - y # dL/da2
error = (self.z1 - y)**2 # 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
auto_diff.backward(error)
self.w_out = auto_diff.Node(float(self.w_out) - self.lr * self.w_out.grad, label="w_out")
self.b_out = auto_diff.Node(float(self.b_out) - self.lr * self.b_out.grad, label="b_out")
def train(self, dataset, answs, epochs=1000):
for _ in range(epochs):