{% raw %}
# 十六、移動和嵌入式平臺上的 TensorFlow 模型
TensorFlow 模型還可用于在移動和嵌入式平臺上運行的應用。 TensorFlow Lite 和 TensorFlow Mobile 是資源受限移動設備的兩種 TensorFlow。與 TensorFlow Mobile 相比,TensorFlow Lite 支持功能的子集。由于較小的二進制大小和較少的依賴項,TensorFlow Lite 可以獲得更好的表現。
要將 TensorFlow 集成到您的應用中,首先,使用我們在整本書中提到的技術訓練模型,然后保存模型。現在可以使用保存的模型在移動應用中進行推理和預測。
要了解如何在移動設備上使用 TensorFlow 模型,在本章中我們將介紹以下主題:
* 移動平臺上的 TensorFlow
* Android 應用中的 TFMobile
* Android 上的 TFMobile 演示
* iOS 上的 TFMobile 演示
* TensorFlow Lite
* Android 上的 TFLite 演示
* iOS 上的 TFLite 演示
# 移動平臺上的 TensorFlow
TensorFlow 可以集成到移動應用中,用于涉及以下一項或多項機器學習任務的許多用例:
* 語音識別
* 圖像識別
* 手勢識別
* 光學字符識別
* 圖像或文本分類
* 圖像,文本或語音合成
* 對象識別
要在移動應用上運行 TensorFlow,我們需要兩個主要成分:
* 經過訓練和保存的模型,可用于預測
* TensorFlow 二進制文件,可以接收輸入,應用模型,生成預測,并將預測作為輸出發送
高級架構如下圖所示:

