Введение

Привет всем, сегодня я хочу объяснить, что такое нейронная сеть (NN), основная причина в том, что многие люди слушают о NN, но не знают, что это такое, как он работает и его назначение. Это история для таких людей или для новичков в этой области ИИ, которые сомневаются в концепции НС.

Нейронная сеть — это структура, которая пытается смоделировать биологическую структуру нейронов и их назначение, получить информацию о стимуле (получить данные в случае NN), передать эту информацию через другие нейроны и сформировать адекватный ответ на этот стимул.

Людям нужны данные и опыт, чтобы учиться, как NN может учиться? Легко, нейронной сети также нужны данные и опыт для обучения, но эта концепция будет объяснена позже в разделе обучения.

Персептрон.

Прежде чем мы углубимся в то, что такое нейронная сеть и как она работает, мы должны знать концепцию персептрона. Персептрон — это базовая единица в НС, которую мы можем комбинировать с другими персептронами для создания большой нейронной сети. NN имеет много общего со структурой мозга, как мы знаем, базовая единица нашего мозга имеет базовую единицу, называемую нейроном, и его комбинация создает биологическую нейронную сеть.

Как видим, персептрон состоит из многих частей:

  • Входы: предоставление данных выходному узлу.
  • Вес: Определяет влияние ввода на конечный результат, если вход имеет большой вес, его влияние на конечный результат будет высоким. Изначально NN не знает подходящего значения весов, по этой причине по умолчанию веса инициируются случайным образом (мы можем изменить это).
  • Выход: использует математическую функцию для определения конечного результата.

Пример: представьте, что мы хотим обучить НС определять, здоров человек или нет, и у нас есть только две переменные: пол и занимается ли человек каким-либо видом спорта (входные данные). Получив эти значения, мы передаем их выходному узлу, который выполняет необходимые вычисления, чтобы определить, здоров человек или нет. Когда мы загружаем выходной узел этими двумя переменными, веса должны быть изменены, потому что пол не должен влиять на конечный результат (в данном случае).

Примечание. Модификации весов выполняются с помощью алгоритма, называемого «обратным распространением». Это продвинутая концепция, но я попытаюсь объяснить ее простым способом в разделе этой статьи, посвященном обучению нейронной сети, но если вы хотите узнать больше об этом алгоритме, я рекомендую прочитать несколько книг о глубоком обучении и посмотреть несколько видеороликов на YouTube об этом. алгоритм.

Нейронная сеть.

Теперь, когда мы знаем, что такое перцептрон и как он работает, мы готовы узнать, что такое NN. NN — это набор полностью связанных перцептро, которые работают вместе для достижения общей цели.

Как мы видим, нейронные сети представляют собой полностью связанные между собой персептроны и состоят из трех основных частей.

  • Входной слой: слой, из которого мы получаем входные данные, у нас есть один вход для каждой функции в нашем наборе данных.
  • Скрытые слои: их основная цель — применить веса к входным данным и распространить их на следующий слой, который может быть другим скрытым слоем или выходным слоем. Нет никаких правил о количестве скрытых слоев и количестве узлов, которые должны содержать NN, мы должны изменить его в соответствии с нашими результатами обучения.

Примечание. Значение будет распространяться на следующий уровень только в том случае, если это значение достаточно велико, в противном случае это значение не будет распространяться. Это может привести к «мертвым» узлам, то есть узлам, которые не влияют на конечный результат, потому что его значение очень близко к нулю. Если у нас будет много мертвых узлов, NN не будет учиться.

  • Выходной слой: создание выходных данных на основе выходных данных последнего слоя. У нас будет один узел, если мы столкнемся с проблемой бинарной классификации, но в задаче мультиклассовой классификации у нас есть один узел для каждого класса. Например: если мы хотим определить, здоров человек или нет, у нас есть один узел, но если нам нужно определить, есть ли у человека какое-либо заболевание, у нас будет по одному узлу для каждого заболевания.

Построение и обучение нейронной сети.

Поздравляю, вы уже знаете, что такое нейронная сеть и ее предназначение, но плохая новость в том, что вы не знаете, как ее построить и как ее обучить, но не волнуйтесь, я постараюсь показать вам простым способом как вы можете это сделать. Эта часть предназначена только для людей, интересующихся программированием NN, поэтому я предполагаю, что вы знаете некоторые концепции программирования на Python, а также некоторые концепции машинного обучения.

Самый простой способ построить NN, используя одну библиотеку в python, эта библиотека — tensorflow. Чтобы использовать эту библиотеку, мы должны сделать несколько импортов перед запуском.

from tensorflow.keras.datasets import fashion_mnist
from tensorflow.keras import layers, Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow import keras
import tensorflow as tf

В следующем примере мы будем использовать набор данных fashion_mnist для обучения нашей модели, это задача многоклассовой классификации. Набор данных содержит изображения, и мы попытаемся предсказать, что это за одежда.

Нам нужны четыре разных набора, набор для обучения и набор для тестирования. Наборы x содержат изображения, из которых мы будем извлекать функции, а тесты y содержат метки (то есть название одежды).

