0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

lviY_AI_shequ ? 2018-01-02 16:49 ? 次閱讀

上世紀(jì)科學(xué)家們發(fā)現(xiàn)了幾個(gè)視覺(jué)神經(jīng)特點(diǎn),視神經(jīng)具有局部感受野,一整張圖的識(shí)別由多個(gè)局部識(shí)別點(diǎn)構(gòu)成;不同神經(jīng)元對(duì)不同形狀有識(shí)別能力,且視神經(jīng)具有疊加能力,高層復(fù)雜的圖案可以由低層簡(jiǎn)單線條組成。之后人們發(fā)現(xiàn)經(jīng)過(guò)conclusional的操作,可以很好反映視神經(jīng)處理計(jì)算的過(guò)程,典型的是1998年LeCun發(fā)明的LeNet-5,可以極大地提升識(shí)別效果。

本文主要就convolutional layer、pooling layer和整體CNN結(jié)構(gòu)展開

Convolutional Layer卷積層

1、原理和參數(shù)

可以模擬局部感受野的性質(zhì),同上一層不是全連接,而是一小塊區(qū)域連接,這一小塊就是局部感受野(receptive field)。并且通過(guò)構(gòu)造特定的卷積神經(jīng)元,可以模擬不同神經(jīng)元對(duì)不同形狀刺激不同反應(yīng)的性質(zhì)。如下圖所示,一個(gè)神經(jīng)元處理一層會(huì)形成一個(gè)feature map,多層疊加,層數(shù)逐漸加深。

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

感受野(kernel或filter)的尺寸可以看做fh*fw,由于感受野本身具有尺寸,feature map會(huì)不斷縮小,為了處理方便,使得每層大小不變,于是我們每層加值為0的邊(zero padding),保證經(jīng)過(guò)處理以后的feature map同前一層尺寸一樣。多層之間的卷積運(yùn)算操作,相當(dāng)于和原來(lái)像素對(duì)應(yīng)位置做乘法。如下左圖所示,加了邊后可以保證上下層大小一致,右圖表示每層之間convolve的操作(如果不加zero padding)。

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

但上圖所示只是簡(jiǎn)單例子,一般掃描的是三維圖像(RGB),就不是一個(gè)矩陣,而是一個(gè)立方體,我們用一個(gè)三維塊去掃描它,原理同上圖相同。

有時(shí)掃描時(shí)不是順序去掃,而是跳躍著掃描,每次移動(dòng)2-3個(gè)像素值(stride),但并非完全分離不會(huì)造成信息丟失,這樣形成的feature map相較于原始圖片縮小,實(shí)現(xiàn)信息聚集的效果。

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

就像如下灰度圖(2d)中所示,左邊只提取豎線(vertical filter),右邊只提取橫線(horizontal filter)可看出橫梁部分變亮,大量不同的這樣的filter(比如可以識(shí)別邊角、折線的filter)的疊加,可形成多張feature maps

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

下圖是一個(gè)3d的RGB效果,每個(gè)kernel(filter)可以掃描出一張feature map,多個(gè)filter可以疊加出很厚的feature maps,前一層filter做卷積可以形成后一層的一個(gè)像素點(diǎn)。

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

如下圖,可以代表i行j列k深度的一個(gè)輸出像素值,k’代表第k個(gè)filter,w代表filter中的值,x代表輸入,b是偏值。

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

2、TensorFlow實(shí)現(xiàn)

以下是使用TensorFlow實(shí)現(xiàn)的代碼,主要使用conv2d這個(gè)函數(shù)

