Android 與tensorflow的基礎(chǔ)教程

Environment

  • TensorFlow: 1.2.0
  • Python: 3.6
  • Python IDE: PyCharm 2017.2
  • Android IDE: Android Studio 3.0

Train & Evaluate(Python+TensorFlow)

訓(xùn)練和評(píng)估部分主要目的是生成用于測(cè)試用的pb文件哗蜈,其保存了利用TensorFlow python API構(gòu)建訓(xùn)練后的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和參數(shù)信息,實(shí)現(xiàn)方式有很多種稠屠,除了cnn外還可以使用rnn逆皮,fcnn等憔鬼。
其中基于cnn的函數(shù)也有兩套,分別為tf.layers.conv2d和tf.nn.conv2d, tf.layers.conv2d使用tf.nn.conv2d作為后端處理胯舷,參數(shù)上filters是整數(shù)完慧,filter是4維張量谋旦。原型如下:
convolutional.py文件

def conv2d(inputs, filters, kernel_size, strides=(1, 1), padding='valid', data_format='channels_last',
   dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer=None,
   bias_initializer=init_ops.zeros_initializer(), kernel_regularizer=None, bias_regularizer=None,
   activity_regularizer=None, kernel_constraint=None, bias_constraint=None, trainable=True, name=None,
   reuse=None)     

gen_nn_ops.py 文件

def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format="NHWC", name=None)

官方Demo實(shí)例中使用的是layers module,結(jié)構(gòu)如下:

  • Convolutional Layer #1:32個(gè)5×5的filter,使用ReLU激活函數(shù)
  • Pooling Layer #1:2×2的filter做max pooling蛤织,步長為2
  • Convolutional Layer #2:64個(gè)5×5的filter赴叹,使用ReLU激活函數(shù)
  • Pooling Layer #2:2×2的filter做max pooling,步長為2
  • Dense Layer #1:1024個(gè)神經(jīng)元指蚜,使用ReLU激活函數(shù)乞巧,dropout率0.4 (為了避免過擬合,在訓(xùn)練的時(shí)候摊鸡,40%的神經(jīng)元會(huì)被隨機(jī)去掉)
  • Dense Layer #2 (Logits Layer):10個(gè)神經(jīng)元绽媒,每個(gè)神經(jīng)元對(duì)應(yīng)一個(gè)類別(0-9)

核心代碼在cnn_model_fn(features, labels, mode)函數(shù)中,完成卷積結(jié)構(gòu)的完整定義免猾,核心代碼如下.

image.png

也可以采用傳統(tǒng)的tf.nn.conv2d函數(shù), 核心代碼如下是辕。

image.png

Test(Android+TensorFlow)

  • 核心是使用API??接口: TensorFlowInferenceInterface.java

  • 配置gradle或者自編譯TensorFlow源碼導(dǎo)入jar和so
    compile 'org.tensorflow:tensorflow-android:1.2.0'

  • 導(dǎo)入pb文件.pb文件放assets目錄,然后讀取

    String actualFilename = labelFilename.split(“file:///android_asset/“)[1];
    Log.i(TAG, “Reading labels from: “ + actualFilename);
    BufferedReader br = null;
    br = new BufferedReader(new InputStreamReader( assetManager.open(actualFilename)));
    String line;
    while ((line = br.readLine()) != null) {
    c.labels.add(line);
    }
    br.close();

  • TensorFlow接口使用

image.png

最終效果:


image.png
image.png

Theory

MNIST

MNIST猎提,最經(jīng)典的機(jī)器學(xué)習(xí)模型之一获三,包含0~9的數(shù)字,28*28大小的單色灰度手寫數(shù)字圖片數(shù)據(jù)庫锨苏,其中共60,000 training examples和10,000 test examples疙教。
文件目錄如下,主要包括4個(gè)二進(jìn)制文件伞租,分別為訓(xùn)練和測(cè)試圖片及Label贞谓。如下為訓(xùn)練圖片的二進(jìn)制結(jié)構(gòu),在真實(shí)數(shù)據(jù)前(pixel)葵诈,有部分描述字段(魔數(shù)裸弦,圖片個(gè)數(shù),圖片行數(shù)和列數(shù))作喘,真實(shí)數(shù)據(jù)的存儲(chǔ)采用大端規(guī)則理疙。(大端規(guī)則,就是數(shù)據(jù)的高字節(jié)保存在低內(nèi)存地址中徊都,低字節(jié)保存在高內(nèi)存地址中)在具體實(shí)驗(yàn)使用沪斟,需要提取真實(shí)數(shù)據(jù),可采用專門用于處理字節(jié)的庫struct中的unpack_from方法暇矫,核心方法如下: struct.unpack_from(self._fourBytes2, buf, index)

image.png

MNIST作為AI的Hello World入門實(shí)例數(shù)據(jù)主之,TensorFlow封裝對(duì)其封裝好了函數(shù),可直接使用
mnist = input_data.read_data_sets('MNIST', one_hot=True)

CNN(Convolutional Neural Network)

CNN Keys

  • CNN李根,Convolutional Neural Network槽奕,中文全稱卷積神經(jīng)網(wǎng)絡(luò),即所謂的卷積網(wǎng)(ConvNets)房轿。
  • 卷積(Convolution)可謂是現(xiàn)代深度學(xué)習(xí)中最最重要的概念了粤攒,它是一種數(shù)學(xué)運(yùn)算所森,讀者可以從下面鏈接[23]中卷積相關(guān)數(shù)學(xué)機(jī)理,包括分別從傅里葉變換和狄拉克δ函數(shù)中推到卷積定義夯接,我們可以從字面上宏觀粗魯?shù)睦斫獬蓪⒁蜃臃D(zhuǎn)相乘卷起來焕济。
  • 卷積動(dòng)畫。演示如下圖[26]盔几,更多動(dòng)畫演示可參考[27]