(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()

Теперь, когда у нас есть данные, пришло время начать построение нейронной сети, и первый шаг — создать некоторые переменные, которые будут использоваться в будущем.

batch_size = 64
num_classes = 10
epochs = 300
  • batch_size: количество выборок, которые будут использоваться в каждой итерации нейронной сети. В первой итерации мы будем использовать 64 выборки, в следующей итерации мы будем использовать другие 64 выборки (случайные). Обычно мы будем использовать степени двойки.
  • num_classes: количество различных классов в нашем наборе данных.
  • эпохи: Количество итераций, или то же самое, сколько раз мы пройдем по нейросети, прежде чем считать, что наша нейросеть хорошо обучена. Это значение является гиперпараметром, мы должны адаптировать количество эпох в соответствии с нашими результатами.

Примечание. Следующий код необходим для правильной работы NN, но объяснение его функции выходит за рамки этого рассказа.

# One-hot encoding of y
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
# One array
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

Теперь пришло время построить нейронную сеть, для этого мы будем использовать следующий код:

#Building the model
model = Sequential()
model.add(Dense(128, activation='sigmoid', input_shape=(784,)))
model.add(Dense(128, activation='sigmoid'))
model.add(Dense(64, activation='sigmoid'))
model.add(Dense(num_classes, activation='softmax'))
model.summary()

Мы используем последовательную модель, это означает, что мы строим нейронную сеть со стеком слоев.

С помощью метода .add(Dense()) мы добавляем плотный слой, плотный слой — это слой, полностью связанный между своими узлами, но сколько узлов содержит слой? Первое число внутри функции Dense() определяет количество узлов. Как мы видим, первый слой содержит параметр с именем «input_shape» это сколько узлов будет содержать входной слой, потому что мы строим скрытый и выходной слои, а для построения входного слоя нужно указать только параметр input_shape в первом скрытый слой и его размер (784 в нашем случае). Параметр «активация» позволяет нам выбрать математическую формулу, чтобы определить, как сумма весов будет преобразована в результат. Мы можем использовать разные функции активации на каждом уровне или в зависимости от нашей цели или типа проблемы мы выберем ту или иную функцию активации.

Вы можете видеть, что последний слой имеет переменную «num_clases» как количество узлов, это потому, что этот слой является выходным слоем, и вы знаете, что в этом слое у нас есть один узел для каждого класса для прогнозирования. Функция активации в этом слое отличается, потому что функция «softmax» хорошо работает для мультиклассовых задач.

Теперь пришло время настроить модель, для этого мы будем использовать функцию компиляции.

from tensorflow.keras.optimizers import SGD
#Compile the model
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
  • Loss: этот параметр позволяет нам выбрать функцию потерь. Функция потерь вычисляет разницу между реальным значением и прогнозируемым значением (эти значения называются значением ошибки) и пытается минимизировать это значение ошибки, чтобы получить точную модель. Эта ошибка будет распространяться по NN, и когда выходной слой сгенерирует результат, мы сравним его с желаемым результатом, затем NN сгенерирует значение ошибки для каждого выходного узла. Основываясь на этих ошибках, нейронная сеть будет распространять эти значения на предыдущий слой и изменять веса в соответствии с этими ошибками, чтобы получить лучшие результаты, это концепция обратного распространения. В нашем случае мы используем функцию «categorical_crossentropy», потому что это лучшая функция для мультиклассовых задач.
  • Оптимизатор: определяет способ изменения весов.
  • Метрики: способ, которым мы будем оценивать производительность нашей модели.

Наконец, пришло время обучить модель и наблюдать за результатами. Мы будем использовать функцию подгонки, чтобы начать с обучения NN.

history_sigmoid = model.fit(x_train, y_train, 
batch_size = batch_size, epochs=epochs, verbose=1, 
validation_split = 0.2)

Мы используем набор поездов для обучения модели с его метками (сохраненными в y_train). Параметр «verbose» используется для отображения хода обучения нашей NN, а «validation_split» используется для выбора желаемого процента для проверки модели, в нашем случае мы используем 20% выборок в x_train для проверки. Вывод команды будет примерно таким:

Как видим, потери шаг за шагом уменьшаются, а точность увеличивается. В конце обучения точность должна быть близка к 1, а потери - к 0.

Оценка модели.

Ну, вы знаете, как обучать NN, но вы не знаете, хорошо ли работает сеть и правильно ли она предскажет результаты.

Простой способ оценить работу нашей NN — использовать матрицу путаницы. Эта матрица показывает нам, сколько предсказаний верно предсказано и сколько предсказаний ошибочно.

Код для этого следующий:

pred = model.predict(x_test) #Our predictions
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test.argmax(axis=1), pred.argmax(axis=1))

И в результате будет что-то вроде этого:

В зависимости от количества классов для прогнозирования у нас будет количество строк и столбцов. Первая строка принадлежит первой метке, первый столбец также принадлежит первой метке и так далее. Хорошо предсказанные значения — это значения по диагонали, значения вне диагонали — это значения, предсказанные неправильно.

Вывод

В этом посте я попытался простым и понятным способом объяснить, что такое NN и как он работает, это лишь небольшое введение в эти алгоритмы, если вы хотите узнать больше об этой увлекательной области ИИ, вам следует начать читать книги, посещать курсы, читать другие посты, писать собственные выводы и так далее. Надеюсь, я помог вам немного лучше понять NN. Спасибо за чтение.