大牛教你如何用 TensorFlow 親手搭建一套圖像識(shí)別模塊 | AI 研習(xí)社

這里給出了一個(gè)簡(jiǎn)單的 TensorFlow 的 Hello World 的程序阱洪,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的向量加法的操作。首先 import 了 TensorFlow ,然后定義了 a、b 兩個(gè)向量,包括 name 屬性莲兢,接著把它們加起來(lái)。這里 TensorFlow 采用了這樣的一個(gè)惰性計(jì)算模型续膳,輸出的并不是加法的結(jié)果改艇,而是結(jié)果的一個(gè)引用。另外坟岔,要運(yùn)行整個(gè) result 運(yùn)算谒兄,就必須定義一個(gè) session ,session 會(huì)掌握所有 TensorFlow 的運(yùn)算資源社付,然后通過(guò) session 運(yùn)行相關(guān)操作承疲。

這里只是簡(jiǎn)單介紹了一個(gè) TensorFlow 的簡(jiǎn)單用法邻耕,由于時(shí)間有限,也無(wú)法深入地去詳細(xì)介紹燕鸽。我們關(guān)注的是如何用 TensorFlow 實(shí)現(xiàn)一個(gè)神經(jīng)網(wǎng)絡(luò)的全連接兄世,也就是加權(quán)和,加上激活函數(shù)的模型啊研。

加權(quán)和可以通過(guò)矩陣乘法的方式實(shí)現(xiàn)御滩。如上圖代碼所示,這里通過(guò) placeholder 的方法定義了一個(gè) input 悲伶,其中類(lèi)型是必須的艾恼,其他的諸如 shape 等參數(shù)則可以等使用的時(shí)候再賦值。之后定義了權(quán)重 w 和偏移量 b麸锉,這里是通過(guò) Variable 方法定義的,這樣等最后優(yōu)化的時(shí)候舆声,TensorFlow 會(huì)針對(duì)這些 Variable 展開(kāi)優(yōu)化花沉。最后通過(guò)乘法和加法操作,也就是通過(guò) output = tf.nn.relu(tf.matmul(x, w) + b) 這一行代碼就實(shí)現(xiàn)了神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)媳握。

這里是通過(guò)基礎(chǔ)的 TensorFlow API 實(shí)現(xiàn)的碱屁,如果通過(guò) Keras 等更高層的封裝來(lái)實(shí)現(xiàn)會(huì)更加簡(jiǎn)單。這里我們是從基礎(chǔ)的 API 入手來(lái)進(jìn)行講解蛾找,如果大家對(duì)高層封裝感興趣娩脾,可以自己學(xué)習(xí)。需要指出的是打毛,其實(shí)高層封裝和基礎(chǔ) API 的主要區(qū)別是實(shí)現(xiàn)上的區(qū)別柿赊,他們整體上的過(guò)程是基本一樣的。

下面我們來(lái)看一下如何用 TensorFlow 實(shí)現(xiàn)一個(gè)具體的圖像識(shí)別模塊幻枉,即從 MNIST 數(shù)據(jù)集中識(shí)別手寫(xiě)數(shù)字碰声。(完整代碼見(jiàn)下文鏈接)


可以看到,TensorFlow 通過(guò) read_data_sets 方法對(duì)引用數(shù)據(jù)進(jìn)行了一個(gè)非常好的封裝熬甫,后續(xù)可以通過(guò)非常簡(jiǎn)單的方式讀取這些劃分好的數(shù)據(jù)集胰挑,例如通過(guò) train、validation椿肩、test 等關(guān)鍵詞就可以讀取訓(xùn)練和測(cè)試數(shù)據(jù)集等瞻颂。

如下圖所示,然后是通過(guò) next_batch 來(lái)獲取一小批的訓(xùn)練數(shù)據(jù)郑象。我們剛剛提到贡这,在利用梯度下降算法時(shí)需要在所有的訓(xùn)練數(shù)據(jù)上計(jì)算梯度,但是計(jì)算量太大了扣唱,因此這里通過(guò) next_batch 方法藕坯,相當(dāng)于我們?cè)谒械挠?xùn)練數(shù)據(jù)集中篩選一部分团南,隨機(jī)選取一部分訓(xùn)練數(shù)據(jù)集,提供到神經(jīng)網(wǎng)絡(luò)的輸入層炼彪,然后通過(guò)反向迭代方法去優(yōu)化這個(gè)神經(jīng)網(wǎng)絡(luò)吐根。

