當(dāng) Tensorflow 遇見 Android

深度學(xué)習(xí)的模型有很多,但是考慮到移動(dòng)端的硬件限制,并不是所有模型都適合移植,在這里整理一下適合移植的模型。

圖片


“凍結(jié)”計(jì)算圖

train.py 將計(jì)算圖定義保存在了 .pb 文件當(dāng)中。遺憾的是,大家無法直接將該計(jì)算圖加載至應(yīng)用當(dāng)中。完整的計(jì)算圖中包含的操作目前還不受TensorFlow C++/Java API的支持。正因?yàn)槿绱?,我們才需要使用上圖中的工具。其中 freeze_graph 負(fù)責(zé)獲取 .pb 以及包含有 w 與 b 訓(xùn)練結(jié)果值的 checkpoint 文件。其還會(huì)移除一切在移動(dòng)端之上不受支持的操作。

在 tensorflow 目錄下運(yùn)行該工具:

bazel-bin/tensorflow/python/tools/freeze_graph \ 
--input_graph=/tmp/voice/graph.pb --input_checkpoint=/tmp/voice/model \
--output_node_names=model/y_pred,inference/inference --input_binary \
--output_graph=/tmp/voice/frozen.pb 

以上命令將在 frozen.pb 當(dāng)中創(chuàng)建一套經(jīng)過簡化的計(jì)算圖,其僅具備 y_pred 與 inference 兩個(gè)節(jié)點(diǎn),不包含任何用于訓(xùn)練的計(jì)算圖節(jié)點(diǎn)。

使用 freeze_graph 的好處在于,其還將固定該文件中的權(quán)重值,這樣大家就無需分別進(jìn)行權(quán)重值加載了:frozen.pb中已經(jīng)包含我們需要的一切。而 optimize 工具則負(fù)責(zé)對計(jì)算圖進(jìn)行進(jìn)一步簡化。其將作為 grozen.pb 文件的輸入內(nèi)容,并寫入 inference.pb 作為輸出結(jié)果。我們隨后會(huì)將此文件嵌入至應(yīng)用當(dāng)中。使用以下命令運(yùn)行該工具:

bazel-bin/tensorflow/python/tools/optimize_for_inference \ 
--input=/tmp/voice/frozen.pb --output=/tmp/voice/inference.pb \
--input_names=inputs/x --output_names=model/y_pred,inference/inference \
--frozen_graph=True

實(shí)現(xiàn)過程

  • 了解模型結(jié)構(gòu)(LeNet、AlexNet、VGG、Incetption V3...)
  • 在 pc 端做 遷移學(xué)習(xí) (深度學(xué)習(xí)訓(xùn)練需要數(shù)周時(shí)間、遷移學(xué)習(xí)只需幾小時(shí)),保存為 pb 模型

    注:遷移學(xué)習(xí)是利用已有模型,在最后一層進(jìn)行重新分類訓(xùn)練
  • 在 pc 端進(jìn)行簡單的模型準(zhǔn)確度驗(yàn)證
  • 對 pb 模型進(jìn)行優(yōu)化、壓縮移植到移動(dòng)端(可以使模型大小減小75%,精度僅略微下降)
  • 在移動(dòng)端恢復(fù)模型
  • 模型產(chǎn)品化

在移動(dòng)端要做的事情不多,一般來說,只需完成以下工作:

  • 從.pb文件中加載計(jì)算圖與權(quán)重值
  • 利用此計(jì)算圖創(chuàng)建一項(xiàng)會(huì)話
  • 將您的數(shù)據(jù)放置在一個(gè)輸入張量內(nèi)
  • 在一個(gè)或者多個(gè)節(jié)點(diǎn)上運(yùn)行計(jì)算圖
  • 從輸出結(jié)果張量中獲取結(jié)果z

demo: 實(shí)時(shí)識別出是哪一種公仔(coin 存錢罐、羊年公仔、猴年公仔)

聲音

訓(xùn)練集 由3,168個(gè)聲音樣本組成,并區(qū)分為男聲和女聲。通過分析聲音的20種聲學(xué)特性,可以達(dá)到99%的準(zhǔn)確度。
可以看一下基于這個(gè)訓(xùn)練集的 web 應(yīng)用: What is Your Voice Gender?
識別效果圖:



下載該數(shù)據(jù)集并打開 voice.csv 文件之后,大家會(huì)看到其中包含著一排排數(shù)字:

這里列出的并非實(shí)際音頻數(shù)據(jù),這些數(shù)字代表著語音記錄當(dāng)中的不同聲學(xué)特征。這些屬性或者特征由一套腳本自音頻記錄中提取得出,并被轉(zhuǎn)化為這個(gè) CSV 文件。具體提取方式可點(diǎn)擊此處查閱 R 源代碼。

