На примере простой нейронной сети на Python мы рассмотрим процесс обучения и применения. Наша нейронная сеть будет иметь один входной слой, один скрытый слой и один выходной слой. На входном слое будет два нейрона, на скрытом слое будет три нейрона, а на выходном слое будет один нейрон.
Для начала нам нужно импортировать необходимые библиотеки. Для этого мы будем использовать NumPy для матричных вычислений и Matplotlib для визуализации наших результатов.
#
import numpy as np
import matplotlib.pyplot as plt
#
Теперь нам нужно инициализировать наши веса и смещения. Мы будем использовать случайные значения для наших весов и смещений.
# Инициализация весов и смещений
w1 = np.random.randn(2, 3)
b1 = np.random.randn(3)
w2 = np.random.randn(3, 1)
b2 = np.random.randn(1)
#
Теперь мы можем написать функцию активации, которая будет использоваться для преобразования входных данных в выходные данные. Здесь мы будем использовать сигмоидную функцию активации.
# Функция активации
def sigmoid(x):
return 1 / (1 + np.exp(-x))
#
Теперь мы можем написать функцию для прямого распространения. Эта функция будет принимать на вход входные данные и веса и возвращать выходные данные.
# Функция прямого распространения
def forward_prop(x, w1, b1, w2, b2):
z1 = np.dot(x, w1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, w2) + b2
a2 = sigmoid(z2)
return a2
#
Теперь мы можем написать функцию для обратного распространения. Эта функция будет принимать на вход входные данные, веса, выходные данные и ответы и возвращать градиенты для весов и смещений.
# Функция обратного распространения
def backward_prop(x, y, w1, b1, w2, b2):
z1 = np.dot(x, w1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, w2) + b2
a2 = sigmoid(z2)
delta2 = (a2 - y) * a2 * (1 - a2)
delta1 = np.dot(delta2, w2.T) * a1 * (1 - a1)
dw2 = np.dot(a1.T, delta2)
db2 = np.sum(delta2, axis=0)
dw1 = np.dot(x.T, delta1)
db1 = np.sum(delta1, axis=0)
return dw1, db1, dw2, db2
#
Теперь мы можем написать функцию для обучения нашей нейронной сети. Эта функция будет принимать на вход входные данные, выходные данные и параметры обучения и возвращать обученные веса и смещения.
# Функция обучения
def train(x, y, w1, b1, w2, b2, epochs, learning_rate):
for i in range(epochs):
a2 = forward_prop(x, w1, b1, w2, b2)
dw1, db1, dw2, db2 = backward_prop(x, y, w1, b1, w2, b2)
w1 -= learning_rate * dw1
b1 -= learning_rate * db1
w2 -= learning_rate * dw2
b2 -= learning_rate * db2
return w1, b1, w2, b2
#
Теперь мы можем использовать эту функцию для обучения нашей нейронной сети. Для этого мы будем использовать набор данных XOR.
# Данные XOR
x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# Обучение нейронной сети
w1, b1, w2, b2 = train(x, y, w1, b1, w2, b2, 1000, 0.1)
#
Теперь мы можем использовать обученную нейронную сеть для предсказания выходных данных для новых входных данных.
# Предсказание на новых данных
x_test = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y_test = forward_prop(x_test, w1, b1, w2, b2)
# Визуализация результатов
plt.plot(x_test, y_test, 'o')
plt.show()
#
В результате мы получили график, показывающий, как наша нейронная сеть предсказывает выходные данные для новых входных данных.