這里 xx 設(shè)置等于 100,也就是我們得到了 xs 和 ys 兩個(gè)矩陣辐马,xs 代表輸入數(shù)組拷橘,相當(dāng)于把一個(gè) 28×28 的手寫(xiě)圖像展開(kāi)成一個(gè)長(zhǎng)度為 748 的一維數(shù)組。ys 相當(dāng)于我們的結(jié)果喜爷,也就是 0-9 這 10 種可能值冗疮。

如上圖,完了之后是一個(gè)前向傳播的一個(gè)大致過(guò)程的程序截圖檩帐。這個(gè)過(guò)程就相當(dāng)于是定義一層一層的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)术幔,這里 inference 函數(shù)中的 input_tensor 相當(dāng)于輸入矩陣,后面的 reqularizer 就相當(dāng)于一個(gè)正則化的東西湃密。我們可以看到诅挑,當(dāng)輸入來(lái)了之后,程序開(kāi)始進(jìn)行一層一層的推導(dǎo)泛源,定義一層一層的權(quán)重和偏移量拔妥,算出每一層的結(jié)果,傳入下一層达箍,進(jìn)入下一層的計(jì)算没龙。

其實(shí)通過(guò)這個(gè)前項(xiàng)傳播的定義我們可以看到,無(wú)論是全連接層還是卷積神經(jīng)網(wǎng)絡(luò)缎玫,甚至是循環(huán)神經(jīng)網(wǎng)絡(luò)硬纤,它的大致流程都是一樣的,給定輸入碘梢,然后通過(guò)一層一層的傳遞就可以得到最后的輸出咬摇。

如上圖,下面我們看一下主程序煞躬。其實(shí)主程序就是調(diào)用了 train 的過(guò)程肛鹏,這個(gè) train 的過(guò)程其實(shí)也是比較簡(jiǎn)單的。第一部分是定義輸入恩沛,也就是怎樣來(lái)提供這個(gè)訓(xùn)練數(shù)據(jù)的接口在扰,也就是通過(guò) placeholder 的方式導(dǎo)入,輸入這里是 x 雷客,輸出是 y_ 芒珠。然后通過(guò)調(diào)用 inference 函數(shù)來(lái)進(jìn)行一個(gè)前向傳播的計(jì)算。然后定義了滑動(dòng)平均和損失函數(shù)搅裙。

這里的過(guò)程其實(shí)是就相當(dāng)于是:我通過(guò)輸入一個(gè)訓(xùn)練數(shù)據(jù)集皱卓,然后得到在當(dāng)前數(shù)據(jù)集下的推導(dǎo)結(jié)果裹芝,然后再通過(guò)這個(gè)推導(dǎo)結(jié)果和正確答案對(duì)比,就知道跟正確答案的差別在哪娜汁。下一步可以看到我們定義了 loss 嫂易,它相當(dāng)于評(píng)估當(dāng)前模型好壞的一個(gè)指標(biāo)。這里其實(shí)就相當(dāng)于是評(píng)價(jià) cross_entropy 加上正則化掐禁,這里正則化是為了避免過(guò)耦合的怜械。

完了之后,下一行是通過(guò) GradientDescentOptimizer 函數(shù)優(yōu)化傅事。TensorFlow 提供了大概 5-7 中不同的優(yōu)化函數(shù)可供選擇缕允,它們針對(duì)不同的應(yīng)用場(chǎng)景,各具特點(diǎn)蹭越,大家可以靈活選擇障本。這里我認(rèn)為,對(duì)于那些不搞學(xué)術(shù)研究的同學(xué)般又,其實(shí)沒(méi)有必要去從數(shù)學(xué)的角度推導(dǎo)每一個(gè)優(yōu)化函數(shù)具體是怎么優(yōu)化的彼绷,從應(yīng)用層的角度來(lái)看,大部分用戶只需要提供學(xué)習(xí)率和目標(biāo)函數(shù)茴迁,并且了解這些優(yōu)化函數(shù)的優(yōu)劣就可以了,這個(gè)相對(duì)來(lái)說(shuō)還是比較方便萤衰。

在把所有的這些計(jì)算方式都定義好了之后堕义,下面就是生成 TensorFlow 的計(jì)算圖,以及生成 session脆栋。定義好 session 之后倦卖,下面訓(xùn)練的過(guò)程就比較簡(jiǎn)單了,其實(shí)就是寫(xiě)了一個(gè)循環(huán)椿争,每次選取一小部分訓(xùn)練數(shù)據(jù)怕膛,然后去做訓(xùn)練,隔一段時(shí)間再打印一下訓(xùn)練結(jié)果秦踪,整個(gè)過(guò)程就完成了褐捻。