importnumpyasnpfromsklearn.datasetsimportload_sample_images# Load sample imagesdataset = np.array(load_sample_images().images, dtype=np.float32)# 一共4維,channel表示通道數(shù),RGB是3batch_size, height, width, channels = dataset.shape# Create 2 filters# 一般感受野大小7*7,5*5,3*3,設(shè)置2個(gè)kernel,輸出2層feature mapfilters_test = np.zeros(shape=(7,7, channels,2), dtype=np.float32)# 第一個(gè)(0)filter的設(shè)定,7*7矩陣中,3是中間filters_test[:,3, :,0] =1# vertical line# 第二個(gè)(1)filter的設(shè)定filters_test[3, :, :,1] =1# horizontal line# a graph with input X plus a convolutional layer applying the 2 filtersX = tf.placeholder(tf.float32, shape=(None, height, width, channels))# 雖然輸入是一個(gè)四維圖像,但是由于batch_size和channel都已經(jīng)固定,所以使用conv2d# strides設(shè)定,第一個(gè)和第四個(gè)都是1表示不可以跳過(guò)batch_size和channel# 那兩個(gè)2表示橫縱向都縮減2,相當(dāng)于整張圖片縮減為原來(lái)四分之一,做了75%的縮減convolution = tf.nn.conv2d(X, filters, strides=[1,2,2,1], padding="SAME")withtf.Session()assess: output = sess.run(convolution, feed_dict={X: dataset})

下面是padding的值SAME和VALID的區(qū)別(filter的寬度為6,stride為5),SAME確保所有圖像信息都被convolve添加zero padding,而VALID只添加包含在內(nèi)的像素點(diǎn)

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

3、所耗內(nèi)存計(jì)算

相比于傳統(tǒng)的全連接層,卷積層只是部分連接,節(jié)省了很多內(nèi)存。

比如:一個(gè)具有5*5大小filter的卷積層,輸出200張150*100大小的feature maps,stride取1(即不跳躍),padding為SAME。輸入是150*100大小的RGB圖像(channel=3),總共的參數(shù)個(gè)數(shù)是200*(5*5*3+1)=15200,其中+1是bias;如果輸出采用32-bits float表示(np.float32),那么每張圖片會(huì)占據(jù)200*150*100*32=9600000bits(11.4MB),如果一個(gè)training batch包含100張圖片(mini-batch=100),那么這一層卷積層就會(huì)占據(jù)1GB的RAM。

可以看出,訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)是非常消耗內(nèi)存的,但是使用時(shí),只用到最后一層的輸出即可。

Pooling Layer池化層

1、原理和參數(shù)

當(dāng)圖片大小很大時(shí)內(nèi)存消耗巨大,而Pooling Layer所起的作用是濃縮效果,緩解內(nèi)存壓力。

即選取一定大小區(qū)域,將該區(qū)域用一個(gè)代表元素表示。具體的Pooling有兩種,取平均值(mean)和取最大值(max)。如下圖所示是一個(gè)取最大值的pooling layer,kernel大小為2*2,stride大小取決于kernel大小,這里是2,即剛好使得所有kernel都不重疊的值,因而實(shí)現(xiàn)高效的信息壓縮,將原始圖像橫縱壓縮一半,如右圖所示,特征基本都完全保留了下來(lái)。

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

pooling這個(gè)操作不影響channel數(shù),在feature map上也一般不做操作(即z軸一般不變),只改變橫縱大小。

2、TensorFlow實(shí)現(xiàn)

# Createagraph withinputXplusamaxpooling layerX=tf.placeholder(tf.float32, shape=(None, height, width, channels))# 選用取最大值的max_pool方法# 如果是取平均值,這里是mean_pool# ksize就是kernel大小,featuremap和channel都是1,橫向縱向是2max_pool =tf.nn.max_pool(X, ksize=[1,2,2,1], strides=[1,2,2,1],padding="VALID")withtf.Session()assess: output = sess.run(max_pool, feed_dict={X: dataset})整體CNN框架

典型CNN architecture

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

有名的CNN架構(gòu):

LeNet(MISIT上)-1998:輸入32*32(在28*28圖像上加了zero padding)。第一層kernel用了6個(gè)神經(jīng)元,kernel大小5*5,stride取1,輸出就是28*28;第二層做了average pooling,2*2的kernel,stride是2,輸出就變?yōu)樵瓉?lái)的一半,不改變feature map數(shù)目;第三層放了16個(gè)神經(jīng)元,其他同理;第五層用了120個(gè)神經(jīng)元,5*5的kernel對(duì)5*5的輸入做卷積,沒(méi)法再滑動(dòng),輸出為1*1;F6用120個(gè)1*1的輸出全連接84個(gè)神經(jīng)元,Out全連接10個(gè)神經(jīng)元,對(duì)應(yīng)手寫體識(shí)別輸出的10個(gè)數(shù)字。