移動應用代碼將輸入發送到 TensorFlow 二進制文件,該二進制文件使用訓練的模型來計算預測并將預測發回。
# Android 應用中的 TFMobile
TensorFlow 生態系統使其能夠通過接口類`TensorFlowInferenceInterface`,和 jar 文件`libandroid_tensorflow_inference_java.jar`中的 TensorFlow Java API 在 Android 應用中使用。您可以使用 JCenter 中的 jar 文件,從`ci.tensorflow.org`下載預編譯的 jar,也可以自己構建。
推理接口已作為 JCenter 包提供,可以通過將以下代碼添加到`build.gradle`文件中包含在 Android 項目中:
```py
allprojects {
repositories {
jcenter()
}
}
dependencies {
compile 'org.tensorflow:tensorflow-android:+'
}
```
[您可以按照此鏈接中的說明使用 Bazel 或 Cmake 自行構建它們,而不是使用 JCenter 中的預構建二進制文件](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/README.md)。
在 Android 項目中配置 TF 庫后,您可以通過以下四個步驟調用 TF 模型:
1. 加載模型:
```py
TensorFlowInferenceInterface inferenceInterface =
new TensorFlowInferenceInterface(assetManager, modelFilename);
```
1. 將輸入數據發送到 TensorFlow 二進制文件:
```py
inferenceInterface.feed(inputName,
floatValues, 1, inputSize, inputSize, 3);
```
1. 運行預測或推理:
```py
inferenceInterface.run(outputNames, logStats);
```
1. 接收 TensorFlow 二進制文件的輸出:
```py
inferenceInterface.fetch(outputName, outputs);
```
# Android 上的 TFMobile 演示
在本節中,我們將學習如何重新創建 TensorFlow 團隊在其官方倉庫中提供的 Android 演示應用。 Android 演示將在您的 Android 設備上安裝以下四個應用:
* `TF Classify`:這是一個對象識別應用,用于識別設備攝像頭輸入中的圖像,并在其中一個預定義的類中對其進行分類。它不會學習新類型的圖片,但會嘗試將它們分類為已經學過的類別之一。該應用使用 Google 預訓練的初始模型構建。
* `TF Detect`:這是一個物體檢測應用,可檢測設備相機輸入中的多個物體。在連續圖像進紙模式下移動相機時,它會繼續識別對象。
* `TF Stylize`:這是一個樣式轉移應用,可將選定的預定義樣式之一傳輸到設備相機的輸入。
* `TF Speech`:這是一個語音識別應用,用于識別您的語音,如果它與應用中的某個預定義命令匹配,則它會在設備屏幕上突出顯示該特定命令。
示例演示僅適用于 API 級別大于 21 的 Android 設備,并且該設備必須具有支持`FOCUS_MODE_CONTINUOUS_PICTURE`的現代相機。如果您的設備相機不支持此功能,[則必須添加作者提交給 TensorFlow 的路徑](https://github.com/tensorflow/tensorflow/pull/15489/files)。。
在您的設備上構建和部署演示應用的最簡單方法是使用 Android Studio。要以這種方式構建它,請按照下列步驟操作:
1. 安裝 Android Studio。[我們通過此鏈接的說明在 Ubuntu 16.04 上安裝了 Android Studio](https://developer.android.com/studio/install.html)。
2. 查看 TensorFlow 倉庫,并應用上一篇技巧中提到的補丁。我們假設您檢查了主目錄中`tensorflow`文件夾中的代碼。
1. 使用 Android Studio,在路徑`~/tensorflow/tensorflow/examples/Android`中打開 Android 項目。您的屏幕看起來與此類似:

1. 從左側欄中展開 Gradle Scripts 選項,然后打開`build.gradle`文件。
2. 在`build.gradle`文件中,找到`def nativeBuildSystem`定義并將其設置為`'none'`。在我們檢出的代碼版本中,此定義位于第 43 行:
```py
def nativeBuildSystem = 'none'
```
1. 構建演示并在真實或模擬設備上運行它。我們在這些設備上測試了應用:

1. 您還可以構建 apk 并在虛擬或實際連接的設備上安裝 apk 文件。一旦應用安裝在設備上,您將看到我們之前討論的四個應用:

Android 模擬器中的 TF 示例應用
[您還可以按照此鏈接中的說明使用 Bazel 或 Cmake 從源構建整個演示應用](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android)。
# iOS 應用中的 TFMobile
TensorFlow 通過以下步驟支持 iOS 應用:
1. 通過在項目的根目錄中添加名為`Profile`的文件,在您的應用中包含 TFMobile。將以下內容添加到`Profile`:
```py
target 'Name-Of-Your-Project'
pod 'TensorFlow-experimental'
```
1. 運行`pod install`命令下載并安裝 TensorFlow 實驗艙。
2. 運行`myproject.xcworkspace`命令打開工作區,以便將預測代碼添加到應用邏輯中。
要為 iOS 項目創建自己的 TensorFlow 二進制文件,請按照[此鏈接中的說明](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/ios)。
在 iOS 項目中配置 TF 庫后,可以通過以下四個步驟調用 TF 模型:
1. 加載模型:
```py
PortableReadFileToProto(file_path, &tensorflow_graph);
```
1. 創建會話:
```py
tensorflow::Status s = session->Create(tensorflow_graph);
```
1. 運行預測或推理并獲得輸出:
```py
std::string input_layer = "input";
std::string output_layer = "output";
std::vector<tensorflow::Tensor> outputs;
tensorflow::Status run_status = session->Run(
{{input_layer, image_tensor}},
{output_layer}, {}, &outputs);
```
1. 獲取輸出數據:
```py
tensorflow::Tensor* output = &outputs[0];
```
# iOS 上的 TFMobile 演示
要在 iOS 上構建演示,您需要 Xcode 7.3 或更高版本。請按照以下步驟構建 iOS 演示應用:
1. 查看主目錄中`tensorflow`文件夾中的 TensorFlow 代碼。
2. 打開終端窗口并從主文件夾執行以下命令以下載 InceptionV1 模型,提取標簽和圖文件,并將這些文件移動到示例應用代碼中的數據文件夾中:
```py
$ mkdir -p ~/Downloads
$ curl -o ~/Downloads/inception5h.zip \
https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip \
&& unzip ~/Downloads/inception5h.zip -d ~/Downloads/inception5h
$ cp ~/Downloads/inception5h/* \
~/tensorflow/tensorflow/examples/ios/benchmark/data/
$ cp ~/Downloads/inception5h/* \
~/tensorflow/tensorflow/examples/ios/camera/data/
$ cp ~/Downloads/inception5h/* \
~/tensorflow/tensorflow/examples/ios/simple/data/
```
1. 導航到其中一個示例文件夾并下載實驗窗格:
```py
$ cd ~/tensorflow/tensorflow/examples/ios/camera
$ pod install
```
1. 打開 Xcode 工作區:
```py
$ open tf_simple_example.xcworkspace
```
1. 在設備模擬器中運行示例應用。示例應用將顯示“運行模型”按鈕。相機應用需要連接 Apple 設備,而其他兩個也可以在模擬器中運行。
# TensorFlow Lite
在編寫本書時,TFLite 是該版塊中的新手,并且仍處于開發人員視圖中。 TFLite 是 TensorFlow Mobile 和 TensorFlow 的一個非常小的子集,因此使用 TFLite 編譯的二進制文件非常小,并提供卓越的表現。除了減小二進制文件的大小,TensorFlow 還采用了各種其他技術,例如:
* 內核針對各種設備和移動架構進行了優化
* 計算中使用的值是量化的
* 激活函數是預融合的
* 它利用設備上可用的專用機器學習軟件或硬件,例如 Android NN API
在 TFLite 中使用模型的工作流程如下:
1. **獲取模型**:您可以訓練自己的模型或選擇可從不同來源獲得的預訓練模型,并按原樣使用預訓練或使用您自己的數據再訓練,或在修改某些部分后再訓練該模型。只要您在文件中使用擴展名為`.pb`或`.pbtxt`的訓練模型,就可以繼續執行下一步。我們在前面的章節中學習了如何保存模型。
2. **檢查模型**:模型文件只包含圖的結構,因此需要保存檢查點文件。檢查點文件包含模型的序列化變量,例如權重和偏差。我們在前面的章節中學習了如何保存檢查點。
3. **凍結模型**:合并檢查點和模型文件,也稱為凍結圖。 TensorFlow 為此步驟提供`freeze_graph`工具,可以按如下方式執行:
```py
$ freeze_graph
--input_graph=mymodel.pb
--input_checkpoint=mycheckpoint.ckpt
--input_binary=true
--output_graph=frozen_model.pb
--output_node_name=mymodel_nodes
```
1. **轉換模型**:需要使用 TensorFlow 提供的`toco`工具將步驟 3 中的凍結模型轉換為 TFLite 格式:
```py
$ toco
--input_file=frozen_model.pb
--input_format=TENSORFLOW_GRAPHDEF
--output_format=TFLITE
--input_type=FLOAT
--input_arrays=input_nodes
--output_arrays=mymodel_nodes
--input_shapes=n,h,w,c
```
1. 現在,在步驟 4 中保存的`.tflite`模型可以在使用 TFLite 二進制文件進行推理的 Android 或 iOS 應用中使用。在您的應用中包含 TFLite 二進制文件的過程不斷發展,因此我們建議讀者按照[此鏈接中的信息](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/g3doc)在您的 Android 或 iOS 應用中包含 TFLite 二進制文件。
通常,您可以使用`graph_transforms:summarize_graph`工具修剪在步驟 1 中獲得的模型。 修剪后的模型將僅具有在推理或預測時從輸入到輸出的路徑。僅刪除訓練或調試所需的任何其他節點和路徑(例如保存檢查點),從而使最終模型的大小非常小。
官方 TensorFlow 倉庫附帶 TFLite 演示,該演示使用預訓練的`mobilenet`對來自 1001 類別中的設備相機的輸入進行分類。演示應用顯示前三個類別的概率。
# Android 上的 TFLite 演示
要在 Android 上構建 TFLite 演示,請按照下列步驟操作:
1. 安裝 Android Studio。[我們通過此鏈接的說明在 Ubuntu 16.04 上安裝了 Android Studio](https://developer.android.com/studio/install.html)。
2. 查看 TensorFlow 倉庫,并應用上一篇技巧中提到的補丁。我們假設您檢查了主目錄中`tensorflow`文件夾中的代碼。
1. 使用 Android Studio,從路徑`~/tensorflow/tensorflow/contrib/lite/java/demo`打開 Android 項目。如果它抱怨缺少 SDK 或 Gradle 組件,請安裝這些組件并同步 Gradle。
2. 構建項目并使用`API?? > 21`在虛擬設備上運行它。
我們收到了以下警告,但構建成功了。 如果構建失敗,您可能希望解決警告:
`Warning:The Jack toolchain is deprecated and will not run. To enable support for Java 8 language features built into the plugin, remove 'jackOptions { ... }' from your build.gradle file, and add`
`android.compileOptions.sourceCompatibility 1.8`
`android.compileOptions.targetCompatibility 1.8`
`Future versions of the plugin will not support usage of 'jackOptions' in build.gradle.`
`To learn more, go to https://d.android.com/r/tools/java-8-support-message.html`
`Warning:The specified Android SDK Build Tools version (26.0.1) is ignored, as it is below the minimum supported version (26.0.2) for Android Gradle Plugin 3.0.1.`
`Android SDK Build Tools 26.0.2 will be used.`
`To suppress this warning, remove "buildToolsVersion '26.0.1'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.`
您還可以使用 Bazel 從源代碼構建整個演示應用,[其中包含此鏈接中的說明](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite)。
# iOS 上的 TFLite 演示
要在 iOS 上構建演示,您需要 Xcode 7.3 或更高版本。請按照以下步驟構建 iOS 演示應用:
1. 查看主目錄中`tensorflow`文件夾中的 TensorFlow 代碼。
2. 根據[此鏈接](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/g3doc)中的說明構建適用于 iOS 的 TFLite 二進制文件。
3. 導航到示例文件夾并下載 pod:
```py
$ cd ~/tensorflow/tensorflow/contrib/lite/examples/ios/camera
$ pod install
```
1. 打開 Xcode 工作區:
```py
$ open tflite_camera_example.xcworkspace
```
1. 在設備模擬器中運行示例應用。
# 總結
在本章中,我們學習了在移動應用和設備上使用 TensorFlow 模型。 TensorFlow 提供了兩種在移動設備上運行的方式:TFMobile 和 TFLite。我們學習了如何為 iOs 和 Android 構建 TFMobile 和 TFLite 應用。我們在本章中使用了 TensorFlow 演示應用作為示例。鼓勵讀者探索這些演示應用的源代碼,并使用 TFMobile 和 TFLite 通過使用 TensorFlow 構建的機器學習模型為自己的移動應用提供支持。
在下一章中,我們將學習如何在 R 統計軟件中使用 TensorFlow 和 RStudio 發布的 R 包。
{% endraw %}
- TensorFlow 1.x 深度學習秘籍
- 零、前言
- 一、TensorFlow 簡介
- 二、回歸
- 三、神經網絡:感知器
- 四、卷積神經網絡
- 五、高級卷積神經網絡
- 六、循環神經網絡
- 七、無監督學習
- 八、自編碼器
- 九、強化學習
- 十、移動計算
- 十一、生成模型和 CapsNet
- 十二、分布式 TensorFlow 和云深度學習
- 十三、AutoML 和學習如何學習(元學習)
- 十四、TensorFlow 處理單元
- 使用 TensorFlow 構建機器學習項目中文版
- 一、探索和轉換數據
- 二、聚類
- 三、線性回歸
- 四、邏輯回歸
- 五、簡單的前饋神經網絡
- 六、卷積神經網絡
- 七、循環神經網絡和 LSTM
- 八、深度神經網絡
- 九、大規模運行模型 -- GPU 和服務
- 十、庫安裝和其他提示
- TensorFlow 深度學習中文第二版
- 一、人工神經網絡
- 二、TensorFlow v1.6 的新功能是什么?
- 三、實現前饋神經網絡
- 四、CNN 實戰
- 五、使用 TensorFlow 實現自編碼器
- 六、RNN 和梯度消失或爆炸問題
- 七、TensorFlow GPU 配置
- 八、TFLearn
- 九、使用協同過濾的電影推薦
- 十、OpenAI Gym
- TensorFlow 深度學習實戰指南中文版
- 一、入門
- 二、深度神經網絡
- 三、卷積神經網絡
- 四、循環神經網絡介紹
- 五、總結
- 精通 TensorFlow 1.x
- 一、TensorFlow 101
- 二、TensorFlow 的高級庫
- 三、Keras 101
- 四、TensorFlow 中的經典機器學習
- 五、TensorFlow 和 Keras 中的神經網絡和 MLP
- 六、TensorFlow 和 Keras 中的 RNN
- 七、TensorFlow 和 Keras 中的用于時間序列數據的 RNN
- 八、TensorFlow 和 Keras 中的用于文本數據的 RNN
- 九、TensorFlow 和 Keras 中的 CNN
- 十、TensorFlow 和 Keras 中的自編碼器
- 十一、TF 服務:生產中的 TensorFlow 模型
- 十二、遷移學習和預訓練模型
- 十三、深度強化學習
- 十四、生成對抗網絡
- 十五、TensorFlow 集群的分布式模型
- 十六、移動和嵌入式平臺上的 TensorFlow 模型
- 十七、R 中的 TensorFlow 和 Keras
- 十八、調試 TensorFlow 模型
- 十九、張量處理單元
- TensorFlow 機器學習秘籍中文第二版
- 一、TensorFlow 入門
- 二、TensorFlow 的方式
- 三、線性回歸
- 四、支持向量機
- 五、最近鄰方法
- 六、神經網絡
- 七、自然語言處理
- 八、卷積神經網絡
- 九、循環神經網絡
- 十、將 TensorFlow 投入生產
- 十一、更多 TensorFlow
- 與 TensorFlow 的初次接觸
- 前言
- 1.?TensorFlow 基礎知識
- 2. TensorFlow 中的線性回歸
- 3. TensorFlow 中的聚類
- 4. TensorFlow 中的單層神經網絡
- 5. TensorFlow 中的多層神經網絡
- 6. 并行
- 后記
- TensorFlow 學習指南
- 一、基礎
- 二、線性模型
- 三、學習
- 四、分布式
- TensorFlow Rager 教程
- 一、如何使用 TensorFlow Eager 構建簡單的神經網絡
- 二、在 Eager 模式中使用指標
- 三、如何保存和恢復訓練模型
- 四、文本序列到 TFRecords
- 五、如何將原始圖片數據轉換為 TFRecords
- 六、如何使用 TensorFlow Eager 從 TFRecords 批量讀取數據
- 七、使用 TensorFlow Eager 構建用于情感識別的卷積神經網絡(CNN)
- 八、用于 TensorFlow Eager 序列分類的動態循壞神經網絡
- 九、用于 TensorFlow Eager 時間序列回歸的遞歸神經網絡
- TensorFlow 高效編程
- 圖嵌入綜述:問題,技術與應用
- 一、引言
- 三、圖嵌入的問題設定
- 四、圖嵌入技術
- 基于邊重構的優化問題
- 應用
- 基于深度學習的推薦系統:綜述和新視角
- 引言
- 基于深度學習的推薦:最先進的技術
- 基于卷積神經網絡的推薦
- 關于卷積神經網絡我們理解了什么
- 第1章概論
- 第2章多層網絡
- 2.1.4生成對抗網絡
- 2.2.1最近ConvNets演變中的關鍵架構
- 2.2.2走向ConvNet不變性
- 2.3時空卷積網絡
- 第3章了解ConvNets構建塊
- 3.2整改
- 3.3規范化
- 3.4匯集
- 第四章現狀
- 4.2打開問題
- 參考
- 機器學習超級復習筆記
- Python 遷移學習實用指南
- 零、前言
- 一、機器學習基礎
- 二、深度學習基礎
- 三、了解深度學習架構
- 四、遷移學習基礎
- 五、釋放遷移學習的力量
- 六、圖像識別與分類
- 七、文本文件分類
- 八、音頻事件識別與分類
- 九、DeepDream
- 十、自動圖像字幕生成器
- 十一、圖像著色
- 面向計算機視覺的深度學習
- 零、前言
- 一、入門
- 二、圖像分類
- 三、圖像檢索
- 四、對象檢測
- 五、語義分割
- 六、相似性學習
- 七、圖像字幕
- 八、生成模型
- 九、視頻分類
- 十、部署
- 深度學習快速參考
- 零、前言
- 一、深度學習的基礎
- 二、使用深度學習解決回歸問題
- 三、使用 TensorBoard 監控網絡訓練
- 四、使用深度學習解決二分類問題
- 五、使用 Keras 解決多分類問題
- 六、超參數優化
- 七、從頭開始訓練 CNN
- 八、將預訓練的 CNN 用于遷移學習
- 九、從頭開始訓練 RNN
- 十、使用詞嵌入從頭開始訓練 LSTM
- 十一、訓練 Seq2Seq 模型
- 十二、深度強化學習
- 十三、生成對抗網絡
- TensorFlow 2.0 快速入門指南
- 零、前言
- 第 1 部分:TensorFlow 2.00 Alpha 簡介
- 一、TensorFlow 2 簡介
- 二、Keras:TensorFlow 2 的高級 API
- 三、TensorFlow 2 和 ANN 技術
- 第 2 部分:TensorFlow 2.00 Alpha 中的監督和無監督學習
- 四、TensorFlow 2 和監督機器學習
- 五、TensorFlow 2 和無監督學習
- 第 3 部分:TensorFlow 2.00 Alpha 的神經網絡應用
- 六、使用 TensorFlow 2 識別圖像
- 七、TensorFlow 2 和神經風格遷移
- 八、TensorFlow 2 和循環神經網絡
- 九、TensorFlow 估計器和 TensorFlow HUB
- 十、從 tf1.12 轉換為 tf2
- TensorFlow 入門
- 零、前言
- 一、TensorFlow 基本概念
- 二、TensorFlow 數學運算
- 三、機器學習入門
- 四、神經網絡簡介
- 五、深度學習
- 六、TensorFlow GPU 編程和服務
- TensorFlow 卷積神經網絡實用指南
- 零、前言
- 一、TensorFlow 的設置和介紹
- 二、深度學習和卷積神經網絡
- 三、TensorFlow 中的圖像分類
- 四、目標檢測與分割
- 五、VGG,Inception,ResNet 和 MobileNets
- 六、自編碼器,變分自編碼器和生成對抗網絡
- 七、遷移學習
- 八、機器學習最佳實踐和故障排除
- 九、大規模訓練
- 十、參考文獻