image.png

神經(jīng)網(wǎng)絡(luò)晴弃。一個(gè)由大量神經(jīng)元(neurons)組成的系統(tǒng),如下圖所示[21] 其中x表示輸入向量逊拍,w為權(quán)重上鞠,b為偏值bias,f為激活函數(shù)芯丧。

image.png

Activation Function 激活函數(shù): 常用的非線性激活函數(shù)有Sigmoid芍阎、tanh、ReLU等等缨恒,公式如下如所示谴咸。

Sigmoid缺點(diǎn)
函數(shù)飽和使梯度消失(神經(jīng)元在值為0 或1 的時(shí)候接近飽和,這些區(qū)域肿轨,梯度幾乎為0)
sigmoid 函數(shù)不是關(guān)于原點(diǎn)中心對(duì)稱的(無0中心化)
tanh: 存在飽和問題寿冕,但它的輸出是零中心的蕊程,因此實(shí)際中tanh 比sigmoid 更受歡迎椒袍。
ReLU
優(yōu)點(diǎn)1:ReLU 對(duì)于SGD 的收斂有巨大的加速作用
優(yōu)點(diǎn)2:只需要一個(gè)閾值就可以得到激活值,而不用去算一大堆復(fù)雜的(指數(shù))運(yùn)算
缺點(diǎn):需要合理設(shè)置學(xué)習(xí)率(learning rate)藻茂,防止訓(xùn)練時(shí)dead驹暑,還可以使用Leaky ReLU/PReLU/Maxout等代替


image.png

感謝本文博主SkySeraph,官方鏈接 http://skyseraph.com/2018/01/10/AI/AIHandwritingAndroid/

Pooling池化辨赐。一般分為平均池化mean pooling和最大池化max pooling优俘,如下圖所示[21]為max pooling,除此之外掀序,還有重疊池化(OverlappingPooling)[24]帆焕,空金字塔池化(Spatial Pyramid Pooling)[25]
平均池化:計(jì)算圖像區(qū)域的平均值作為該區(qū)域池化后的值。
最大池化:選圖像區(qū)域的最大值作為該區(qū)域池化后的值不恭。


image.png
image.png

CNN Architecture
三層神經(jīng)網(wǎng)絡(luò)叶雹。分別為輸入層(Input layer),輸出層(Output layer),隱藏層(Hidden layer),如下圖所示[21]


image.png

CNN層級(jí)結(jié)構(gòu)换吧。斯坦福cs231n中闡述了一種[INPUT-CONV-RELU-POOL-FC]折晦,如下圖所示[21],分別為輸入層沾瓦,卷積層满着,激勵(lì)層谦炒,池化層,全連接層风喇。
CNN通用架構(gòu)分為如下三層結(jié)構(gòu):
Convolutional layers 卷積層
Pooling layers 匯聚層
Dense (fully connected) layers 全連接層


image.png

動(dòng)畫演示宁改。參考[22]。


image.png

Regression + Softmax

機(jī)器學(xué)習(xí)有監(jiān)督學(xué)習(xí)(supervised learning)中兩大算法分別是分類算法和回歸算法魂莫,分類算法用于離散型分布預(yù)測(cè)透且,回歸算法用于連續(xù)型分布預(yù)測(cè)。
回歸的目的就是建立一個(gè)回歸方程用來預(yù)測(cè)目標(biāo)值豁鲤,回歸的求解就是求這個(gè)回歸方程的回歸系數(shù)秽誊。
其中回歸(Regression)算法包括Linear Regression,Logistic Regression等琳骡, Softmax Regression是其中一種用于解決多分類(multi-class classification)問題的Logistic回歸算法的推廣锅论,經(jīng)典實(shí)例就是在MNIST手寫數(shù)字分類上的應(yīng)用。