激活函數(shù)前面都用的tanh,是傳統(tǒng)CNN中常用的,輸出層用了RBF比較特殊,是一個(gè)計(jì)算距離的方式去判斷和目標(biāo)輸出間距離做lost。。

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

AlexNet-2012:最早應(yīng)用于競(jìng)賽中,近10%的提高了準(zhǔn)確度

輸入224*224的彩色圖像,C1是個(gè)很大的11*11的filter,stride=4。。最后連做3層convolution。。最后輸出1000個(gè)類的分類結(jié)果。

激活函數(shù)使用ReLU,這在現(xiàn)今很流行,輸出層用的softmax

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

AlexNet使用了一個(gè)小技巧是Local Response Normalization(LRN局部響應(yīng)歸一化)

這種操作可以在傳統(tǒng)輸出上加一個(gè)bias,考慮到近鄰的一些輸出影響。即一個(gè)輸出旁邊有很牛掰的輸出的話,它的輸出就會(huì)慫了,收到抑制,可以看到,含β的整個(gè)項(xiàng)都在分母上。但后來(lái)發(fā)現(xiàn),這個(gè)技術(shù)對(duì)分類器的提升也不是很明顯,有的就沒(méi)有用。

GoogleLeNet-2014:

大量應(yīng)用Inception module,一個(gè)輸入進(jìn)來(lái),直接分四步進(jìn)行處理,這四步處理完后深度直接進(jìn)行疊加。在不同的尺度上對(duì)圖片進(jìn)行操作。大量運(yùn)用1*1的convolution,可以靈活控制輸出維度,可以降低參數(shù)數(shù)量。

如右圖所示,輸入是192,使用了9層inception module,如果直接用3*3,5*5參數(shù),可以算一下,之后inception參數(shù)數(shù)目是非常大的,深度上可以調(diào)節(jié),可以指定任意數(shù)目的feature map,通過(guò)增加深度把維度減下來(lái)。inception模塊6個(gè)參數(shù)剛好對(duì)應(yīng)這6個(gè)convolution,上面4個(gè)參數(shù)對(duì)應(yīng)上面4個(gè)convolution,加入max pool不會(huì)改變feature map數(shù)目(如480=128+192+96+64)。

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

將正確率升高到95-96%,超過(guò)人類分辨率,因?yàn)閕mage net中但是狗的種類就有很多,人類無(wú)法完全一一分辨出。

ReSNet殘差網(wǎng)絡(luò)-2015:

不再直接學(xué)習(xí)一個(gè)目標(biāo)函數(shù),輸入直接跳過(guò)中間層直接連到輸出上,要學(xué)習(xí)的是殘差f(x),輸入跳過(guò)中間層直接加到輸出上。

好處是:深度模型路徑依賴的限制,即gradient向前傳導(dǎo)時(shí)要經(jīng)過(guò)所有層,如果中間有層死掉了,前面的層就無(wú)法得到訓(xùn)練。殘差網(wǎng)絡(luò)不斷跳躍,即使中間有的層已經(jīng)死掉,信息仍舊能夠有效流動(dòng),使得訓(xùn)練信號(hào)有效往回傳導(dǎo)。

對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析對(duì)于convolutional layer、TensorFlow和整體CNN結(jié)構(gòu)詳細(xì)分析

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cnn
    cnn
    +關(guān)注

    關(guān)注

    3

    文章

    353

    瀏覽量

    22265
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    329

    瀏覽量

    60561

原文標(biāo)題:【機(jī)器學(xué)習(xí)】徹底搞懂CNN