所以說(shuō)整個(gè)用 Tensorflow 來(lái)實(shí)現(xiàn)一個(gè)神經(jīng)網(wǎng)絡(luò)的過(guò)程,相對(duì)還是比較簡(jiǎn)單的椅邓。需要注意的是柠逞,這里我介紹的只是原生態(tài)的 TensorFlow,如果大家要去使用 TFLearn景馁,或者 Keras 這些高級(jí)封裝去實(shí)現(xiàn) MNIST 問(wèn)題的話板壮,可能會(huì)更加簡(jiǎn)單,大概只需要 2-3 行代碼就可以解決了合住。

這里我們基本上把通過(guò)原生態(tài)的 Tensorflow 生成神經(jīng)網(wǎng)絡(luò)的過(guò)程為大家介紹了一下绰精。其實(shí)后面還有個(gè) evaluate 評(píng)估的部分(代碼如上圖所示)撒璧,因?yàn)闀r(shí)間關(guān)系我就不對(duì)著代碼詳細(xì)講了,感興趣的同學(xué)可以自己下去研究(源碼見(jiàn)下文鏈接)笨使。

下面我再跟大家再介紹一下循環(huán)卷積神經(jīng)網(wǎng)絡(luò)卿樱。

剛剛大家看到的這個(gè)結(jié)構(gòu)是一個(gè)全鏈接的神經(jīng)網(wǎng)絡(luò),在圖像處理的過(guò)程中阱表,使用全連接神經(jīng)網(wǎng)絡(luò)最大的一個(gè)問(wèn)題就是它的參數(shù)太多了殿如,這個(gè)問(wèn)題可能會(huì)導(dǎo)致模型最終訓(xùn)練不好。

例如最爬,經(jīng)常發(fā)生的涉馁,當(dāng)你的訓(xùn)練數(shù)據(jù)不足的時(shí)候,參數(shù)又太多爱致,你就可能訓(xùn)練不出來(lái)烤送。一個(gè)非常簡(jiǎn)單的例子,大家可以想象 N 元的一個(gè)方程組糠悯,然后我們假設(shè)只有 N 個(gè)數(shù)據(jù)帮坚,并且這些數(shù)據(jù)是完全可分的,也就是我們是可以完全求解互艾。但完全求解可能會(huì)導(dǎo)致過(guò)擬合试和,因?yàn)橛?xùn)練數(shù)據(jù)在真實(shí)環(huán)境下都是有噪音的,也就是沒(méi)有辦法做到完全避免隨機(jī)因素的影響纫普。在這種情況下如果你過(guò)于貼合訓(xùn)練數(shù)據(jù)阅悍,那么就有可能沒(méi)有辦法去收斂到未知的數(shù)據(jù)。

所以這就是參數(shù)過(guò)多可能引發(fā)的問(wèn)題昨稼,即過(guò)擬合和訓(xùn)練不出來(lái)节视。那怎樣去解決這兩個(gè)問(wèn)題呢?卷積神經(jīng)網(wǎng)絡(luò)就是一個(gè)很好的方法假栓。

卷積神經(jīng)網(wǎng)絡(luò)就相當(dāng)于是采用一個(gè)內(nèi)核寻行,即一個(gè)規(guī)模較小的矩陣,去處理一個(gè)比較小的區(qū)域匾荆,然后去通過(guò)移動(dòng)這個(gè)小矩陣拌蜘,去處理不同的這個(gè)塊。這種方式一個(gè)直觀的一個(gè)意義就是:一般的圖像上相鄰區(qū)域的內(nèi)容是相似的棋凳。然后通過(guò)這樣的一個(gè)潛在的東西拦坠,就可以去把一個(gè)淺層的表達(dá)變成一個(gè)更深層的表達(dá)。也就是相當(dāng)于自動(dòng)從圖像中去提取特征剩岳。

例如上圖所示贞滨,第一層可能可以從圖像中提取一些線條和斑點(diǎn),第二層提取一些更復(fù)雜的性狀。第三層和第四層晓铆,層數(shù)越多勺良,提取的特征就會(huì)越復(fù)雜。然后通過(guò)最后提取出來(lái)的這樣一些特征骄噪,我們?cè)偃プ鲆粋€(gè)全連接的分類(lèi)尚困,最后這個(gè)分類(lèi)的效果也就會(huì)更好。

