PS:翻譯來(lái)源:
Part III. Implementing Advanced Deep Models in TensorFlow
Chapter 5. Object Recognition and Classification
Chapter 5. 物體識(shí)別與分類
現(xiàn)在你應(yīng)該理解了Tensorflow的基本概念以及Tensorflow的最佳實(shí)踐幅疼。我們接下來(lái)的實(shí)踐會(huì)在構(gòu)建模型中進(jìn)行米奸。這個(gè)模型具有識(shí)別物體和分類的能力。構(gòu)建模型過(guò)長(zhǎng)中會(huì)擴(kuò)展一些迄今為止已經(jīng)涉及的基礎(chǔ)概念爽篷,同時(shí)增加了計(jì)算機(jī)視覺(jué)的術(shù)語(yǔ)悴晰,技術(shù)和基礎(chǔ)。這種技術(shù)由于其準(zhǔn)確性逐工,最近變得流行起來(lái)铡溪。
ImageNet是一個(gè)有l(wèi)abel的圖像數(shù)據(jù)集,在計(jì)算機(jī)視覺(jué)和深度學(xué)習(xí)中最近很流行泪喊。每年ImageNet都會(huì)舉行ILSVRC挑戰(zhàn)賽棕硫,參賽者構(gòu)建系統(tǒng)來(lái)自動(dòng)的在ImageNet數(shù)據(jù)庫(kù)的圖像上進(jìn)行分類和識(shí)別物體。在2012年的挑戰(zhàn)賽中窘俺,SuperVision提交了具有創(chuàng)造性的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的解決方案饲帅。ILSVRC解決方案常常是很有創(chuàng)造性的,除了SuperVision將其映射的準(zhǔn)確性分為多少以外瘤泪。SuperVision’s
entry針對(duì)計(jì)算機(jī)視覺(jué)精度設(shè)定了新的標(biāo)準(zhǔn)灶泵,并引起了(計(jì)算機(jī)視覺(jué))在深度學(xué)習(xí)技術(shù)中對(duì)卷積神經(jīng)網(wǎng)絡(luò)的興趣。
卷積神經(jīng)網(wǎng)絡(luò)(CNNs)的流行度不斷增加(Convolutional Neural Networks (CNNs) have continued to grow inpopularity)对途。人們主要用于計(jì)算機(jī)視覺(jué)相關(guān)的任務(wù)中赦邻,但也不僅限于與圖像相關(guān)的任務(wù)。CNN可以被用于任何可以被表達(dá)為Tensor的數(shù)據(jù)中实檀,其中tensor的值是順序排列的(a tensor where values are ordered next to related values (in a grid))惶洲。微軟研究院在2014年發(fā)布了一篇關(guān)于將CNNs用于語(yǔ)音識(shí)別方面的論文按声,在這篇論文輸入的tensor是被記錄時(shí)排序的單行音頻頻率。對(duì)于圖片來(lái)說(shuō)恬吕,tensor的值是圖像中對(duì)應(yīng)的像素點(diǎn)的排列签则。
在本章節(jié)中,重點(diǎn)在于使用Tensorflow的CNNs用于圖像的工作铐料。目標(biāo)是用Tensorflow構(gòu)建一個(gè)CNN模型可以識(shí)別ImageNets數(shù)據(jù)庫(kù)子集中圖像渐裂。訓(xùn)練一個(gè)CNN模型需要在tensorflow里面和圖片打交道,還需要理解并且如何使用卷積神經(jīng)網(wǎng)絡(luò)(CNNs)钠惩。這章節(jié)主要是致力于使用TensorFlow介紹計(jì)算機(jī)視覺(jué)概念柒凉。
訓(xùn)練CNN模型中使用的數(shù)據(jù)集合是ImageNet的子集,叫Stanford
Dogs Dataset
顧名思義篓跛,該數(shù)據(jù)集填充有不同狗品種的圖像和圖像中顯示的品種的標(biāo)簽膝捞。該模型的目標(biāo)是拍攝圖像并準(zhǔn)確地猜測(cè)圖像中顯示的狗的品種(示例圖像標(biāo)記為斯坦福大學(xué)的Dog Datase的西伯利亞赫斯基)。
如果上面顯示的圖像之一被加載到模型中愧沟,它應(yīng)該輸出西伯利亞赫斯基的標(biāo)簽蔬咬。這些示例圖像不會(huì)對(duì)模型的準(zhǔn)確性進(jìn)行公正的測(cè)試,因?yàn)樗鼈兇嬖谟谟?xùn)練數(shù)據(jù)集中央渣。找出一個(gè)公平的度量來(lái)計(jì)算模型的精確度需要大量的圖像计盒,不會(huì)用于訓(xùn)練。未用于訓(xùn)練模型的圖像將用于創(chuàng)建單獨(dú)的測(cè)試數(shù)據(jù)集芽丹。
提高圖像公平性以測(cè)試模型準(zhǔn)確性的原因是因?yàn)樗潜3址蛛x的測(cè)試北启,訓(xùn)練和交叉驗(yàn)證數(shù)據(jù)集的一部分。在處理輸入時(shí)拔第,分離用于訓(xùn)練網(wǎng)絡(luò)的大部分?jǐn)?shù)據(jù)是必需的做法咕村。這種分離是允許對(duì)模型進(jìn)行盲目測(cè)試。
使用用于訓(xùn)練它的輸入測(cè)試模型可能會(huì)創(chuàng)建一個(gè)準(zhǔn)確匹配已經(jīng)看到的輸入的模型蚊俺,而不能使用新的輸入懈涛。然后使用測(cè)試數(shù)據(jù)集來(lái)查看模型對(duì)培訓(xùn)中不存在的數(shù)據(jù)執(zhí)行的程度。
隨著時(shí)間的推移和模型的迭代泳猬,可能的是批钠,為了提高準(zhǔn)確性而進(jìn)行的改變使模型更好地配備了測(cè)試數(shù)據(jù)集,同時(shí)在現(xiàn)實(shí)世界中表現(xiàn)不佳得封。一個(gè)好的做法是使用交叉驗(yàn)證數(shù)據(jù)集來(lái)檢查最終的模型并獲得更好的估計(jì)精度埋心。
使用圖像,最好在進(jìn)行任何預(yù)處理(顏色調(diào)整或裁剪)時(shí)分離原始數(shù)據(jù)集忙上,以保持輸入管道在所有數(shù)據(jù)集中保持一致拷呆。
Convolutional Neural Networks (卷積神經(jīng)網(wǎng)絡(luò))
從專業(yè)技術(shù)上講,卷積神經(jīng)網(wǎng)絡(luò)是一種至少有一層(tf.nn.conv2d)卷積層的神經(jīng)網(wǎng)絡(luò)。在卷積層是將其輸入層f和可配置卷積核g之間進(jìn)行卷積并生成這一層的輸出茬斧。在簡(jiǎn)化定義中腰懂,卷積的目的是將內(nèi)核(過(guò)濾器、kernel项秉、filter)應(yīng)用于張量中的每一個(gè)點(diǎn)(point)绣溜,并通過(guò)在輸入張量上滑動(dòng)內(nèi)核來(lái)產(chǎn)生一個(gè)過(guò)濾之后(filtered)的輸出。
PS:這句話說(shuō)白了就是本層的輸入和本層的卷積核以及卷積伙狐,卷積的過(guò)程通常是通過(guò)滑動(dòng)窗口進(jìn)行的涮毫,其輸出的結(jié)果卷積后的。
給出一個(gè)邊緣檢測(cè)的濾波示例贷屎。給出一個(gè)應(yīng)用于圖像每一個(gè)像素點(diǎn)的內(nèi)核,輸出是描繪出所有邊緣的新圖像艘虎。在這個(gè)示例中唉侄,輸入的張量(Tensor)是圖像,張量中的每一個(gè)點(diǎn)被認(rèn)為是一個(gè)包含有紅野建、綠属划、藍(lán)像素的點(diǎn)。內(nèi)核會(huì)滑過(guò)圖像中的每一個(gè)像素候生,并且當(dāng)顏色之間存在邊緣時(shí)輸出的值就會(huì)增加同眯。下圖簡(jiǎn)單展示了當(dāng)輸入時(shí)一個(gè)圖像,輸出是圖像中找到的所有水平線唯鸭。
要理解如何結(jié)合輸入進(jìn)行卷積并且生成過(guò)濾后的圖像和什么是卷積核這兩點(diǎn)十分重要须蜗。因?yàn)橐恢钡竭@章的后半部分都會(huì)在在練習(xí)的時(shí)候遇到。
Obtaining a broad sense of what a CNN does
and its biological inspiration builds the technical implementation目溉。
在1968年明肮,一篇文章詳細(xì)地描述了關(guān)于猴條紋皮層(大腦想要處理視覺(jué)輸入的部分)的細(xì)胞布局的新發(fā)現(xiàn)。文章討論了垂直延伸組合在一起以匹配某些視覺(jué)特征的細(xì)胞群缭付。靈長(zhǎng)類大腦的研究似乎與機(jī)器學(xué)習(xí)任務(wù)無(wú)關(guān)柿估,但它在使用CNN的深度學(xué)習(xí)發(fā)展中是有用的。
CNN遵循簡(jiǎn)化的過(guò)程匹配信息陷猫,類似于在猴紋狀體皮層的細(xì)胞布局中發(fā)現(xiàn)的結(jié)構(gòu)秫舌。當(dāng)信號(hào)通過(guò)猴子的條紋皮質(zhì)的時(shí)候,某些層會(huì)突出顯示绣檬。例如足陨,當(dāng)水平線通過(guò)它時(shí),某一層的細(xì)胞激活(增加其輸出信號(hào))河咽。CNN的神經(jīng)元群也會(huì)展示相似的行為钠右,其通過(guò)從“訓(xùn)練”中學(xué)習(xí)到的模式將神經(jīng)元簇將激活。比如忘蟹,訓(xùn)練完畢以后飒房,當(dāng)一組橫線通過(guò)的時(shí)候CNN會(huì)在確定的層里面激活搁凸。
(PS:這點(diǎn)我翻譯的不是太準(zhǔn)確,對(duì)horizontal line不是太了解狠毯,貼出原文:
CNNs follow a simplified process matching information similar to the structure found in the cellular layout of a monkey’s striate cortex. As signals are passed through a monkey’s striate cortex, certain layers signal when a visual pattern is highlighted. For example, one layer of cells activate (increase its output signal) when a horizontal line passes through it. A CNN will exhibit a similar behavior where clusters of neurons will activate based on patterns learned from training. For example, after training, a CNN will have certain layers that activate when a horizontal line passes through it.)
對(duì)于匹配水平線在神經(jīng)網(wǎng)絡(luò)架構(gòu)上很有用护糖。但是CNN把這種思想推進(jìn)了一層,CNN使用多層簡(jiǎn)單的模式去匹配復(fù)雜模式嚼松。在CNN的上下文中嫡良,這些模式被稱為過(guò)濾器(filter)或者是內(nèi)核(kernel)。CNN的目標(biāo)就是調(diào)整這些內(nèi)核的權(quán)重直到他們可以準(zhǔn)確的匹配訓(xùn)練數(shù)據(jù)為止。訓(xùn)練這些過(guò)濾器常常是通過(guò)組合不同的層并且通過(guò)梯度下降(gradient descent)學(xué)習(xí)權(quán)重的方式來(lái)實(shí)現(xiàn)。
一個(gè)普通的CNN架構(gòu)可能會(huì)結(jié)合卷積層(tf.nn.conv2d)屡律,非線性層(tf.nn.relu),池化層(tf.nn.max_pooling)以及一個(gè)全連接層(tf.matmul)拓轻。如果沒(méi)有這些層的話,我們很難匹配復(fù)雜的模式,這是因?yàn)榫W(wǎng)絡(luò)會(huì)過(guò)濾掉很多信息。一個(gè)設(shè)計(jì)的比較好的CNN架構(gòu)會(huì)在強(qiáng)調(diào)重要信息的同時(shí)去除噪聲。在本節(jié)的后面會(huì)詳細(xì)的講解如何把這些層結(jié)合到一起來(lái)使用甩苛。
此架構(gòu)的輸入圖像是一種復(fù)雜的格式,旨在支持加載多個(gè)圖像的能力俏站。加載一批圖像同時(shí)需要允許計(jì)算多個(gè)圖像讯蒲,這就要求需要由復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。該數(shù)據(jù)結(jié)構(gòu)應(yīng)該是秩(rank)為4的張量肄扎,張量里包含了一批圖像的所有信息墨林。Tensorflow的輸入管道(input pipline)(用于對(duì)文件解碼并且讀取)有一個(gè)用于批量處理多個(gè)圖像的特殊設(shè)計(jì)形式,其包含了對(duì)于圖像而言所有的信息:([image_batch_size, image_height, image_width, image_channels])反浓。通過(guò)示例代碼我們可以知道在與tensorflow的圖像中檢查輸入的數(shù)據(jù)結(jié)構(gòu)萌丈。
示例代碼的輸出結(jié)果是:
注意:
示例代碼和以后的例子中不會(huì)包含啟動(dòng)tensorflow的運(yùn)行代碼。省略的部分包含有:導(dǎo)入tensorflow的語(yǔ)句(通常用tf來(lái)簡(jiǎn)稱)雷则,創(chuàng)建Tensorflow的會(huì)話為sess辆雾,初始化所有的變量和啟動(dòng)并運(yùn)行多個(gè)線程。如果不執(zhí)行這些步驟就執(zhí)行示例代碼月劈,可能會(huì)出現(xiàn)未定義變量錯(cuò)誤度迂。
在示例代碼中,批處理圖像中包含有兩個(gè)圖像猜揪。每個(gè)圖像里面包含有高為兩個(gè)像素惭墓、寬為3個(gè)像素的RGB色彩空間。執(zhí)行代碼之后會(huì)輸出圖像的數(shù)量作為第一個(gè)集合的維度而姐,每個(gè)圖像的高作為第二個(gè)集合的維度腊凶,圖像的寬代表第三個(gè)集合的維度,色彩通道作為最后一個(gè)集合的維度。
圖像的寬高映射關(guān)系需要注意钧萍,如果要嘗試著獲取第一個(gè)圖像的第一個(gè)像素應(yīng)該這樣做:
sess.run(image_batch)[0][0][0]
執(zhí)行示例之后的代碼輸出結(jié)果如下:
array([0,255,0],dtype=int32)
上面的示例不是從磁盤上加載的圖像褐缠,image_batch變量可以看做是輸入管道加載圖像的一部分。使用輸入管道會(huì)從磁盤上加載同樣格式风瘦,所做的事情也是一樣的队魏。通常情況下,創(chuàng)建類似于上面示例的image_batch這樣的假數(shù)據(jù)是有用的万搔。它可以簡(jiǎn)化輸入并使得調(diào)試問(wèn)題變得簡(jiǎn)單胡桨。其主要是為了使得調(diào)試變得簡(jiǎn)單,因?yàn)镃NN架構(gòu)往往非常復(fù)雜瞬雹,并且常常需要幾天的時(shí)間用來(lái)訓(xùn)練昧谊。
PS:這句話說(shuō)白就是,我們?cè)谀M輸入管道挖炬。模擬數(shù)據(jù)對(duì)于調(diào)試很有幫助揽浙。
CNN架構(gòu)中遇到的第一個(gè)復(fù)雜工作就是卷積層的工作。在任何圖像加載和操縱之后意敛,卷積層往往是網(wǎng)絡(luò)里面的第一層。第一個(gè)卷積層很有用膛虫,因?yàn)樘珪?huì)簡(jiǎn)化網(wǎng)絡(luò)中其余的部分并用于調(diào)試草姻。下一節(jié)將重點(diǎn)介紹卷積層如何操作,并且如何通過(guò)Tensorflow使用它稍刀。
Convolution(卷積)
顧名思義撩独,卷積運(yùn)算是卷積神經(jīng)網(wǎng)絡(luò)中重要的組成部分。CNN能夠精確的匹配多種模式的能力可以歸因于卷積計(jì)算账月。正如上一節(jié)所示综膀,這些操作需要復(fù)雜的輸入。在本節(jié)中局齿,我們將實(shí)驗(yàn)卷積運(yùn)算和調(diào)節(jié)他的可用參數(shù)【缛埃現(xiàn)在要將兩個(gè)輸入的張量(輸入和卷積核)卷積為一個(gè)輸出張量,該輸出張量代表每一個(gè)輸入的信息抓歼。
Input and Kernel (輸入和卷積核)
在通常情況下Tensorflow中的卷積操作是使用tf.nn.conv2d讥此。還有其他的用例是使用TensorFlow設(shè)計(jì)的特殊卷積操作。tf.nn.conv2d是開始進(jìn)行實(shí)驗(yàn)的首選卷積運(yùn)算谣妻。例如萄喳,我們將兩個(gè)張量卷積在一起并檢查結(jié)果。
input_batch=tf.constant([
[# First Input[[0.0], [1.0]],
[[2.0], [3.0]]
],
[# Second Input[[2.0], [4.0]],
[[6.0], [8.0]]
]
])
kernel=tf.constant([
[
[[1.0,2.0]]
]
])
上述代碼創(chuàng)建了兩個(gè)張量蹋半。Input_batch張量的形狀和上一節(jié)見(jiàn)過(guò)的image_batch張量的形狀類似他巨。第一個(gè)張量將會(huì)是被卷積的,第二個(gè)張量是作為卷積核的。卷積核(Kernel)是一個(gè)很重要的術(shù)語(yǔ)染突,其可以與權(quán)重(weights)捻爷、濾波器(filter)、卷積矩陣(convolution matrix)觉痛、掩碼(filter)互換役衡。由于這個(gè)任務(wù)和計(jì)算機(jī)視覺(jué)相關(guān),所以使用術(shù)語(yǔ)內(nèi)核是對(duì)的薪棒,因?yàn)檫@種東西在計(jì)算機(jī)視覺(jué)中被稱為圖像內(nèi)核手蝎。當(dāng)用tensorflow描述功能的時(shí)候,術(shù)語(yǔ)之間沒(méi)有實(shí)際的差別俐芯。
下期? 會(huì)介紹一系列的tensorflow API? ,如下所示棵介。 敬請(qǐng)期待。
Strides?
Padding
Data Format
Kernels in Depth
Common Layers
Convolution Layers
tf.nn.depthwise_conv2d
tf.nn.separable_conv2d
tf.nn.conv2d_transpose
Activation Function
tf.nn.relu
tf.sigmoid