Привет всем, Надеюсь, у вас все хорошо. Сегодня я собираюсь рассказать о том, как мы можем построить свёрточную нейронную сеть, используя TensorFlow Functional API. Поэтому я планировал поделиться некоторыми знаниями о TensorFlow в этой статье блога.

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

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

Функциональный API

Функциональный API в tf.Keras – это альтернативный способ создания моделей, который обеспечивает гораздо большую гибкость, включая создание более сложных моделей. Например, при реализации несколько более сложного варианта использования с машинным обучением, весьма вероятно, вы можете столкнуться с ситуацией, когда вам потребуется несколько моделей для одного и того же набора данных. Таким образом, мы хотели бы иметь два выхода. Самым простым вариантом было бы создание двух отдельных моделей на основе одного и того же набора данных для прогнозирования переменных. Это было бы управляемо, но что, если бы в реальном сценарии у нас было бы 100 выходов. Управлять всеми этими отдельными моделями может быть непросто. Вместо этого более продуктивно создать единую модель с несколькими выходами.

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

Основное различие между Sequential API и Functional

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

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

Теперь давайте начнем строить модель CNN с использованием функционального API. В этой статье я использовал набор данных MNIST для построения сверточной нейронной сети для классификации изображений. База данных MNIST содержит 60 000 обучающих изображений и 10 000 тестовых изображений, полученных от сотрудников Американского бюро переписи населения и американских старшеклассников [Википедия].

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

Теперь я разделил эти две группы на обучение и тестирование, а также разделил метки и изображения. Части x_train и x_test содержат RGB-коды в оттенках серого (от 0 до 255), а части y_train и y_test содержат метки от 0 до 9, которые представляют собой число, которым они являются на самом деле. Мы должны нормализовать наши данные, поскольку это всегда требуется в моделях нейронных сетей. Мы можем добиться этого, разделив коды RGB на 255 (что является максимальным кодом RGB минус минимальный код RGB). Это можно сделать с помощью следующего кода:

Теперь давайте инициализируем параметры сети.

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

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

Глубокие нейронные сети, точнее сверточные нейронные сети (CNN), в основном представляют собой набор слоев, которые определяются действием ряда фильтров на входе. Эти фильтры обычно называются ядрами. Например, ядра в сверточном слое — это сверточные фильтры. На самом деле выполняется не свертка, а кросс-корреляция. Под размером ядра здесь понимается ширина x высота маски фильтра.

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

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

Теперь мы рассмотрим определение простого многослойного Perceptron, сверточной нейронной сети.

Выше кода вы можете видеть, что мы определяем многоуровневую модель Perceptron для бинарной классификации. Модель имеет входы, 3 скрытых слоя с 64 нейронами и выходной слой с 1 выходом. Исправленные функции линейной активации используются в каждом скрытом слое, а функция активации softmax используется в выходном слое для двоичной классификации.

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

После создания всех слоев модели и соединения их вместе мы должны определить модель. Как и в случае с Sequential API, модель — это то, что мы можем суммировать, подогнать, оценить и использовать для прогнозирования. TensorFlow предоставляет класс Model, который вы можете использовать для создания модели из созданных вами слоев. Для этого требуется указать только входной и выходной слои.

построить структуру сети, а также график модели.

Наконец, мы обучаем модель с помощью обучающих и тестовых наборов данных.

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

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

ресурсы: Как использовать функциональный API Keras для глубокого обучения (machinelearningmastery.com)