Привет ребята,

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

Не забудьте прочитать предыдущий пост о начале работы с Tensorflow!

Покажите свою поддержку, подписавшись на нашу рассылку!

Нейронная сеть, слои, веса и смещения

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

Нейронная сеть может состоять из n слоев. В нейронной сети есть 3 типа слоев:

  1. Входной слой - как видно из названия, этот слой принимает входные данные и соответственно обрабатывает выходные данные.
  2. Скрытый слой - это тип слоя между входным и выходным слоями, функционирование которого неизвестно, отсюда и название «скрытый», да!
  3. Выходной слой - это последний уровень любой нейронной сети, который выдает выходные данные в соответствии с входными данными, указанными в начале.

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

Веса и предубеждения

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

Давайте посмотрим, как выглядит простая функция вывода -

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

Далее идет предвзятость. Смещение - это нейронная сеть, это уравнение - это дополнительный нейрон со значением 1 в нейронной сети. Подумайте о предвзятости как о модераторе вывода или переменной, которую можно использовать для формирования того, каким мы хотим видеть наш вывод. Это все, что вам нужно знать о предвзятости.

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

Ну хватит теории, приступим к приключениям!

Модель

Начнем с импорта необходимых библиотек и набора данных.

Мы импортировали тензорный поток (потому что черт!) И набор данных MNIST, который представляет собой набор функций для распознавания рукописных цифр. Обратите внимание, что мы использовали параметр one_hot как True, это означает, что все 10 цифр (0–9) будут представлены как 1 как вкл., А остальные как выкл. Или 0 в списке из 10 цифр. Например,

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

Двигаясь дальше, мы построим наши скрытые слои, выходной слой и размер пакета.

Мы используем 3 скрытых слоя по 1000 нейронов в каждом, а выходной слой имеет 10 нейронов, которые представляют выходы (0–9), которые мы надеемся предсказать, и принимаем размер пакета равным 100.

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

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

1. Построение нейронной сети

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

Ого! Слишком много, чтобы справиться со всем сразу! Давайте займемся этим построчно.

Строка 1–3: Обрабатывает объявление заполнителей для входных и выходных переменных x и y соответственно, которые будут использоваться в нейронной сети.

Строка 4-17: Эта часть нашего кода обрабатывает случайные инициализации весов и смещений для слоев нашей нейронной сети.

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

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

Строки 18–29: Здесь происходит большая часть математических вычислений. Для каждого слоя первая часть представляет собой сумму произведений весов с входными данными, а затем с нейроном смещения.

Во второй части все становится интереснее. Мы используем выпрямленные линейные единицы (ReLU) - это функция активации для каждого слоя.

ReLU - одна из многих функций активации, используемых в машинном обучении. По сути, это дает нам два типа значений. 0 для всех входов меньше 0 и непрерывное действительное число для всех входов больше 0. Это широко используемая функция активации и предпочтительнее сигмовидной функции, поскольку она дает лучшие результаты при обучении.

Вы можете прочитать о ReLU и многих других функциях в этом замечательном сообщении от Towards Data Science.

2. Обучение

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

Опять же, давайте попробуем разобраться в вещах построчно:

Строка 1–3: Мы только что определили функцию train () и получили прогноз, вызвав nnmodel () и передав наши входные данные x.

Строка 4–6: Здесь основное внимание уделяется вычислению стоимости с помощью функции softmax () и использования логитов , что означает, что функция управляет немасштабируемым вводом предыдущего слоя (забудьте об этом, если он перебил вашу голову).

Рассчитанная стоимость затем оптимизируется с помощью оптимизатора Adaptive Moment Estimation (Adam), который является расширением алгоритма стохастического градиентного спуска.

Вы можете прочитать этот отличный пост от Machine Learning Mastery, чтобы глубже понять оптимизатор Adam.

Строка 7–13: Теперь мы объявим количество эпох или количество раз, когда веса будут обновлены, чтобы получить приличную точность. Мы установили это на 15.

Затем мы запустим сеанс тензорного потока с помощью функции tf.Session () и инициализируем все глобальные переменные. Мы также напечатаем количество общих эпох для понимания пользователя.

Строка 14–22: Это суть обучающей функции. Используя цикл for для количества эпох, мы берем множество обучающих наборов пакет за пакетом.

Затем мы инициализируем переменные epoch_x и epoch_y с помощью тестовых примеров и выходов, соответственно повторяемых в пакете. Затем они используются для расчета потерь для этой эпохи с использованием функции стоимости и оптимизатора, которые мы объявили в строках 4–6.

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

Строка 23–28: Количество правильных прогнозов рассчитывается путем приравнивания переменной прогноз, полученной функцией nnmodel (), с выходной переменной y получено из набора данных mnist.

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

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

Обратите внимание, как потери увеличиваются и уменьшаются с эпохами, что указывает на то, как обучается модель. Мы получили конечную точность 96,25%, что довольно неплохо для нашей первой модели!

Ладно. вот как можно создать глубокую нейронную сеть в тензорном потоке! В следующих статьях мы подробно рассмотрим создание различных моделей и выполнение множества интересных вещей с использованием tenorflow.

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