Учебное пособие по искусственным нейронным сетям с примерами TensorFlow ANN

Что такое искусственная нейронная сеть?

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

Искусственная нейронная сеть
Искусственная нейронная сеть

Искусственная нейронная сеть (ИНС) состоит из четырех основных объектов:

  • Слои: все обучение происходит на уровнях. Есть 3 слоя: 1) входной, 2) скрытый и 3) выходной.
  • Функция и этикетка: Ввод данных в сеть (функции) и вывод из сети (метки).
  • Функция потери: показатель, используемый для оценки эффективности этапа обучения.
  • Оптимизатор: Улучшите обучение, обновляя знания в сети.

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

Если вы посмотрите на рисунок выше, вы поймете основной механизм.

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

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

В нашей аналогии с математическими задачами это означает, что вы читаете главу учебника много раз, пока полностью не поймете содержание курса. Если даже после многократного прочтения вы продолжаете совершать ошибки, это означает, что вы достигли необходимого уровня знаний с текущим материалом. Вам нужно использовать другой учебник или протестировать другой метод, чтобы улучшить свой результат. Для нейронной сети это тот же процесс. Если погрешность далека от 100%, но кривая ровная, значит при текущей архитектуре; он не может научиться ничему другому. Сеть должна быть лучше оптимизирована для улучшения знаний.

Нейронная сеть Archiтекстура

Искусственная нейронная сеть ArchiТекстура состоит из следующих компонентов:

  • Слои
  • Функция активации
  • Функция потери
  • Оптимизатор

Слои

Уровень — это место, где происходит все обучение. Внутри слоя находится бесконечное количество весов (нейронов). Типичная нейронная сеть часто обрабатывается плотно связанными слоями (также называемыми полностью связанными слоями). Это означает, что все входы подключены к выходу.

Типичная нейронная сеть принимает входной вектор и скаляр, содержащий метки. Наиболее удобной является бинарная классификация, состоящая всего из двух классов: 0 и 1.

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

Нейронная сеть Archiтекстура
Нейронная сеть Archiтекстура

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

  1. Первый узел — это входные значения
  2. Нейрон разлагается на входную часть и функцию активации. Левая часть получает все входные данные от предыдущего слоя. Правая часть представляет собой сумму входных данных, передаваемых в функцию активации.
  3. Выходное значение вычисляется на основе скрытых слоев и используется для прогнозирования. Для классификации он равен номеру класса. Для регрессии прогнозируется только одно значение.

Функция активации

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

Функция активации

Другие функции активации:

  • Кусочно-линейный
  • сигмоид
  • Тань
  • Дырявый Релу

Критическое решение, которое необходимо принять при построении нейронной сети:

  • Сколько слоев в нейронной сети
  • Сколько скрытых единиц для каждого слоя

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

Функция потери

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

Для двоичной классификации обычно используется функция потерь двоичной перекрестной энтропии. В линейной регрессии вы используете среднеквадратическую ошибку.

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

Оптимизатор

Функция потерь является мерой производительности модели. Оптимизатор поможет улучшить веса сети, чтобы уменьшить потери. Доступны разные оптимизаторы, но наиболее распространенным из них является стохастический градиентный спуск.

Обычные оптимизаторы:

  • Momentum оптимизация,
  • Нестеров «Ускоренный градиент»,
  • АдаГрад,
  • Оптимизация Адама

Ограничения нейронной сети

Ниже приведены ограничения нейронной сети:

переобучения

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

В машинном обучении существует компромисс между оптимизацией и обобщением.

Оптимизация модели требует поиска лучших параметров, которые минимизируют потери обучающего набора.

Однако обобщение показывает, как модель ведет себя для невидимых данных.

Чтобы модель не фиксировала определенные детали или нежелательные закономерности обучающих данных, вы можете использовать разные методы. Лучший метод — иметь сбалансированный набор данных с достаточным объемом данных. Искусство уменьшения переобучения называется регуляризация. Давайте рассмотрим некоторые традиционные методы.

Размер сети

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

Регулировка веса

Стандартный метод предотвращения переобучения — добавление ограничений к весам сети. Ограничение заставляет размер сети принимать только небольшие значения. Ограничение добавляется к функции потерь ошибки. Существует два вида регуляризации:

L1: Лассо: стоимость пропорциональна абсолютному значению весовых коэффициентов.

L2: Ридж: Стоимость пропорциональна квадрату значения весовых коэффициентов.

отсев

