自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何用TensorFlow在安卓設(shè)備上實(shí)現(xiàn)深度學(xué)習(xí)推斷

人工智能 深度學(xué)習(xí)
在 Insight 任職期間,我用 TensorFlow 在安卓上部署了一個(gè)預(yù)訓(xùn)練的 WaveNet 模型。我的目標(biāo)是探索將深度學(xué)習(xí)模型部署到設(shè)備上并使之工作的工程挑戰(zhàn)!這篇文章簡(jiǎn)要介紹了如何用 TensorFlow 在安卓上構(gòu)建一個(gè)通用的語音到文本識(shí)別應(yīng)用程序。

[[211369]]

對(duì)于個(gè)人和公司來說,存在許多狀況是更希望在本地設(shè)備上做深度學(xué)習(xí)推斷的:想象一下當(dāng)你在旅行途中沒有可靠的互聯(lián)網(wǎng)鏈接時(shí),或是要處理傳輸數(shù)據(jù)到云服務(wù)的隱私問題和延遲問題時(shí)。邊緣計(jì)算(Edge computing)是一種在物理上靠近數(shù)據(jù)生成的位置從而對(duì)數(shù)據(jù)進(jìn)行處理和分析的方法,為解決這些問題提供了方案。

以「Ok Google」這個(gè)功能為例:用一名用戶的聲音來訓(xùn)練「Ok Google」,他的手機(jī)在接收到這個(gè)關(guān)鍵詞的時(shí)候就會(huì)被喚醒。這種小型關(guān)鍵詞檢測(cè)(small-footprint keyword-spotting,KWS)推斷通常在本地設(shè)備上運(yùn)行,所以你不必?fù)?dān)心服務(wù)提供商隨時(shí)監(jiān)聽你的聲音。而云服務(wù)只在你發(fā)出指令后才啟動(dòng)。類似的概念可以擴(kuò)展到智能家用電器或其他物聯(lián)網(wǎng)設(shè)備上的應(yīng)用,在這些應(yīng)用中我們需要不依靠互聯(lián)網(wǎng)進(jìn)行免提語音控制。

更重要的是,邊緣計(jì)算不僅為物聯(lián)網(wǎng)世界帶來了人工智能,還提供了許多其他的可能性和好處。例如,我們可以在本地設(shè)備上將圖像或語音數(shù)據(jù)預(yù)處理為壓縮表示,然后將其發(fā)送到云。這種方法解決了隱私和延遲問題。

在 Insight 任職期間,我用 TensorFlow 在安卓上部署了一個(gè)預(yù)訓(xùn)練的 WaveNet 模型。我的目標(biāo)是探索將深度學(xué)習(xí)模型部署到設(shè)備上并使之工作的工程挑戰(zhàn)!這篇文章簡(jiǎn)要介紹了如何用 TensorFlow 在安卓上構(gòu)建一個(gè)通用的語音到文本識(shí)別應(yīng)用程序。

 

圖 1. 流程概述。將 WaveNet 安裝到安卓的三個(gè)步驟。

 

開發(fā)環(huán)境信息:

  • Pixel, cpu type: ARM64
  • Android 7.1.1
  • Android NDK 15.2
  • Android gradle plugin 2.3.0
  • TensorFlow 1.3.0
  • bazel 0.5.4-homebrew

詳細(xì)教程和實(shí)現(xiàn):https://github.com/chiachunfu/speech

***步:模型壓縮

為了將深度學(xué)習(xí)模型部署到移動(dòng)/嵌入式設(shè)備上,我們應(yīng)該致力于減少模型的內(nèi)存占用,縮短推斷時(shí)間,減少耗電。有幾種方法可以實(shí)現(xiàn)這些要求,如量化、權(quán)重剪枝或?qū)⒋竽P吞釤挸尚∧P汀?/p>

