Друзья, готовлю крупный крутецкий пост, наберитесь терпения 🙏 🙏
Please open Telegram to view this post
VIEW IN TELEGRAM
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def deriv_sigmoid(x):
fx = sigmoid(x)
return fx * (1 - fx)
Please open Telegram to view this post
VIEW IN TELEGRAM
class OurNeuralNetwork:
def __init__(self): — здесь init это конструктор класса, он вызывается автоматически при создании объекта (он задачет случайные веса и смещения для нашей нейросетки)def __init__(self):
self.w1 = np.random.normal()
self.w2 = np.random.normal()
self.w3 = np.random.normal()
self.w4 = np.random.normal()
self.w5 = np.random.normal()
self.w6 = np.random.normal()
self.b1 = np.random.normal()
self.b2 = np.random.normal()
self.b3 = np.random.normal()
🧠 Feedforward (прямое распространение, forward pass ) — это процесс обработки данных в нейронной сети , при котором информация движется лишь в одном направлении : от входного слоя через скрытые слои к выходному.
def feedforward(self, x):
h1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)
h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)
o1 = sigmoid(self.w5 * h1 + self.w6 * h2 + self.b3)
return o1
⚙️ Обратное распространение ошибки (backpropagation) — это метод, который используется для обучения нейронных сетей путём минимизации ошибки предсказания
def train(self, data, all_y_trues):
learn_rate = 0.1
epochs = 1000
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой метод добавляет элемент в конец списка?
Anonymous Quiz
14%
insert()
79%
append()
7%
extend()
0%
pop()
Зачем нужен метод __init__() в классе?
Anonymous Quiz
23%
Для создания объекта класса.
54%
Для инициализации атрибутов объекта
23%
Для обработки исключений
0%
Для удаления объекта
for epoch in range(epochs):
for x, y_true in zip(data, all_y_trues):
Forward propagation (также известное как прямой проход) — процесс передачи входных данных через слои нейронной сети для генерации вывода
sum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1
h1 = sigmoid(sum_h1)
sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
h2 = sigmoid(sum_h2)
sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3
o1 = sigmoid(sum_o1)
y_pred = o1
d_l_d_pred = -2 * (y_true - y_pred)
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑💻 🧑💻 Регрессионные модели определяются их весами и смещением — параметрами модели. Однако перед обучением модели мы можем подкрутить множество других ручек, таких как скорость обучения,количество периодов, степень (если рассматривать модель полиномиальной
регрессии) и многие другие. Они называются
гиперпараметрами.
🔵 Любая величина, которую вы устанавливаете перед процессом обучения — это гиперпараметр;🔵 Любая величина, которую модель создает или изменяет в процессе обучения — это параметр.
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой метод в библиотеке scikitlearn используется для разделения данных на обучающую и тестовую выборки?
Anonymous Quiz
64%
train_test_split()
18%
split_data()
18%
divide_dataset()
0%
data_split()
Какой из следующих параметров в линейной регрессии отвечает за наклон прямой?
Anonymous Quiz
45%
intercept
36%
slope
9%
coefficient
9%
bias
Какой показатель используется для оценки качества линейной регрессии?
Anonymous Quiz
0%
Precision
23%
F1-score
54%
R-squared
23%
Accuracy
Что выведет код?
my_dict = {'a': 1, 'b': 2, 'c': 3}
print(my_dict.get('d', 4))
my_dict = {'a': 1, 'b': 2, 'c': 3}
print(my_dict.get('d', 4))
Anonymous Quiz
8%
1
0%
2
58%
4
8%
3
25%
2765
a = [1, 2, 3]
b = a
b.append(4) print(a)
b = a
b.append(4) print(a)
Anonymous Quiz
29%
[1, 2, 3]
53%
[1, 2, 3, 4]
0%
[4, 3, 2, 1]
18%
Ошибка
0%
[4]
d_pred_d_w5 = h1 * deriv_sigmoid(sum_o1)
d_pred_d_w6 = h2 * deriv_sigmoid(sum_o1)
d_pred_d_b3 = deriv_sigmoid(sum_o1)
d_ypred_d_h1 = self.w5 * deriv_sigmoid(sum_o1)
d_ypred_d_h2 = self.w6 * deriv_sigmoid(sum_o1)
d_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1)
d_h1_d_w2 = x[1] * deriv_sigmoid(sum_h1)
d_h1_d_b1 = deriv_sigmoid(sum_h1)
d_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2)
d_h2_d_w4 = x[1] * deriv_sigmoid(sum_h2)
d_h2_d_b2 = deriv_sigmoid(sum_h2)
d_pred_d_w5 = h1 * deriv_sigmoid(sum_o1) — здесь sum_o1 это взвешенная сумма (сумма входных данных, умноженных на их веса, плюс смещение (bias)) на выходном нейронеЕсли h1 большое, w5 сильнее влияет на o1
d_pred_d_w6 = h2 * deriv_sigmoid(sum_o1) — тут аналогично только для w6 (проще говоря, тут показано влияение w6 на o1)d_pred_d_b3 = deriv_sigmoid(sum_o1) — ( влияние смещения на выход)d_ypred_d_h1 = self.w5 * deriv_sigmoid(sum_o1) — итак, здесь показано насколько вес w5 влияет на выход, для h2 выйдет аналогично...d_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1) — вес w1 умножается на градиент сигмоиды, аналогично будет для w2 и влияния смещения — d_h1_d_b1 = deriv_sigmoid(sum_h1) d_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2), аналогично для w4 и влияния смещения — d_h2_d_b2 = deriv_sigmoid(sum_h2)🔜 Каждый параметр уменьшается на некую величину, зависящую от градиентов и learn_rate (скорости обучения). Это делает предсказания точнее.
self.w1 -= learn_rate * d_l_d_pred * d_ypred_d_h1 * d_h1_d_w1
self.w2 -= learn_rate * d_l_d_pred * d_ypred_d_h1 * d_h1_d_w2
self.b1 -= learn_rate * d_l_d_pred * d_ypred_d_h1 * d_h1_d_b1
self.w3 -= learn_rate * d_l_d_pred * d_ypred_d_h2 * d_h2_d_w3
self.w4 -= learn_rate * d_l_d_pred * d_ypred_d_h2 * d_h2_d_w4
self.b2 -= learn_rate * d_l_d_pred * d_ypred_d_h2 * d_h2_d_b2
self.w5 -= learn_rate * d_l_d_pred * d_pred_d_w5
self.w6 -= learn_rate * d_l_d_pred * d_pred_d_w6
self.b3 -= learn_rate * d_l_d_pred * d_pred_d_b3
if epoch % 10 == 0:
y_preds = np.array([self.feedforward(x) for x in data])
loss = mse_loss(all_y_trues, y_preds)
print(f"Epoch {epoch} loss: {loss:.3f}")
Здесь мы имеем 4 примера и переменную all_y_trues, которая содержит правильные метки или ответы, тут, как вам удобно.
data = np.array([
[-2, -1],
[25, 6],
[17, 4],
[-15, -6]
])
all_y_trues = np.array([1, 0, 0, 1])
network = OurNeuralNetwork()
network.train(data, all_y_trues)
Please open Telegram to view this post
VIEW IN TELEGRAM
А вот он и весь код:
🔤 🔤 🔤 🌹 🔤 🪷 🔤 🔤 🌷 🌸 🔤 🌹 🔤
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def deriv_sigmoid(x):
fx = sigmoid(x)
return fx * (1 - fx)
def mse_loss(y_true, y_pred):
return ((y_true - y_pred) ** 2).mean()
class OurNeuralNetwork:
def __init__(self):
self.w1 = np.random.normal()
self.w2 = np.random.normal()
self.w3 = np.random.normal()
self.w4 = np.random.normal()
self.w5 = np.random.normal()
self.w6 = np.random.normal()
self.b1 = np.random.normal()
self.b2 = np.random.normal()
self.b3 = np.random.normal()
def feedforward(self, x):
h1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)
h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)
o1 = sigmoid(self.w5 * h1 + self.w6 * h2 + self.b3)
return o1
def train(self, data, all_y_trues):
learn_rate = 0.1
epochs = 1000
for epoch in range(epochs):
for x, y_true in zip(data, all_y_trues):
sum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1
h1 = sigmoid(sum_h1)
sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
h2 = sigmoid(sum_h2)
sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3
o1 = sigmoid(sum_o1)
y_pred = o1
d_l_d_pred = -2 * (y_true - y_pred)
d_pred_d_w5 = h1 * deriv_sigmoid(sum_o1)
d_pred_d_w6 = h2 * deriv_sigmoid(sum_o1)
d_pred_d_b3 = deriv_sigmoid(sum_o1)
d_ypred_d_h1 = self.w5 * deriv_sigmoid(sum_o1)
d_ypred_d_h2 = self.w6 * deriv_sigmoid(sum_o1)
d_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1)
d_h1_d_w2 = x[1] * deriv_sigmoid(sum_h1)
d_h1_d_b1 = deriv_sigmoid(sum_h1)
d_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2)
d_h2_d_w4 = x[1] * deriv_sigmoid(sum_h2)
d_h2_d_b2 = deriv_sigmoid(sum_h2)
self.w1 -= learn_rate * d_l_d_pred * d_ypred_d_h1 * d_h1_d_w1
self.w2 -= learn_rate * d_l_d_pred * d_ypred_d_h1 * d_h1_d_w2
self.b1 -= learn_rate * d_l_d_pred * d_ypred_d_h1 * d_h1_d_b1
self.w3 -= learn_rate * d_l_d_pred * d_ypred_d_h2 * d_h2_d_w3
self.w4 -= learn_rate * d_l_d_pred * d_ypred_d_h2 * d_h2_d_w4
self.b2 -= learn_rate * d_l_d_pred * d_ypred_d_h2 * d_h2_d_b2
self.w5 -= learn_rate * d_l_d_pred * d_pred_d_w5
self.w6 -= learn_rate * d_l_d_pred * d_pred_d_w6
self.b3 -= learn_rate * d_l_d_pred * d_pred_d_b3
if epoch % 10 == 0:
y_preds = np.array([self.feedforward(x) for x in data])
loss = mse_loss(all_y_trues, y_preds)
print(f"Epoch {epoch} loss: {loss:.3f}")
data = np.array([
[-2, -1],
[25, 6],
[17, 4],
[-15, -6]
])
all_y_trues = np.array([1, 0, 0, 1])
network = OurNeuralNetwork()
network.train(data, all_y_trues)
Please open Telegram to view this post
VIEW IN TELEGRAM