Привет ребята,
Здесь Нишанк, добро пожаловать в кликбейт. Сегодня мы построим глубокие нейронные сети с помощью Tensorflow. Мы начнем с создания некоторых базовых принципов, а затем постепенно перейдем к построению нашей нейронной сети. Давайте начнем!
Не забудьте прочитать предыдущий пост о начале работы с Tensorflow!
Покажите свою поддержку, подписавшись на нашу рассылку!
Нейронная сеть, слои, веса и смещения
Нейронная сеть или искусственная нейронная сеть (ИНС) - это взаимосвязанная совокупность нейронов, которые выровнены таким образом, что они выполняют математическую функцию и помогают нам решать проблему, изучая и наблюдая обучающие примеры для прогнозирования некоторых вывод для тестовых случаев.
Нейронная сеть может состоять из n слоев. В нейронной сети есть 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.
Весь код, использованный в этом посте, можно найти, нажав на баннер ниже. Скоро опубликую третий пост в серии. Следите за обновлениями и подпишитесь на нашу рассылку новостей, чтобы получать незабываемые впечатления и никогда не пропускать обновления.