В этой статье мы увидим некоторые основы ИНС и простую реализацию искусственной нейронной сети. Tensorflow — мощная библиотека машинного обучения для создания моделей и нейронных сетей.
Итак, прежде чем мы начнем, что такое искусственные нейронные сети? Вот простое и понятное определение искусственных нейронных сетей. Короче говоря, искусственные нейронные сети — это технология, которая имитирует человеческий мозг, чтобы учиться на некоторых ключевых особенностях и классифицировать или предсказывать в реальном мире. Искусственная нейронная сеть состоит из множества нейронов, которые сравниваются с нейронами в человеческом мозгу.
Он предназначен для того, чтобы компьютер учился на небольших открытиях и функциях и делал их автономными, чтобы учиться из реального мира и предлагать решения в режиме реального времени быстрее, чем человек.
Нейрон в искусственной нейронной сети будет выполнять две операции внутри него.
- Сумма всех весов
- Функция активации
Итак, базовая искусственная нейронная сеть будет иметь вид,
- Уровень ввода- чтобы получить данные от пользователя, клиента или сервера для анализа и выдачи результата.
- Скрытые слои- этого уровня может быть любое количество, и эти слои будут анализировать входные данные, проходя через них с различными смещениями, весами и функциями активации, чтобы обеспечить выход.
- Выходной слой- здесь мы можем получить результат от нейронной сети.
Итак, поскольку мы знаем схему нейронных сетей, теперь мы перейдем к важным функциям и методам, которые помогают нейронной сети правильно учиться на данных.
Примечание. Любая нейронная сеть может учиться на данных, но без хороших значений параметров нейронная сеть может не научиться правильно на основе данных и не даст вам правильного результата.
Вот некоторые из характеристик, которые определяют качество нашей нейронной сети:
- Layers
- Activation function
- Loss function
- Optimizer
Теперь мы подробно обсудим каждый из них,
Первый этап построения нашей модели:
Python3
# Definig the model
model
=
keras.Sequential([
keras.layers.Dense(
32
, input_shape
=
(
2
,), activation
=
'relu'
),
keras.layers.Dense(
16
, activation
=
'relu'
),
keras.layers.Dense(
2
, activation
=
'sigmoid'
)
])
Layers
Слои в нейронной сети очень важны, поскольку мы видели ранее, что искусственная нейронная сеть состоит из трех слоев: входной, скрытый и выходной. Входной слой состоит из функций и значений, которые необходимо проанализировать внутри нейронной сети. По сути, это слой, который считывает наши входные данные в искусственную нейронную сеть.
Скрытый слой — это слой, где вся магия происходит, когда все входные нейроны передают функции скрытому слою с весом и смещением, каждый нейрон внутри скрытого слоя суммирует все взвешенные характеристики со всех входных слоев и примените функцию активации, чтобы сохранить значения от 0 до 1 для облегчения обучения. Здесь нам нужно выбрать количество нейронов в каждом слое вручную, и оно должно быть лучшим значением для сети.
Здесь настоящие лица, принимающие решения, — это веса между каждым слоем, которые в конечном итоге передают значение от 0 до 1 на выходной уровень. До этого мы видели важность каждого уровня слоев в искусственной нейронной сети. В TensorFlow есть много типов слоев, но мы будем часто использовать Dense.
syntax: tf.keras.layers.Dense()
Это полностью связанный слой, в котором каждый вход функции будет каким-то образом связан с результатом.
Activation function
Функции активации — это просто математические методы, которые переводят все значения в диапазон от 0 до 1, так что машине будет очень легче изучить данные в процессе их анализа. Поток Tensor поддерживает множество функций активации. Некоторые из наиболее часто используемых функций:
- Sigmoid
- Relu
- Softmax
- Swish
- Linear
Каждая функция активации имеет свои конкретные варианты использования и недостатки. Но функция активации, которая используется в скрытом и входном слоях, — это «Relu», а другая функция, которая будет иметь большее влияние на результат, — это потери.
После этого мы можем увидеть параметры в компиляции модели в TensorFlow,
Python
# Compilation of model
model.
compile
(optimizer
=
'adam'
loss
=
a_loss_function
metrics
=
[
'metrics'
])
Losses
Функции потерь — это очень важная вещь, которую следует учитывать при создании нейронной сети, потому что функции потерь в нейронной сети будут вычислять разницу между прогнозируемым выходом и фактическим результатом и очень помогают оптимизаторам в нейронных сетях обновлять веса при его обратном распространении.
Есть много функций потерь, которые поддерживаются библиотекой TensorFlow, и, опять же, обычно используются лишь некоторые из них:
- Mean Absolute
- MeanSquaredError
- Binary Crossentropy
- Categorical Crossentropy
- Sparse Categorica Crossentropy
Примечание. Опять же, выбор потерь полностью зависит от типа проблемы и результата, который мы ожидаем от нейронной сети.
Optimizers
Оптимизаторы — очень важная вещь, потому что это функция, которая помогает нейронной сети изменять веса при обратном распространении, так что разница между фактическим и прогнозируемым результатом будет постепенно уменьшаться и достигать точки, в которой потери очень минимальны и модель способна предсказывать более точные результаты.
Опять же, TensorFlow поддерживает множество оптимизаторов, чтобы упомянуть несколько,
- Gradient descent
- SDG – Stochastic Gradient Descent
- Adagrad
- Adam
После компиляции модели нам нужно подогнать модель к набору данных для обучения,
Python
# fitting the model
model.fit(train_data, train_label,
epochs
=
5
, batch_size
=
32
)
Epochs
Эпохи — это просто количество раз, когда весь набор данных проходит вперед и назад путем обновления весов в нейронной сети. Делая это, мы можем находить невидимые закономерности и информацию для каждой отдельной эпохи, и, следовательно, это повышает точность модели.
И чтобы справиться с некоторыми ограничениями нейронных сетей, такими как переоснащение обучающих данных и невозможность хорошо работать с невидимыми данными. Это может быть решено с помощью некоторых выпадающих слоев, что означает, что некоторое количество узлов в слое становится неактивным, что заставляет каждый узел в нейронной сети узнавать больше об особенностях ввода, и, следовательно, проблема может быть решена.
В TensorFlow добавление исключения в слое — это буквально строка кода,
syntax: tf.keras.layers.Dropout(rate, noise_shape=None, seed=None, **kwargs )
Как обучить нейронную сеть с помощью TensorFlow:
Step 1: Importing the libraries
Мы собираемся импортировать необходимые библиотеки.
Python
# Importing the libraries
import
pandas as pd
import
numpy as np
from
tensorflow
import
keras
from
tensorflow.keras
import
layers
from
sklearn.model_selection
import
train_test_split
Step 2: Importing the data
Данные, которые мы использовали в этом примере, генерируются случайным образом с помощью Numpy. Вы можете скачать данные здесь. В этих данных x и y являются точкой координат, а цветовая характеристика — это целевое значение, которое было сгенерировано случайным образом, в двоичном формате, представляющем красный — 1, синий — 0.
Python
# Importing the data
df
=
pd.read_csv(
'data.txt'
)
Данные будут выглядеть так:
Step 3: Splitting the data
Теперь мы собираемся разделить набор данных на обучающее и тестовое разбиения, чтобы оценить модель с невидимыми данными и проверить ее точность.
Python
# split the data into train and test set
train, test
=
train_test_split(
df, test_size
=
0.2
, random_state
=
42
, shuffle
=
True
)
Step 4: Constructing the input
На этом этапе мы собираемся создать входные данные, которые нам нужно передать в сеть. Для простоты и модели мы собираемся сложить две характеристики данных в x, а целевую переменную — в y. Мы используем numpy.column_stack (), чтобы складывать
Python
# Constructing the input
x
=
np.column_stack((train.x.values, train.y.values))
y
=
train.color.values
Step 5: Building a model
Теперь мы собираемся построить простую нейронную сеть для классификации цвета точки с двумя входными узлами и скрытым слоем и выходным слоем с функциями relu и сигмовидной активации, а также с разреженной категориальной функцией кросс-энтропийных потерь, и это будет полностью подключено однонаправленная сеть.
Python
# Definig the model
model
=
keras.Sequential([
keras.layers.Dense(
4
, input_shape
=
(
2
,), activation
=
'relu'
),
keras.layers.Dense(
2
, activation
=
'sigmoid'
)
])
# Compiling the model
model.
compile
(optimizer
=
'adam'
,
loss
=
keras.losses.SparseCategoricalCrossentropy(),
metrics
=
[
'accuracy'
])
# fitting the model
model.fit(x, y, epochs
=
10
, batch_size
=
8
)
Вывод:
Если мы оценим модель с невидимыми данными, она даст очень низкую точность,
Python
# Evaluating the model
x
=
np.column_stack((test.x.values, test.y.values))
y
=
test.color.values
model.evaluate(x, y, batch_size
=
8
)
Step 6: Building a better model
Теперь мы собираемся улучшить модель, добавив несколько дополнительных скрытых слоев и улучшив функцию активации softmax в выходном слое, а также построим лучшую нейронную сеть.
Python
# Definig the model
model_better
=
keras.Sequential([
keras.layers.Dense(
16
, input_shape
=
(
2
,), activation
=
'relu'
),
keras.layers.Dense(
32
, activation
=
'relu'
),
keras.layers.Dense(
32
, activation
=
'relu'
),
keras.layers.Dense(
2
, activation
=
'softmax'
)
])
# Compiling the model
model_better.
compile
(optimizer
=
'adam'
,
loss
=
keras.losses.SparseCategoricalCrossentropy(),
metrics
=
[
'accuracy'
])
# Constructing the input
x
=
np.column_stack((train.x.values, train.y.values))
y
=
train.color.values
# fitting the model
model_better.fit(x, y, epochs
=
10
, batch_size
=
8
)
Вывод:
Step 7: Evaluating the model
Наконец, если мы оценим модель, мы ясно увидим, что точность модели на невидимых данных была улучшена с 66 до 85. Итак, мы построили эффективную модель.