Дропаут — странный, но полезный метод. Сеть с отсевом означает, что некоторые веса будут случайным образом установлены на ноль. Представьте, что у вас есть массив весов [0.1, 1.7, 0.7, -0.9]. Если в нейронной сети есть отсев, он станет [0.1, 0, 0, -0.9] со случайно распределенным 0. Параметр, который управляет отсевом, — это частота отсева. Скорость определяет, сколько весов нужно обнулить. Частота составляет от 0.2 до 0.5.

Пример нейронной сети в TensorFlow

Давайте посмотрим на примере искусственной нейронной сети, как нейронная сеть работает для типичной задачи классификации. Есть два входа, x1 и x2 со случайным значением. Выходные данные представляют собой двоичный класс. Цель состоит в том, чтобы классифицировать этикетку на основе этих двух признаков. Для решения этой задачи архитектура нейронной сети определяется следующим образом:

  • Два скрытых слоя
    • Первый слой состоит из четырех полностью связанных нейронов.
    • Второй слой состоит из двух полностью связанных нейронов.
  • Функция активации — Relu
  • Добавьте регуляризацию L2 со скоростью обучения 0.003.

Нейронная сеть в TensorFlow

Сеть будет оптимизировать вес в течение 180 эпох с размером пакета 10. В приведенном ниже видео-примере ИНС вы можете увидеть, как веса изменяются и как сеть улучшает сопоставление классификации.

Прежде всего, сеть присваивает случайные значения всем весам.

  • При использовании случайных весов, т. е. без оптимизации, потери на выходе составляют 0.453. На рисунке ниже представлена ​​сеть разных цветов.
  • Как правило, оранжевый цвет представляет отрицательные значения, а синий цвет — положительные значения.
  • Точки данных имеют одинаковое представление; синие — положительные метки, а оранжевые — отрицательные.

Нейронная сеть в TensorFlow

Внутри второго скрытого слоя линии окрашены в соответствии со знаком весов. Оранжевые линии присваивают отрицательные веса, а синие — положительные.

Как видите, при отображении выходных данных сеть допускает довольно много ошибок. Посмотрим, как поведет себя сеть после оптимизации.

На рисунке примера ИНС ниже показаны результаты оптимизированной сети. Прежде всего, вы замечаете, что сеть успешно научилась классифицировать точки данных. Вы можете видеть это на картинке раньше; первоначальный вес был -0.43, а после оптимизации получился вес -0.95.

Нейронная сеть в TensorFlow

Идею можно обобщить для сетей с большим количеством скрытых слоев и нейронов. Вы можете поиграть в ссылке..

Как обучить нейронную сеть с помощью TensorFlow

Вот пошаговый процесс обучения нейронной сети с помощью TensorFlow ANN с использованием оценщика API DNNClassifier.

Мы будем использовать набор данных MNIST для обучения вашей первой нейронной сети. Обучение нейронной сети с помощью TensorFlow это не очень сложно. Шаг предварительной обработки выглядит точно так же, как и в предыдущих уроках. Вы будете действовать следующим образом:

  • Шаг 1. Импортируйте данные
  • Шаг 2. Преобразование данных
  • Шаг 3: Постройте тензор
  • Шаг 4: Постройте модель
  • Шаг 5. Обучение и оценка модели
  • Шаг 6. Улучшите модель

Шаг 1) Импортируйте данные

Прежде всего вам необходимо импортировать необходимую библиотеку. Вы можете импортировать набор данных MNIST с помощью scikit Learning, как показано в примере нейронной сети TensorFlow ниже.

Набор данных MNIST — это обычно используемый набор данных для тестирования новых методов или алгоритмов. Этот набор данных представляет собой набор изображений размером 28×28 пикселей с рукописными цифрами от 0 до 9. На данный момент самая низкая ошибка в тесте составляет 0.27 процента с комитетом из 7 сверточных нейронных сетей.

import numpy as np
import tensorflow as tf
np.random.seed(1337)

Вы можете временно загрузить scikit Learn по этому адресу. Скопируйте и вставьте набор данных в удобную папку. Чтобы импортировать данные в Python, вы можете использовать fetch_mldata из scikit Learn. Вставьте путь к файлу в fetch_mldata, чтобы получить данные.

from sklearn.datasets import fetch_mldata
mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original')
print(mnist.data.shape)
print(mnist.target.shape)

После этого вы импортируете данные и получаете форму обоих наборов данных.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)
y_train  = y_train.astype(int)
y_test  = y_test.astype(int)
batch_size =len(X_train)

print(X_train.shape, y_train.shape,y_test.shape )

Шаг 2) Преобразуйте данные

В предыдущем уроке вы узнали, что вам необходимо преобразовать данные, чтобы ограничить влияние выбросов. В этом руководстве по нейронным сетям вы преобразуете данные с помощью масштабатора min-max. Формула:

(X-min_x)/(max_x - min_x)