文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    DVI接口詳細(xì)分析

    DVI接口詳細(xì)分析DVI 接口規(guī)格和定義 DVI 有DVI 1.0 和DVI 2.0 兩種標(biāo)準(zhǔn),其中 DVI 1.0 僅用了其中的一組信號(hào)傳輸信道(data0-data2 ),傳輸圖像的最高像素時(shí)鐘
    發(fā)表于 08-11 09:51

    uboot代碼詳細(xì)分析

    [url=]uboot代碼詳細(xì)分析[/url]
    發(fā)表于 01-29 13:51

    詳細(xì)分析一下USB協(xié)議

    本文跟大家一起詳細(xì)分析一下USB協(xié)議。
    發(fā)表于 05-24 06:16

    詳細(xì)分析stm32f10x.h

    每日開講---學(xué)習(xí)STM32不得不看的剖析(詳細(xì)分析stm32f10x.h)摘要: 學(xué)習(xí)STM32不得不看的剖析(詳細(xì)分析stm32f10x.h)。/**這里是STM32比較重要的頭文件*******************************************
    發(fā)表于 08-05 07:44

    詳細(xì)分析了VTIM和VMIN的功能

    上一篇文章中,我們詳細(xì)分析了VTIM和VMIN的功能,《嵌入式Linux 串口編程系列2--termios的VMIN和VTIME深入理解》 也明白了這兩個(gè)參數(shù)設(shè)計(jì)的初衷和使用方法,接下來(lái)我們 就詳細(xì)
    發(fā)表于 11-05 07:09

    請(qǐng)問(wèn)一下怎樣對(duì)stm32的啟動(dòng)代碼進(jìn)行詳細(xì)分析

    請(qǐng)問(wèn)一下怎樣對(duì)stm32的啟動(dòng)代碼進(jìn)行詳細(xì)分析呢?
    發(fā)表于 11-26 07:10

    電子工程師需要掌握的20個(gè)模擬電路的詳細(xì)分析

    電子工程師需要掌握的20個(gè)模擬電路的詳細(xì)分析
    發(fā)表于 09-28 06:22

    電子工程師必須掌握的20個(gè)模擬電路詳細(xì)分析

    內(nèi)含參考答案以及詳細(xì)分析
    發(fā)表于 10-07 07:15

    焊接技術(shù)詳細(xì)分析

    焊接技術(shù)詳細(xì)分析       焊接實(shí)質(zhì)上是將元器件高質(zhì)量連接起來(lái)最容易實(shí)現(xiàn)的方法,對(duì)于DIY高手來(lái)說(shuō),光能掌握電腦配件的性能和參數(shù)
    發(fā)表于 01-26 10:46 ?1905次閱讀

    電子整流器工作原理詳細(xì)分析

    電子整流器工作原理詳細(xì)分析
    發(fā)表于 02-27 10:43 ?2.5w次閱讀

    Buck變換器原理詳細(xì)分析

    Buck變換器原理詳細(xì)分析
    發(fā)表于 09-15 17:26 ?30次下載
    Buck變換器原理<b class='flag-5'>詳細(xì)分析</b>

    物聯(lián)網(wǎng)的產(chǎn)業(yè)生態(tài)是怎樣的詳細(xì)分析概述

    物聯(lián)網(wǎng)的產(chǎn)業(yè)生態(tài)是怎樣的詳細(xì)分析概述
    的頭像 發(fā)表于 12-08 10:00 ?5180次閱讀

    一些開關(guān)電源的拓?fù)?b class='flag-5'>結(jié)構(gòu)詳細(xì)分析

    本文檔的主要內(nèi)容詳細(xì)介紹的是一些開關(guān)電源的拓?fù)?b class='flag-5'>結(jié)構(gòu)詳細(xì)分析。
    發(fā)表于 01-06 00:16 ?20次下載
    一些開關(guān)電源的拓?fù)?b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>詳細(xì)分析</b>

    正激有源鉗位的詳細(xì)分析

    正激有源鉗位的詳細(xì)分析介紹。
    發(fā)表于 06-16 16:57 ?63次下載

    CNN模型的基本原理、結(jié)構(gòu)、訓(xùn)練過(guò)程及應(yīng)用領(lǐng)域

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,簡(jiǎn)稱CNN)是一種深度學(xué)習(xí)模型,廣泛應(yīng)用于圖像識(shí)別、視頻分析、自然語(yǔ)言處理等領(lǐng)域。CNN模型的核心是卷積層
    的頭像 發(fā)表于 07-02 15:26 ?3910次閱讀