Linear Regression

Linear Regression是機(jī)器學(xué)習(xí)中最基礎(chǔ)的模型楣号,其目標(biāo)是用預(yù)測(cè)結(jié)果盡可能地?cái)M合目標(biāo)label

  • 多元線性回歸模型定義


    image.png
  • 多元線性回歸求解


    image.png

    Mean Square Error (MSE)
    Gradient Descent(梯度下降法)
    Normal Equation(普通最小二乘法)
    局部加權(quán)線性回歸(LocallyWeightedLinearRegression, LWLR ):針對(duì)線性回歸中模型欠擬合現(xiàn)象最易,在估計(jì)中引入一些偏差以便降低預(yù)測(cè)的均方誤差。
    嶺回歸(ridge regression)和縮減方法
    選擇: Normal Equation相比Gradient Descent炫狱,計(jì)算量大(需計(jì)算X的轉(zhuǎn)置與逆矩陣)藻懒,只適用于特征個(gè)數(shù)小于100000時(shí)使用;當(dāng)特征數(shù)量大于100000時(shí)使用梯度法视译。當(dāng)X不可逆時(shí)可替代方法為嶺回歸算法嬉荆。LWLR方法增加了計(jì)算量,因?yàn)樗鼘?duì)每個(gè)點(diǎn)做預(yù)測(cè)時(shí)都必須使用整個(gè)數(shù)據(jù)集酷含,而不是計(jì)算出回歸系數(shù)得到回歸方程后代入計(jì)算即可鄙早,一般不選擇。
    調(diào)優(yōu): 平衡預(yù)測(cè)偏差和模型方差(高偏差就是欠擬合椅亚,高方差就是過擬合)
    獲取更多的訓(xùn)練樣本- 解決高方差
    嘗試使用更少的特征的集合- 解決高方差
    嘗試獲得其他特征- 解決高偏差
    嘗試添加多項(xiàng)組合特征- 解決高偏差
    嘗試減小λ - 解決高偏差
    嘗試增加λ -解決高方差

Softmax Regression

Softmax Regression估值函數(shù)(hypothesis)


image.png

Softmax Regression代價(jià)函數(shù)(cost function)


image.png

理解:


image.png

Softmax Regression & Logistic Regression:
多分類& 二分類限番。Logistic Regression為K=2時(shí)的Softmax Regression
針對(duì)K類問題,當(dāng)類別之間互斥時(shí)可采用Softmax Regression呀舔,當(dāng)非斥時(shí)弥虐,可采用K個(gè)獨(dú)立的Logistic Regression
總結(jié): Softmax Regression適用于類別數(shù)量大于2的分類,本例中用于判斷每張圖屬于每個(gè)數(shù)字的概率媚赖。

References & Recommends

MNIST

Softmax

CNN

TensorFlow+CNN / TensorFlow+Android

代碼庫:https://github.com/skyseraph/AI_P2T

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霜瘪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子省古,更是在濱河造成了極大的恐慌粥庄,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豺妓,死亡現(xiàn)場(chǎng)離奇詭異惜互,居然都是意外死亡布讹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門训堆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來描验,“玉大人,你說我怎么就攤上這事坑鱼”炝鳎” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵鲁沥,是天一觀的道長呼股。 經(jīng)常有香客問我,道長画恰,這世上最難降的妖魔是什么彭谁? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮允扇,結(jié)果婚禮上缠局,老公的妹妹穿的比我還像新娘。我一直安慰自己考润,他們只是感情好狭园,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布截亦。 她就那樣靜靜地躺著踏堡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪音诫。 梳的紋絲不亂的頭發(fā)上俊戳,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天揖赴,我揣著相機(jī)與錄音,去河邊找鬼抑胎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛渐北,可吹牛的內(nèi)容都是我干的阿逃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼赃蛛,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼恃锉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呕臂,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤破托,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后歧蒋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體土砂,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡州既,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萝映。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吴叶。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖序臂,靈堂內(nèi)的尸體忽然破棺而出蚌卤,到底是詐尸還是另有隱情,我是刑警寧澤奥秆,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布逊彭,位于F島的核電站,受9級(jí)特大地震影響构订,放射性物質(zhì)發(fā)生泄漏诫龙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一鲫咽、第九天 我趴在偏房一處隱蔽的房頂上張望签赃。 院中可真熱鬧,春花似錦分尸、人聲如沸锦聊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孔庭。三九已至,卻和暖如春材蛛,著一層夾襖步出監(jiān)牢的瞬間圆到,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工卑吭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芽淡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓豆赏,卻偏偏與公主長得像挣菲,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掷邦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359