В Scikit уже есть функция для этого: MinMaxScaler().

## resclae
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# Train
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
# test
X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))

Шаг 3) Постройте тензор

Теперь вы знакомы со способом создания тензора в Tensorflow. Вы можете преобразовать набор поездов в числовой столбец.

feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]

Шаг 4) Постройте модель

Архитектура нейронной сети содержит 2 скрытых слоя по 300 единиц для первого слоя и 100 единиц для второго. Мы используем эти значения, основываясь на собственном опыте. Вы можете настроить эти значения и посмотреть, как это повлияет на точность сети.

Чтобы построить модель, вы используете оценщик DNNClassifier. Вы можете добавить количество слоев к аргументам Feature_columns. Вам необходимо установить количество классов равным 10, так как в обучающем наборе десять классов. Вы уже знакомы с синтаксисом объекта оценки. Аргументы включают столбцы, количество классов и model_dir точно такие же, как и в предыдущем уроке. Новый аргумент скрытый_юнит управляет количеством слоев и количеством узлов, подключаемых к нейронной сети. В приведенном ниже коде есть два скрытых слоя: первый из них соединяет 300 узлов, а второй — 100 узлов.

Чтобы построить оценщик, используйте tf.estimator.DNNClassifier со следующими параметрами:

  • Feature_columns: Определите столбцы, которые будут использоваться в сети.
  • скрытые_юниты: определить количество скрытых нейронов.
  • n_classes: Определите количество классов для прогнозирования.
  • model_dir: определить путь к TensorBoard.
estimator = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100], 
    n_classes=10, 
    model_dir = '/train/DNN')

Шаг 5) Обучите и оцените модель

Вы можете использовать метод numpy для обучения модели и ее оценки.

# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_train_scaled},
    y=y_train,
    batch_size=50,
    shuffle=False,
    num_epochs=None)
estimator.train(input_fn = train_input,steps=1000) 
eval_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_test_scaled},
    y=y_test, 
    shuffle=False,
    batch_size=X_test_scaled.shape[0],
    num_epochs=1)
estimator.evaluate(eval_input,steps=None) 

Вывод:

{'accuracy': 0.9637143,
 'average_loss': 0.12014342,
 'loss': 1682.0079,
 'global_step': 1000}

Текущая архитектура обеспечивает точность оценочного набора на уровне 96 процентов.

Шаг 6) Улучшите модель

Вы можете попытаться улучшить модель, добавив параметры регуляризации.

Мы будем использовать оптимизатор Адама с коэффициентом отсева 0.3, L1 для X и L2 для y. В нейронной сети TensorFlow вы можете управлять оптимизатором, используя цепочку объектов, следующую за именем оптимизатора. TensorFlow — это встроенный API для оптимизатора Proximal AdaGrad.

Чтобы добавить регуляризацию в глубокую нейронную сеть, вы можете использовать tf.train.ProximalAdagradOptimizer со следующим параметром

  • Скорость обучения: Learning_rate
  • Регуляризация L1: l1_regularization_strength
  • Регуляризация L2: l2_regularization_strength
estimator_imp = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100],
    dropout=0.3, 
    n_classes = 10,
    optimizer=tf.train.ProximalAdagradOptimizer(
      learning_rate=0.01,
      l1_regularization_strength=0.01, 
      l2_regularization_strength=0.01
    ),
    model_dir = '/train/DNN1')
estimator_imp.train(input_fn = train_input,steps=1000) 
estimator_imp.evaluate(eval_input,steps=None) 

Вывод:

{'accuracy': 0.95057142,
 'average_loss': 0.17318928,
 'loss': 2424.6499,
 'global_step': 2000}

Значения, выбранные для уменьшения переобучения, не улучшили точность модели. Ваша первая модель имела точность 96 %, а модель с регуляризатором L2 — 95 %. Вы можете попробовать разные значения и посмотреть, как это повлияет на точность.

Резюме

В этом уроке вы узнаете, как построить нейронную сеть. Нейронная сеть требует:

  • Количество скрытых слоев
  • Количество полностью подключенных узлов
  • Функция активации
  • Оптимизатор
  • Количество классов

В TensorFlow ANN вы можете обучить нейронную сеть решению задач классификации с помощью:

  • tf.estimator.DNNClassifier

Оценщику необходимо указать:

  • Feature_columns = Feature_columns,
  • скрытые_юниты=[300, 100]
  • n_classes=10
  • модель_каталог

Улучшить модель можно, используя различные оптимизаторы. В этом уроке вы узнали, как использовать оптимизатор Adam Grad со скоростью обучения и добавить элемент управления, чтобы предотвратить переобучение.

Ежедневная рассылка Guru99

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