在這個(gè)項(xiàng)目中,我使用了 TensorFlow 中的量化工具來進(jìn)行模型壓縮。目前我只使用權(quán)重量化來減小模型大小,因?yàn)楦鶕?jù) Mac 上的測(cè)試結(jié)果,完整 8 位轉(zhuǎn)換沒有提供額外的好處,比如縮短推斷時(shí)間。(由于 requant_range 中的錯(cuò)誤,無法在 Pixel 上運(yùn)行完整的 8 位模型)。由于 8 位量化工具不適合 CPU,時(shí)間甚至翻了一倍。如果你有興趣了解更多關(guān)于量化的實(shí)用建議,可以閱讀 Pete Warden 這篇很棒的文章(https://petewarden.com/2017/06/22/what-ive-learned-about-neural-network-quantization/)。

對(duì)模型進(jìn)行權(quán)重量化:

  1. 將模型寫入?yún)f(xié)議緩沖區(qū)文件。
  2. 從源安裝和配置 TensorFlow(https://www.tensorflow.org/install/install_sources)。
  3. 在 TensorFlow 目錄下運(yùn)行下列命令行:

 

  1. bazel build tensorflow/tools/graph_transforms:transform_graph 
  2. bazel-bin/tensorflow/tools/graph_transforms/transform_graph \ 
  3.   --in_graph=/your/.pb/file \ 
  4.   --outputs="output_node_name" \ 
  5.   --out_graph=/the/quantized/.pb/file \ 
  6.   --transforms='quantize_weights' 

以我的項(xiàng)目為例,在量化權(quán)重后,預(yù)訓(xùn)練的 WaveNet 模型的大小從 15.5Mb 下降到了 4.0Mb?,F(xiàn)在可以將這個(gè)模型文件移動(dòng)到安卓項(xiàng)目中的「assets」文件夾。

第二步:適用于安卓的 TensorFlow 庫

要用 TensorFlow 構(gòu)建安卓應(yīng)用程序,我推薦從 TensorFlow Android Demo開始。在我的項(xiàng)目中,我把 TF speech example 作為模板。這個(gè)示例中的 gradle 文件幫助我們構(gòu)建和編譯安卓的 TF 庫。但是,這個(gè)預(yù)構(gòu)建的 TF 庫可能不包括模型所有必要的 ops。我們需要想清楚 WaveNet 中需要的全部 ops,并將它們編譯成適合安卓 apk 的.so 文件。為了找到 ops 的完整列表,我首先使用 tf.train.write_graph 輸出圖的詳細(xì)信息。然后在終端中運(yùn)行下列命令:

  1. grep "op: " PATH/TO/mygraph.txt | sort | uniq | sed -E 's/^.+"(.+)".?$/\1/g' 

接著,編輯/tensorflow/tensorflow/core/kernels/里的 BUILD 文件,在 Android libraries section 中的「android_extended_ops_group1」或「android_extended_ops_group2」里添加缺失的 ops。我們也可以刪除不必要的 ops,使 .so 文件變得更小。現(xiàn)在,運(yùn)行下列命令:

  1. bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \ 
  2. --crosstool_top=//external:android/crosstool \ 
  3. --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \ 
  4. --cpu=armeabi-v7a 

你將在這里找到 libtensorflow_inference.so 文件:

  1. bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so 

除了 .so 文件之外,我們還需要一個(gè) JAR 文件。運(yùn)行:

  1. bazel build  
  2.  
  3. //tensorflow/contrib/android:android_tensorflow_inference_java 

你將在這里找到該文件:

  1. bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar 

現(xiàn)在,可以將 .so 和 .jar 文件一起移到你的安卓項(xiàng)目中的「libs」文件夾。

第三步:在安卓上的數(shù)據(jù)預(yù)處理

***,讓我們將輸入數(shù)據(jù)處理成模型訓(xùn)練所需格式。對(duì)于音頻系統(tǒng)來說,原始的語音波被轉(zhuǎn)換成梅爾頻率倒譜系數(shù)(MFCC)來模擬人耳感知聲音的方式。TensorFlow 有一個(gè)音頻 op,可以執(zhí)行該特征提取。然而,事實(shí)證明,實(shí)現(xiàn)這種轉(zhuǎn)換存在一些變體。如圖 2 所示,來自 TensorFlow audio op 的 MFCC 不同于 librosa 提供的 MFCC。librosa 是一個(gè)被預(yù)訓(xùn)練的 WaveNet 作者們用來轉(zhuǎn)換訓(xùn)練數(shù)據(jù)的 Python 庫。

 

圖 2. 來自 librosa 和 TensorFlow audio ops 的 MFCC 處在不同的刻度范圍。

如果您正在訓(xùn)練自己的模型或重訓(xùn)練一個(gè)預(yù)先訓(xùn)練好的模型,那么在處理訓(xùn)練數(shù)據(jù)時(shí),一定要考慮設(shè)備上的數(shù)據(jù)通道。最終,我在 Java 中重寫了 librosa MFCC 來處理轉(zhuǎn)換問題。

結(jié)果

圖 3 展示了 app 的截圖和示例。由于模型中沒有語言模型,而且識(shí)別僅在字符級(jí),因此句子中出現(xiàn)了一些拼寫錯(cuò)誤。雖然沒有經(jīng)過嚴(yán)格的測(cè)試,但在量化之后,我確實(shí)發(fā)現(xiàn)準(zhǔn)確率略有下降,以及整個(gè)系統(tǒng)對(duì)周圍的噪聲很敏感。

 

圖 3. App 中兩個(gè)示例的截圖。

下表所示推斷時(shí)間是對(duì) 5 秒音頻的 10 次測(cè)試的平均值。推斷時(shí)間在兩個(gè)平臺(tái)上都略有增加,而不是減少,因?yàn)闄?quán)重量化有助于縮小文件大小,但不太能優(yōu)化推斷時(shí)間或耗電情況。

 