每一項(xiàng)示例中存在20項(xiàng)聲學(xué)特征,例如:

  • 以kHz為單位的平均頻率
  • 頻率的標(biāo)準(zhǔn)差
  • 頻譜平坦度
  • 頻譜熵
  • 峰度
  • 聲學(xué)信號中測得的最大基頻
  • 調(diào)制指數(shù)
  • 等等……

在以下示意圖當(dāng)中,大家可以看到這20個(gè)數(shù)字全部接入一個(gè)名為 sum 的小框。這些連接擁有不同的 weights(權(quán)重),對于分類器而言代表著這20個(gè)數(shù)字各自不同的重要程度。

sum = x[0]*w[0] + x[1]*w[1] + x[2]*w[2] + ... + x[19]*w[19] + b

數(shù)組 w 中的權(quán)重與值 b 代表著此分類器所學(xué)習(xí)到的經(jīng)驗(yàn)。對該分類器進(jìn)行訓(xùn)練的過程,實(shí)際上是為了幫助其找到與 w 及 b 正確匹配的數(shù)字。最初,我們將首先將全部 w 與 b 設(shè)置為0。在數(shù)輪訓(xùn)練之后,w 與 b 則將包含一組數(shù)字,分類器將利用這些數(shù)字將輸入語音中的男聲與女聲區(qū)分開來。為了能夠?qū)?sum 轉(zhuǎn)化為一條概率值——其取值在0與1之間——我們在這里使用 sigmoid 函數(shù):

 y_pred = 1 / (1 + exp(-sum))   

如果 sum 是一個(gè)較大正數(shù),則 sigmoid 函數(shù)返回1或者概率為100%; 如果 sum 是一個(gè)較大負(fù)數(shù),則 sigmoid 函數(shù)返回0。因此對于較大的正或者負(fù)數(shù),我們即可得出較為肯定的“是”或者“否”預(yù)測結(jié)論。
現(xiàn)在 y_pred 中包含的預(yù)測結(jié)果顯示,該語音為男聲的可能性更高。如果其概率高于0.5,則我們認(rèn)為語音為男聲; 相反則為女聲。

決策樹:

移植到安卓端:


floatValues 數(shù)組:這里面保存的是20種聲音聲學(xué)特性

如果大家希望在一款應(yīng)用程序當(dāng)中使用此分類器,通過錄音或者來自麥克風(fēng)的音頻信息檢測語音性別,則首先需要從此類音頻數(shù)據(jù)中提取聲學(xué)特征。在擁有了這20個(gè)數(shù)字之后,大家即可對其分類器加以訓(xùn)練,并利用其判斷語音內(nèi)容為男聲還是女聲。
更多參考資料:
http://www.primaryobjects.com/2016/06/22/identifying-the-gender-of-a-voice-using-machine-learning
https://github.com/primaryobjects/voice-gender
http://www.infoq.com/cn/articles/getting-started-with-tensorflow-on-ios

char-rnn

char-rnn 是一個(gè)字符水平的語言模型,通過訓(xùn)練文本文件可以預(yù)測序列中下一個(gè)出現(xiàn)的字符,并以此來生成完整的文本。

應(yīng)用場景

  • 寫武俠小說
  • 訓(xùn)練汪峰歌詞可以得到汪峰風(fēng)格的歌詞

我在這里中的夜里
就像一場是一種生命的意旪
就像我的生活變得在我一樣
可我們這是一個(gè)知道
我只是一天你會(huì)怎嗎

可我們這是我們的是不要為你

我們想這有一種生活的時(shí)候

我在哭泣
我不能及你的時(shí)光
我是我們在這是一種無法少得可以沒有一天
我們想這樣
我們遠(yuǎn)在一場我在我一個(gè)相多地在此向
可我是個(gè)想已經(jīng)把我的時(shí)候
我看到在心悄一種痛定的時(shí)候

我看著我的感覺在飛歌
我不能在這多在心中
就像在我一瞬間
我的生命中的感覺
我在我一次到孤獨(dú)所
我們在這是一看可以是一場我們在這樣
我在這里失命
我不能在這感覺在天里
夜里
夜里
沒有一天 我想心的是不嗎到了

  • 寫古詩

優(yōu)勢:對于大多數(shù)用戶來說,不在乎詩的平仄、韻律,而在于其中的意境(用戶鐘愛情詩和藏頭詩)

目前在云 GPU 上完成模型的訓(xùn)練,并在 pc 上實(shí)現(xiàn)自動(dòng)寫詩功能

奇了了不為
點(diǎn)石上風(fēng)煙
你憑欄干將
好事系在邊

參考文章:
http://www.infoq.com/cn/articles/getting-started-with-tensorflow-on-ios
https://www.zhihu.com/question/21329754
https://github.com/primaryobjects/voice-gender
深度學(xué)習(xí)1--淺談char-rnn三種模型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容