Нейронная сеть на языке Python
Нейронная сеть – одна из самых сложных разработок за последнее время. Некоторые думают, что сделать ее тяжело, так как ассоциируется такое с тем, над чем работают исключительно профессионалы. Однако, хороший момент заключается в том, что путь к разработке нейронной сети открыт всем.
Здесь необходимо лишь разобраться с тем, что из себя представляет данный тип программного средства и каким образом возможно его создать, также как работает такое творение. Как раз-таки об этом и будет рассказано пользователям, желающим написать что-то необычное на Python.
Как работает нейронная сеть
С чем сначала необходимо разобраться для понимания дальнейшего – с тем, что из себя представляет нейронная сеть, а также алгоритм работы нейронной сети. На самом деле, если разобраться с таким моментом и что из себя представляет такая разработка – можно будет в дальнейшем додумать то, чем можно создать ее.
Нейронная сеть – это специальный алгоритм, который выполняет такую роль, чтобы имитировать работу человеческого мозга. Проще говоря, нейронная сеть позволяет делать то же самое, что и искусственный интеллект. Но это наоборот, может заставлять пользователей подумать, что такое сделать весьма тяжело, ведь написанные здесь определения звучат сложно. Однако, можно сделать небольшую поправку – иногда комплексные разработки возможно делать без особых усилий.
Обычно, созданная нейронная сеть(искусственная) работает вместе с учителем – в комплекте есть датасет, который и обучает разработку всему требуемому. Кстати говоря, набор в себя может включать самые разные данные: теги, классы, значения и прочее. Можно сказать, что это и становится «мозгом» для нейронной сети для получения ее «умственной способности».
Применять искусственный интеллект возможно во многих сферах. К примеру, взять определение тона текста – для этого требуется специальный датасет, высчитывающий эмоциональность фраз. Таким образом, анализируя все предложения в тексте, нейронная сеть сможет в конечном счете определить оттенок тональности. На выходе, получится тот или иной результат – допустим, в датасете будут содержаться такие значения, как «нейтральный тон», «позитивная окраска» или же «негативные эмоции». В зависимости от собранного датасета возможно получить что угодно.
Ранее пользователи сами собирали признаки для определения того или иного результата. Но теперь людям не нужно беспокоиться на этот счет – нейронная сеть автоматизировала такой процесс. И значит, можно просто вводить свои данные, а затем получить результат.
Слои нейронной сети
Также, что немаловажно при составлении нейронной сети –ее слои. Если пользователи собираются полностью изучать или создавать собственные нейронные сети. На самом деле, со слоями здесь ситуация очень и очень несложная. Достаточно лишь выделить 3 этапа обработки информации. Они же и называются слоями нейронной сети:
- Входной слой. Сюда попадает информация для первичной обработки. То есть, пользователи просто вводят сюда данные и более ничего не делают. Здесь никаких вычислений, выводов результатов и чего-то еще нет;
- Скрытый слой вычислений. Здесь проводятся непосредственно все требуемые для получения результата вычисления. То есть, переплетаются все необходимые значения, чтобы в конце концов получить тот или иной ответ. К примеру, определение животного по разным признакам так производится. Подключается камера, затем – сканируются все внешние признаки. Вот такое и происходит в вычислительных слоях нейронной сети;
- Выходной слой. Здесь уже пользователю ничего не нужно делать. Требуется только записать или каким-либо еще образом вывести конечный результат, полученный путем вычислений. И следовательно, подтвердится какой-либо факт насчет анализа информации, что и требовалась человеку. Если говорить короче – в случае с текстом сеть выдаст эмоциональную окраску.
Вот таким образом работает нейронная сеть. И никаких дополнительных этапов не требуется пользователю, чтобы организовать работу своего творения. На словах все просто. А на практике – немного сложнее, так как придется заняться написанием непосредственно самого кода. Но при желании и стремлении создать что-то необычное – такое возможно без каких-либо серьезных проблем. Человек сможет осуществить работу примитивной нейронной сети.
Создание нейронной сети с нуля на Python
С нуля создать нейронную сеть – дело, которое провернуть возможно без особых усилий. Однако, следует понимать, что без специальных знаний здесь не обойтись. Если просто думать над тем, чтобы создать нейронную сеть без продумывания специальных алгоритмов для наибольшей эффективности кода, то велика вероятность простого «провала». А следовательно, человек должен изучить строение творения тщательно.
Все, что было описано выше насчет работы сети и слоях – обязательные моменты, так как они пригодятся в большинстве случаев. А значит – придется использовать накопленные знания для последующих разработок. Они уж точно сыграют роль в процессе написания кода в Python.
Но также требуется понимать, что без образцов кода невозможно почти будет написать собственную нейронную сеть. Ведь тогда человек просто-напросто не сможет представить себе то, что должно заставить работать специальный алгоритм искусственного интеллекта. Как раз-таки для этого и требуется обращаться к каким-либо примерам, предоставленным либо в данном материале, либо в сети.
Что должно находиться в нейронной сети? Первое и самое главное – слои. По одному находится для входа и выхода – там более не требуется. А вот для вычислений может понадобиться неопределенное количество, что необходимо знать при разработке нейронной сети. Второе – набор смещений и весов, находящихся между слоями. А последнее, что необходимо для работы скрытых слоев – функции активации.
Когда пользователь ознакомился с этим всем –остается только начинать работать на нейронной сетью. Внизу как раз-таки и будет показан один из примеров простейшей разработки. Там используется минимум всего необходимого для функционала. Однако, следует понимать, что в дальнейшем, при нарастании количества навыков программирования в Python, возможно создавать более крупные проекты, которые смогут охватывать большее количество данных для анализа всех разных объектов сфер.
Простейшая нейронная сеть
В данном случае, не требуется никаких дополнительных компонентов. Если говорить понятнее – человеку не нужно подключать сторонние библиотеки для функционала своего проекта, а также какие-то дополнительные ресурсы. Все же, это – простейшая нейронная сеть. Здесь необходимо лишь использовать проверенный Python. В нем как раз-таки и будет производиться основное действие.
Наконец-таки можно перейти к тому, что человек ожидает в таком материале. И это будет код в Python. Представлен он всего лишь в 9 строках, что, непосредственно, является плюсом. И значит, можно будет без каких-либо проблем списать его в свой редактор, сделать собственную нейронную сеть:
from numpy import exp, array, random, dot
training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
training_set_outputs = array([[0, 1, 1, 0]]).T
random.seed(1)
synaptic_weights = 2 * random.random((3, 1)) — 1
for iteration in xrange(10000):
output = 1 / (1 + exp(-(dot(training_set_inputs, synaptic_weights))))
synaptic_weights += dot(training_set_inputs.T, (training_set_outputs — output) * output * (1 — output))
print 1 / (1 + exp(-(dot(array([1, 0, 0]), synaptic_weights))))
Вот такой небольшой код умещается всего лишь на 9 строках в Python! Это значит, что потратить на него возможно всего лишь пару минут, которые, фактически, принесут немало пользы. А это значит, что приступать к другим этапам разработки собственного творения возможно без больших усилий и дополнительных этапов прописывания тех или иных команд.
Здесь используется также очень простая схема для наглядной работы системы. То есть, выход только один, а входов – несколько. Таким образом, процесс будет очень легко обрабатываться. Большого количества времени эта процедура не займет. А значит, можно будет без проблем начинать вычислять те или иные данные, используя только лишь саму нейросеть.
Касательно дополнительного примера – он значительно больше, но здесь требуется пояснить еще один момент. Хоть для написания такого кода не требуется много усилий – доступно только само получившееся творение на Python, но необходимы дополнительные средства. В данном случае – математические библиотеки. Здесь необходимо прописывать такие средства, как:
- exp — экспоненцирование(об этом уже понятно из сокращения на английском языке);
- array — создание матрицы;
- dot — перемножения матриц;
- random — генерация случайных чисел(если говорить проще, то «рандомизирование» — создание всего, что угодно и допускается программой в данном случае).
А сам код, который рекомендуется дополнительно изучить – вот он:
from numpy import exp, array, random, dot
class NeuralNetwork():
def __init__(self):
# Seed the random number generator, so it generates the same numbers
# every time the program runs.
random.seed(1)# We model a single neuron, with 3 input connections and 1 output connection.
# We assign random weights to a 3 x 1 matrix, with values in the range -1 to 1
# and mean 0.
self.synaptic_weights = 2 * random.random((3, 1)) — 1# The Sigmoid function, which describes an S shaped curve.
# We pass the weighted sum of the inputs through this function to
# normalise them between 0 and 1.
def __sigmoid(self, x):
return 1 / (1 + exp(-x))# The derivative of the Sigmoid function.
# This is the gradient of the Sigmoid curve.
# It indicates how confident we are about the existing weight.
def __sigmoid_derivative(self, x):
return x * (1 — x)# We train the neural network through a process of trial and error.
# Adjusting the synaptic weights each time.
def train(self, training_set_inputs, training_set_outputs, number_of_training_iterations):
for iteration in xrange(number_of_training_iterations):
# Pass the training set through our neural network (a single neuron).
output = self.think(training_set_inputs)# Calculate the error (The difference between the desired output
# and the predicted output).
error = training_set_outputs — output# Multiply the error by the input and again by the gradient of the Sigmoid curve.
# This means less confident weights are adjusted more.
# This means inputs, which are zero, do not cause changes to the weights.
adjustment = dot(training_set_inputs.T, error * self.__sigmoid_derivative(output))# Adjust the weights.
self.synaptic_weights += adjustment# The neural network thinks.
def think(self, inputs):
# Pass inputs through our neural network (our single neuron).
return self.__sigmoid(dot(inputs, self.synaptic_weights))if __name__ == «__main__»:
#Intialise a single neuron neural network.
neural_network = NeuralNetwork()print «Random starting synaptic weights: »
print neural_network.synaptic_weights# The training set. We have 4 examples, each consisting of 3 input values
# and 1 output value.
training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
training_set_outputs = array([[0, 1, 1, 0]]).T# Train the neural network using a training set.
# Do it 10,000 times and make small adjustments each time.
neural_network.train(training_set_inputs, training_set_outputs, 10000)print «New synaptic weights after training: »
print neural_network.synaptic_weights# Test the neural network with a new situation.
print «Considering new situation [1, 0, 0] -> ?: »
print neural_network.think(array([1, 0, 0]))
И вот такое получится у пользователя после некоторого времени работы. Главное в этом – понимать, что к чему. Иначе могут возникнуть трудности или еще что хуже – ошибки в самой системе.
Обучение нейронной сети
Процесс тренировки нейрона в специально разработанной сети – долгий и трудоемкий процесс. Потому, придется запастись терпением. Но при должной смекалке, человек может облегчить себе задачу(но об этом чуть позже). В общем – пользователям предстоит вот такой алгоритм для того, чтобы обучить свою небольшую нейронную сеть, созданную с помощью предыдущего пункта:
- Берем входные данные из примера обучающего набора, корректируем их по весам и передаем по специальной формуле для расчета выхода нейрона.
- Вычисляем ошибку, которая является разницей между выходом нейрона и желаемым выходом в примере обучающего набора.
- В зависимости от направления ошибки слегка отрегулируем вес.
- А теперь – самое тяжелое и то, что займет большое количество времени. Необходимо повторить данную процедуру около 10000 раз.
А все это ради того, чтобы натренировать собственную систему для правильного ответа. Процесс очень трудоемкий, но если настроить специальную автоматизацию такового, то без проблем станет возможной тренировка нейрона. И в таком случае, человек сможет быстро сделать желаемый проект.
Тренировка нейронной сети с помощью Keras
Для нейронной сети стоит загрузить также специальный компонент, который без проблем может осуществить корректную работу с проектом. А называется такое ПО – Keras. Пользователям можно применить таковое на практике в разных случаях. К примеру, вот, для чего может подойти Keras, если осуществлять работу над нейронной сетью:
- Возможность выбрать функцию активации;
- Выбор количества слоев обработки для определения эффективности вычисления данных и анализа во время непосредственной работы нейронной сети. Также, задевая тему слоев – у них возможно настроить также тип, благодаря чему станет возможной детальная настройка;
- Также, возможно добавление того или иного числа нейронов. Как раз-таки их и требуется тренировать для достижения правильного результата.
А для непосредственно самой тренировки необходимо ввести следующий код:
model = keras.Sequential()
model.add(keras.layers.Dense(input_shape=(SIZE_OF_ONE_IMAGE,), units=128, activation=’relu’))
model.add(keras.layers.Dense(10, activation=’softmax’))model.summary()
model.compile(optimizer=’sgd’,
loss=’categorical_crossentropy’,
metrics=[‘accuracy’])
После вывода, требуется использовать следующий код для второго шага тренировки:
model.fit(X_train, y_train, epochs=20, batch_size=128)
И последний, завершающий этап – опять использование кода, но уже другого, в целях проверки точности тренировочных данных:
model.evaluate(X_test, y_test)
После такого процесса тренировка будет завершена.
Запуск из интерпретатора Python
Для запуска из интерпретатора рекомендуется сначала убедиться, что версия Python выше 3.6. А затем – установить специальные модули с помощью pip. Делается это таким образом:
!pip install matplotlib
!pip install sklearn
!pipinstalltensorflow
Импорт модулей и библиотек выполняется следующим образом:
import numpy as np
import matplotlib.pyplot as plt
import gzip
from typing import List
from sklearn.preprocessing import OneHotEncoder
import tensorflow.keras as keras
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
import itertools
%matplotlib inline
После этого, все готово к запуску всего кода своего проекта в Python. Однако, рекомендуется делать это в виртуальной среде. Так будет лучше всего работать нейронная сеть, созданная человеком на популярном языке программирования.