深度學(xué)習(xí)的模型有很多币旧,但是考慮到移動端的硬件限制排拷,并不是所有模型都適合移植,在這里整理一下適合移植的模型咒劲。
圖片
“凍結(jié)”計(jì)算圖
train.py 將計(jì)算圖定義保存在了 .pb 文件當(dāng)中会放。遺憾的是饲齐,大家無法直接將該計(jì)算圖加載至應(yīng)用當(dāng)中。完整的計(jì)算圖中包含的操作目前還不受TensorFlow C++/Java API的支持鸦概。正因?yàn)槿绱寺嵴牛覀儾判枰褂蒙蠄D中的工具。其中 freeze_graph 負(fù)責(zé)獲取 .pb 以及包含有 w 與 b 訓(xùn)練結(jié)果值的 checkpoint 文件窗市。其還會移除一切在移動端之上不受支持的操作先慷。
在 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 兩個節(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é)果祝谚。我們隨后會將此文件嵌入至應(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)化、壓縮移植到移動端(可以使模型大小減小75%只锻,精度僅略微下降)
- 在移動端恢復(fù)模型
- 模型產(chǎn)品化
在移動端要做的事情不多玖像,一般來說,只需完成以下工作:
- 從.pb文件中加載計(jì)算圖與權(quán)重值
- 利用此計(jì)算圖創(chuàng)建一項(xiàng)會話
- 將您的數(shù)據(jù)放置在一個輸入張量內(nèi)
- 在一個或者多個節(jié)點(diǎn)上運(yùn)行計(jì)算圖
- 從輸出結(jié)果張量中獲取結(jié)果z
demo: 實(shí)時(shí)識別出是哪一種公仔(coin 存錢罐齐饮、羊年公仔捐寥、猴年公仔)
聲音
訓(xùn)練集 由3,168個聲音樣本組成,并區(qū)分為男聲和女聲祖驱。通過分析聲音的20種聲學(xué)特性上真,可以達(dá)到99%的準(zhǔn)確度。
可以看一下基于這個訓(xùn)練集的 web 應(yīng)用: What is Your Voice Gender?
識別效果圖:
下載該數(shù)據(jù)集并打開 voice.csv 文件之后羹膳,大家會看到其中包含著一排排數(shù)字:
這里列出的并非實(shí)際音頻數(shù)據(jù),這些數(shù)字代表著語音記錄當(dāng)中的不同聲學(xué)特征根竿。這些屬性或者特征由一套腳本自音頻記錄中提取得出陵像,并被轉(zhuǎn)化為這個 CSV 文件。具體提取方式可點(diǎn)擊此處查閱 R 源代碼寇壳。
每一項(xiàng)示例中存在20項(xiàng)聲學(xué)特征醒颖,例如:
- 以kHz為單位的平均頻率
- 頻率的標(biāo)準(zhǔn)差
- 頻譜平坦度
- 頻譜熵
- 峰度
- 聲學(xué)信號中測得的最大基頻
- 調(diào)制指數(shù)
- 等等……
在以下示意圖當(dāng)中,大家可以看到這20個數(shù)字全部接入一個名為 sum 的小框壳炎。這些連接擁有不同的 weights(權(quán)重)泞歉,對于分類器而言代表著這20個數(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 是一個較大正數(shù),則 sigmoid 函數(shù)返回1或者概率為100%; 如果 sum 是一個較大負(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個數(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 是一個字符水平的語言模型晌缘,通過訓(xùn)練文本文件可以預(yù)測序列中下一個出現(xiàn)的字符,并以此來生成完整的文本痢站。
應(yīng)用場景
- 寫武俠小說
- 訓(xùn)練汪峰歌詞可以得到汪峰風(fēng)格的歌詞
我在這里中的夜里
就像一場是一種生命的意旪
就像我的生活變得在我一樣
可我們這是一個知道
我只是一天你會怎嗎
可我們這是我們的是不要為你
我們想這有一種生活的時(shí)候
我在哭泣
我不能及你的時(shí)光
我是我們在這是一種無法少得可以沒有一天
我們想這樣
我們遠(yuǎn)在一場我在我一個相多地在此向
可我是個想已經(jīng)把我的時(shí)候
我看到在心悄一種痛定的時(shí)候
我看著我的感覺在飛歌
我不能在這多在心中
就像在我一瞬間
我的生命中的感覺
我在我一次到孤獨(dú)所
我們在這是一看可以是一場我們在這樣
我在這里失命
我不能在這感覺在天里
夜里
夜里
沒有一天 我想心的是不嗎到了
- 寫古詩
優(yōu)勢:對于大多數(shù)用戶來說磷箕,不在乎詩的平仄、韻律阵难,而在于其中的意境(用戶鐘愛情詩和藏頭詩)
目前在云 GPU 上完成模型的訓(xùn)練岳枷,并在 pc 上實(shí)現(xiàn)自動寫詩功能
奇了了不為
點(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三種模型