Что такое нейронная сеть?
Нейронная сеть неотъемлемая часть data science.
Нейронная сеть основана на том, как работает человеческий мозг: многие нейроны соединены с другими нейронами, передают информацию через свои связи и действуют, когда вход в нейрон превышает определенный порог. Наша искусственная нейронная сеть будет состоять из искусственных нейронов и синапсов с передаваемой между ними информацией. Синапсы, или соединения, будут взвешиваться в зависимости от силы влияния нейрона на определение выхода. Эти синаптические веса будут проходить процесс оптимизации, называемый обратным размножением. Для каждой итерации во время тренировочного процесса, обратное размножение будет использоваться для обратного прохождения через слои сети и регулировки весов в соответствии с их вкладом в ошибку нейронной сети.
Нейронные сети, по сути, являются самооптимизирующимися функциями, которые сопоставляют входы с правильными выходами. Затем мы можем поместить новый вход в функцию, где он будет предсказывать выход на основе функции, которую он создал с помощью тренировочных данных.
Цель нейронной сети.
Эта нейронная сеть, как и все нейронные сети, должна будет узнать, каковы важные функции в данных, чтобы получить результат. В частности, этой нейросети будет дана входная матрица с шестью выборками, каждая из которых будет состоять из трех столбцов характеристик, состоящих исключительно из нулей и единиц. Например, одна выборка в обучающем наборе может быть [0, 1, 1]. На выходе для каждой выборки будет один единица или ноль. Вывод будет определяться номером в первом столбце выборки данных. На примере, приведенном выше, выход для [0, 1, 1] будет равен 0, так как первый столбец содержит ноль. Ниже будет приведен пример диаграммы, демонстрирующей вывод для каждого входного образца.
Полный код:
import numpy as np # helps with the math
import matplotlib.pyplot as plt # to plot error during training
# input data
inputs = np.array([[0, 1, 0],
[0, 1, 1],
[0, 0, 0],
[1, 0, 0],
[1, 1, 1],
[1, 0, 1]])
# output data
outputs = np.array([[0], [0], [0], [1], [1], [1]])
# create NeuralNetwork class
class NeuralNetwork:
# intialize variables in class
def __init__(self, inputs, outputs):
self.inputs = inputs
self.outputs = outputs
# initialize weights as .50 for simplicity
self.weights = np.array([[.50], [.50], [.50]])
self.error_history = []
self.epoch_list = []
# activation function ==> S(x) = 1/1+e^(-x)
def sigmoid(self, x, deriv=False):
if deriv == True:
return x * (1 - x)
return 1 / (1 + np.exp(-x))
# data will flow through the neural network.
def feed_forward(self):
self.hidden = self.sigmoid(np.dot(self.inputs, self.weights))
# going backwards through the network to update weights
def backpropagation(self):
self.error = self.outputs - self.hidden
delta = self.error * self.sigmoid(self.hidden, deriv=True)
self.weights += np.dot(self.inputs.T, delta)
# train the neural net for 25,000 iterations
def train(self, epochs=25000):
for epoch in range(epochs):
# flow forward and produce an output
self.feed_forward()
# go back though the network to make corrections based on the output
self.backpropagation()
# keep track of the error history over each epoch
self.error_history.append(np.average(np.abs(self.error)))
self.epoch_list.append(epoch)
# function to predict output on new and unseen input data
def predict(self, new_input):
prediction = self.sigmoid(np.dot(new_input, self.weights))
return prediction
# create neural network
NN = NeuralNetwork(inputs, outputs)
# train neural network
NN.train()
# create two new examples to predict
example = np.array([[1, 1, 0]])
example_2 = np.array([[0, 1, 1]])
# print the predictions for both examples
print(NN.predict(example), ' - Correct: ', example[0][0])
print(NN.predict(example_2), ' - Correct: ', example_2[0][0])
# plot the error over the entire training duration
plt.figure(figsize=(15,5))
plt.plot(NN.epoch_list, NN.error_history)
plt.xlabel('Epoch')
plt.ylabel('Error')
plt.show()
Выход:
Всем удачного изучения Python и data science!