表 1. 權(quán)重量化前后的推斷時(shí)間。測(cè)試環(huán)境是我的 Pixel 手機(jī)和 Macbook air。

接下來做些什么?

有兩件重要的事情可以讓這個(gè)項(xiàng)目更進(jìn)一步,也可以為社區(qū)提供額外的教程和演練,以便在邊緣設(shè)備上部署一個(gè)現(xiàn)實(shí)語音識(shí)別系統(tǒng)。

  •     提高語音識(shí)別性能:添加拼寫校正的語言模型和噪聲下采樣模型,以降低周圍噪聲的影響。
  •     改善推斷時(shí)間和耗電情況:用 NEON 或其他架構(gòu)進(jìn)行低層次優(yōu)化,用 gemmlowp 進(jìn)行低精度矩陣計(jì)算。 
責(zé)任編輯:龐桂玉 來源: 36大數(shù)據(jù)
相關(guān)推薦

2017-12-07 11:00:06

深度學(xué)習(xí)CNN物聯(lián)網(wǎng)設(shè)備

2016-12-23 09:09:54

TensorFlowKubernetes框架

2017-05-12 16:25:44

深度學(xué)習(xí)圖像補(bǔ)全tensorflow

2017-11-16 17:26:35

深度學(xué)習(xí)移動(dòng)設(shè)備MobileNets應(yīng)

2018-01-03 10:00:39

深度學(xué)習(xí)摳圖消除背景

2017-05-22 13:15:45

TensorFlow深度學(xué)習(xí)

2011-09-07 11:13:29

UbuntuMRTGH3C

2018-08-16 08:19:30

2017-09-21 12:29:58

深度學(xué)習(xí)TensorFlow智能終端

2017-12-06 15:46:31

深度學(xué)習(xí)結(jié)構(gòu)化數(shù)據(jù)NLP

2014-06-04 13:19:29

C++ndk安卓開發(fā)

2016-12-21 16:40:22

TensorFlow深度學(xué)習(xí)算法大數(shù)據(jù)

2011-12-07 11:57:12

ibmdw

2016-12-06 08:51:48

深度學(xué)習(xí)TensorFlow機(jī)器學(xué)習(xí)

2020-05-28 07:15:00

機(jī)器學(xué)習(xí)TensorFlow人工智能

2018-03-20 15:33:05

深度學(xué)習(xí)加密貨幣

2017-05-17 08:24:08

TensorFlow機(jī)器學(xué)習(xí)線性回歸

2017-08-16 10:57:52

深度學(xué)習(xí)TensorFlowNLP

2017-12-01 15:24:04

TensorFlow深度學(xué)習(xí)教程

2022-11-30 09:39:44

KubeadmDebian 11Kubernetes
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)