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

искусственный интеллект TensorFlow Программа перевода самородков Android

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

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

Предварительная подготовка

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

  • Android Studio3.0 или выше
  • TensorFlow1.5.0 или новее
  • Android-устройство, поддерживающее API уровня 21 или выше.
  • И базовое понимание фреймворка TensorFlow.

1. Создайте модель

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

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

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

pip install tflearn

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

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

import tflearn

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

X = [
    [0, 0],
    [0, 1],
    [1, 0],
    [1, 1]
]
 
Y = [
    [0],  # Desired output for inputs 0, 0
    [1],  # Desired output for inputs 0, 1
    [1],  # Desired output for inputs 1, 0
    [0]   # Desired output for inputs 1, 1
]

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

weights = tflearn.initializations.uniform(minval = -1, maxval = 1)

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

# 输入层
net = tflearn.input_data(
        shape = [None, 2],
        name = 'my_input'
)
 
# 隐藏层
net = tflearn.fully_connected(net, 4,
        activation = 'sigmoid',
        weights_init = weights
)
net = tflearn.fully_connected(net, 3,
        activation = 'sigmoid',
        weights_init = weights
)
 
# 输出层
net = tflearn.fully_connected(net, 1,
        activation = 'sigmoid', 
        weights_init = weights,
        name = 'my_output'
)

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

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

net = tflearn.regression(net,
        learning_rate = 2,
        optimizer = 'sgd',
        loss = 'mean_square'
)

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

model = tflearn.DNN(net)

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

model.fit(X, Y, 5000)

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

print("1 XOR 0 = %f" % model.predict([[1,0]]).item(0))
print("1 XOR 1 = %f" % model.predict([[1,1]]).item(0))
print("0 XOR 1 = %f" % model.predict([[0,1]]).item(0))
print("0 XOR 0 = %f" % model.predict([[0,0]]).item(0))

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

训练后的预测结果

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

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

# 移除训练相关的操作
with net.graph.as_default():
    del tf.get_collection_ref(tf.GraphKeys.TRAIN_OPS)[:]
 
# 保存模型
model.save('xor.tflearn')

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

2. Модель затвердевания

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

Создайте новый с именемfreeze_model.pyСкрипт Python и откройте его в текстовом редакторе. В этот файл мы запишем затвердевший код модели.

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

import tensorflow as tf

На протяжении всего скрипта мы будем использовать один сеанс TensorFlow. Мы используемSessionКонструктор класса создает сеанс.

with tf.Session() as session:
    # 代码的其他部分在这

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

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

my_saver = tf.train.import_meta_graph('xor.tflearn.meta')
my_saver.restore(session, tf.train.latest_checkpoint('.'))

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

frozen_graph = tf.graph_util.convert_variables_to_constants(
    session,
    session.graph_def,
    ['my_output/Sigmoid']
)

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

with open('frozen_model.pb', 'wb') as f:
    f.write(frozen_graph.SerializeToString())

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

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

3. Настройки проекта Android Studio

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

implementation 'org.tensorflow:tensorflow-android:1.7.0'

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

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

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

thread {
    val tfInterface = TensorFlowInferenceInterface(assets,
                                        "frozen_model.pb")
     
    // More code here
}

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

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

val graph = tfInterface.graph()
graph.operations().forEach {
    println(it.name())
}

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

Logcat 窗口展示了操作列表

5. Используйте модель

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

tfInterface.feed("my_input/X",
            floatArrayOf(0f, 1f), 1, 2)

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

tfInterface.run(arrayOf("my_output/Sigmoid"))
 
val output = floatArrayOf(-1f)
tfInterface.fetch("my_output/Sigmoid", output)

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

Logcat window displaying the prediction

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

Суммировать

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

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


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.