Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK

Как использовать TensorFlow Mobile в приложениях для Android

by
Difficulty:AdvancedLength:MediumLanguages:

Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

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

В этом уроке я покажу вам, как использовать TensorFlow Mobile в проектах Android Studio.

Предпосылки

Чтобы иметь возможность следовать этому руководству, вам понадобятся:

  • Android Studio 3.0 или выше
  • TensorFlow 1.5.0 или новее
  • Android-устройство с уровнем API 21 или выше
  • и базовое понимание фреймворка TensorFlow

1. Создание модели

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

Наша модель будет очень простой. Она будет вести себя как вентиль XOR, используя два входа, оба из которых могут быть либо ноль, либо единица, и производить один выход, который будет равен нулю, если оба входа идентичны, и единица в противном случае. Кроме того, поскольку это будет глубокая модель, у нее будут два скрытых слоя: один с четырьмя нейронами, а другой с тремя нейронами. Вы можете изменять количество скрытых слоев и количество нейронов, которые они содержат.

Чтобы этот учебник был коротким, вместо использования низкоуровневых API TensorFlow мы будем использовать TFLearn, популярную оболочную платформу для TensorFlow, предлагающую более интуитивно понятные API. Если у вас ее еще нет, используйте следующую команду для установки внутри виртуальной среды TensorFlow:

Чтобы начать создание модели, создайте скрипт Python с именем create_model.py, желательно в пустом каталоге, и откройте его с помощью вашего любимого текстового редактора.

Внутри файла первое, что нам нужно сделать, это импортировать TFLearn API.

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

Обычно полезно использовать случайные значения, выбранные из равномерного распределения, при назначении начальных весов всем нейронам в скрытых слоях. Чтобы создать значения, используйте метод uniform().

На этом этапе мы можем начать создавать слои нашей нейронной сети. Чтобы создать входной слой, мы должны использовать метод input_data(), который позволяет нам указать количество входов, которые сеть может принять. Как только уровень ввода будет готов, мы можем вызвать метод full_connected() несколько раз, чтобы добавить в сеть больше слоев.

Обратите внимание, что в приведенном выше коде мы дали значимые имена входным и выходным уровням. Это важно, потому что они нам ещё понадобятся при использовании сети из нашего приложения для Android. Также обратите внимание, что скрытый и выходной уровни используют функцию активации sigmoid. Вы можете поэкспериментировать с другими функциями активации, такими как softmax, tanh и relu.

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

Затем, чтобы TFLearn фрейсворк знал, что наша сетевая модель на самом деле является глубокой моделью нейронной сети, мы должны вызвать функцию DNN().

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

Как только обучение будет завершено, мы можем вызвать метод pred() модели, чтобы проверить, генерирует ли она желаемые выходные данные. Следующий код показывает, как проверить выходы для всех допустимых входов:

Если вы сейчас запустите скрипт Python, вы увидите вывод, который выглядит так:

Predictions after training

Обратите внимание, что выходы никогда точно не равны 0 или 1. Вместо этого они представляют собой числа с плавающей запятой, которые либо близки к нулю, либо близки к единице. Поэтому, используя выходы, вы можете использовать функцию round() Python.

Если мы явно не сохраним модель после обучения, мы потеряем ее, как только закончится сценарий. К счастью, с TFLearn, простой вызов метода save() сохраняет модель. Однако, чтобы иметь возможность использовать сохраненную модель с TensorFlow Mobile, перед ее сохранением мы должны убедиться, что мы удалим все связанные с обучением операции, которые присутствуют в коллекции tf.GraphKeys.TRAIN_OPS, связанной с ней. Следующий код показывает вам, как это сделать:

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

2. Замораживание модели

Помимо сохранения модели, мы должны заморозить ее, прежде чем мы сможем использовать ее с TensorFlow Mobile. Процесс замораживания модели, как вы могли догадаться, включает преобразование всех его переменных в константы. Кроме того, замороженная модель должна быть одним двоичным файлом, который соответствует формату сериализации  Google Protocol Buffers.

Создайте новый скрипт Python с именем freeze_model.py и откройте его с помощью текстового редактора. Мы напишем весь код, чтобы заморозить нашу модель внутри этого файла.

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

Во всем скрипте мы будем использовать один сеанс TensorFlow. Чтобы создать сеанс, используйте конструктор класса Session.

На этом этапе мы должны создать объект Saver, вызвав функцию import_meta_graph() и передав ему имя файла метаданных модели. В дополнение к возврату объекта Saver функция import_meta_graph() также автоматически добавляет определение графа модели к определению сеанса.

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

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

Вызов метода SerializeToString() для определения замороженного графа дает нам двоичное представление протобуфа модели. Используя базовые возможности ввода-вывода для Python, я предлагаю вам сохранить его как файл с именем frozen_model.pb.

Теперь вы можете запустить скрипт для создания замороженной модели.

Теперь у нас есть все необходимое для начала использования TensorFlow Mobile.

3. Настройка Android Studio Project

Библиотека TensorFlow Mobile доступна в JCenter, поэтому мы можем напрямую добавить ее как implementation зависимость в файле build.gradle в модуле app.

Чтобы добавить замороженную модель в проект, поместите файл frozen_model.pb в папку assets проекта.

4. Инициализация интерфейса TensorFlow

TensorFlow Mobile предлагает простой интерфейс, который мы можем использовать для взаимодействия с нашей замороженной моделью. Чтобы создать интерфейс, используйте конструктор класса TensorFlowInferenceInterface, который ожидает экземпляр AssetManager и имя файла замороженной модели.

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

Чтобы убедиться, что TensorFlow Mobile удалось правильно прочитать файл нашей модели, давайте попробуем распечатать имена всех операций, которые присутствуют на графе модели. Чтобы получить ссылку на граф, мы можем использовать метод graph() интерфейса и получить все операции, метод operations() графа. В следующем коде показано, как:

Если вы сейчас запустите приложение, вы сможете увидеть более дюжины названий операций, напечатанных в окне Android Studio Logcat. Среди всех этих имен, если не было ошибок при замораживании модели, вы сможете найти имена входных и выходных слоев: my_input/X и my_output/Sigmoid.

Logcat window showing list of operations

5. Использование модели

Чтобы сделать прогнозы с помощью модели, мы должны поместить данные в уровень ввода и извлечь данные из выходного уровня. Чтобы поместить данные во входной уровень, используйте метод feed() интерфейса, который ожидает имя слоя, массив, содержащий входные данные, и размеры массива. В следующем коде показано, как отправить числа 0 и 1 во входной слой:

После загрузки данных во входной слой мы должны выполнить операцию вывода с использованием метода run(), который ожидает имя выходного уровня. Как только операция будет завершена, выходной уровень будет содержать предсказание модели. Чтобы загрузить предсказание в массив Kotlin, мы можем использовать метод fetch(). Следующий код покажет вам, как это сделать:

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

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

Logcat window displaying the prediction

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

Заключение

Теперь вы знаете, как создать простую модель TensorFlow и использовать ее с TensorFlow Mobile в приложениях для Android. Тем не менее, вы не всегда должны ограничивать себя своими собственными моделями. Благодаря навыкам, которые вы узнали сегодня, у вас не должно возникнуть проблем с использованием более крупных моделей, таких как MobileNet и Inception, доступных в зоопарке TensorFlow. Обратите внимание, однако, что такие модели приведут к увеличению APK, что может создать проблемы для пользователей со слабыми устройствами.

Чтобы узнать больше о TensorFlow Mobile, обратитесь к официальной документации.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.