然后這里給出了一個(gè)簡(jiǎn)單的 LeNet5 的模型链蕊,我們可以看到他的大致結(jié)構(gòu)就是從輸入層事甜,經(jīng)過(guò)不斷地卷積池化,再經(jīng)過(guò) 1 到 3 層不等的全連接層滔韵,最后得到輸出層逻谦。其實(shí)現(xiàn)在很多的卷積神經(jīng)網(wǎng)絡(luò)基本上也都保留了這樣的一種結(jié)構(gòu)。

除了這種模型之外陪蜻,另一種比較特殊的模型是 Google Inception 模型邦马,這里因?yàn)闀r(shí)間關(guān)系我也不去做過(guò)多的介紹了。

然后我在這里給出了一個(gè)簡(jiǎn)單的用 TensorFlow 的程序來(lái)實(shí)現(xiàn)卷積層宴卖。通過(guò)代碼其實(shí)大家也可以看到滋将,在這個(gè)框架里面,無(wú)論是全連接的神經(jīng)網(wǎng)絡(luò)也好症昏,還是卷積神經(jīng)網(wǎng)絡(luò)也好随闽,甚至循環(huán)神經(jīng)網(wǎng)絡(luò)也好。它們的訓(xùn)練過(guò)程肝谭,以及前面的準(zhǔn)備過(guò)程其實(shí)基本上都是差不多的橱脸,你基本上只要去修改,怎么樣去從輸入得到輸出就可以了分苇。

從代碼也可以看到,開(kāi)始是定義這個(gè)卷積層中的權(quán)重和偏移量屁桑,完了之后 TensorFlow 會(huì)對(duì)這個(gè)卷積層有一個(gè)封裝医寿,然后通過(guò) conv2d 函數(shù)得到一個(gè) 2D 的卷積層,然后再把偏移量蘑斧、激活函數(shù)加上去靖秩。大家可以看到整個(gè)的過(guò)程還是比較簡(jiǎn)單的,同樣的竖瘾,如果用 Keras 等更高級(jí)的封裝來(lái)實(shí)現(xiàn)的化會(huì)更加簡(jiǎn)單沟突。

最后我要推薦一下《TensorFlow:實(shí)戰(zhàn)Google深度學(xué)習(xí)框架》這本書(shū),今天講的內(nèi)容捕传,包括一些略去的內(nèi)容惠拭,基本上全部在這本書(shū)里都有非常詳細(xì)的介紹。

另外,前面提到的代碼地址如下:

https://github.com/caicloud/tensorflow-tutorial

代碼庫(kù)里包含了書(shū)中所有的樣例代碼职辅,此外還包括了才云科技提供的 TensorFlow as a Service (TaaS) 深度學(xué)習(xí)平臺(tái)的一些教程和代碼棒呛,包括后面我們做的一些圖像分類(lèi)和圖像識(shí)別的樣例代碼,后面也都會(huì)陸陸續(xù)續(xù)添加進(jìn)去域携。大家有興趣的化可以關(guān)注一下這個(gè)代碼庫(kù)簇秒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秀鞭,隨后出現(xiàn)的幾起案子趋观,更是在濱河造成了極大的恐慌,老刑警劉巖锋边,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皱坛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宠默,警方通過(guò)查閱死者的電腦和手機(jī)麸恍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搀矫,“玉大人抹沪,你說(shuō)我怎么就攤上這事∪壳颍” “怎么了融欧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)卦羡。 經(jīng)常有香客問(wèn)我噪馏,道長(zhǎng),這世上最難降的妖魔是什么绿饵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任欠肾,我火速辦了婚禮,結(jié)果婚禮上拟赊,老公的妹妹穿的比我還像新娘刺桃。我一直安慰自己,他們只是感情好吸祟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布瑟慈。 她就那樣靜靜地躺著,像睡著了一般屋匕。 火紅的嫁衣襯著肌膚如雪葛碧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天过吻,我揣著相機(jī)與錄音进泼,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛缘琅,可吹牛的內(nèi)容都是我干的粘都。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼刷袍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼翩隧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起呻纹,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤堆生,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后雷酪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體淑仆,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年哥力,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔗怠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吩跋,死狀恐怖寞射,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锌钮,我是刑警寧澤桥温,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站梁丘,受9級(jí)特大地震影響侵浸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氛谜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一掏觉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧值漫,春花似錦履腋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)悔政。三九已至晚吞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谋国,已是汗流浹背槽地。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留学密,地道東北人邮弹。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像届谈,于是被迫代替她去往敵國(guó)和親缅糟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挺智,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容