TensorFlow之conv2d函数解析
TensorFlow中函數(shù)conv2d主要實(shí)現(xiàn)了輸入張量與設(shè)定卷積核的卷積操作,其函數(shù)形式如下:
tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=True,data_format='NHWC',dilations=[1, 1, 1, 1],name=None )input,filter自然是設(shè)定的輸入和卷積核了,參數(shù)strides,padding分別決定了卷積操作中滑動步長和圖像邊沿填充的方式。
看下strides官方解釋:
其為長度為4的一階張量,并且要求strides[0]=strides[3]=1,strides[1],strides[2]決定卷積核在輸入圖像in_hight,in_width方向的滑動步長,而通過圖像卷積的過程可以知道,卷積核的大小和圖像的大小有時候比不是完全匹配,比如圖像大小為5x5,卷積核大小為3x3,滑動步長為3時,會涉及到圖像卷積過程中邊界如何填充的問題,padding參數(shù)的兩個值SAME,VALID決定了其填充方式,通過代碼驗(yàn)證其不同的工作方式:
padding = VALID:
可以看到當(dāng)用5x5 的卷積核對28x28的圖像進(jìn)行卷積,采用padding=VALID模式,步長為5,那么最后每個方向會余下3個像素,而VALID模式中會直接舍棄,這樣每個方向上的5個元素會變成一個元素,所以最終卷積后的圖像大小變成了5x5,結(jié)果如下:
padding = SAME:
這種模式下,對于原始圖像與卷積核不匹配的情況,就要對圖像的邊界做一些填充,具體的填充方式和所差的元素個數(shù)有關(guān),一種一種試一試:
同樣是產(chǎn)生28x28的全1圖像,然后用全1的5x5卷積核做卷積,那每個方向差兩個元素,通過計(jì)算結(jié)果可以看到是在每個方向的兩端各補(bǔ)了一個0,形成30x30,四周都是0的圖像。那如果差1個元素呢?
比較上述結(jié)果第一行,第一列不同,其余相同,那么就是在每行每列的最后補(bǔ)了一個0。繼續(xù)差三個元素呢?
同樣是比較結(jié)果,通過元素的值可以推測出其是在每個方向的開頭補(bǔ)了一個0,最后補(bǔ)了兩個0,那么差4個元素呢?
結(jié)果顯示了什么?首尾各補(bǔ)兩個0。那么通過上述驗(yàn)證是不是得到了些規(guī)律呢?可見當(dāng)差偶數(shù)個元素是首尾各補(bǔ)一半,差奇數(shù)個時前邊補(bǔ)奇數(shù)個,后邊補(bǔ)偶數(shù)個。當(dāng)然具體差多少元素和選定的卷積核大小以及滑動步長密切相關(guān)。那么滑動步長又有哪些影響呢?如果改成滑動步長為1,看看驗(yàn)證的結(jié)果:
再把padding改為 VALID瞧瞧:
總結(jié)一下看到了什么,卷積核大小,滑動步長直接影響最后的卷積結(jié)果的大小,且padding為SAME模式時,先對原圖像進(jìn)行填充,再做卷積,填充值須根據(jù)卷積核大小及滑動步長決定,當(dāng)滑動步長大于1時:填充數(shù)=K-I%S(K:卷積核邊長,I:輸入圖像邊長,S:滑動步長),滑動步長為1時,直接卷積核邊長減1,而padding為VALID模式時,很簡單粗暴直接從原始圖像的首段開始卷積,到最后不能匹配卷積核的部分直接舍去,至于兩種模式會有怎樣的差別,后續(xù)可進(jìn)行進(jìn)一步的驗(yàn)證。
---------------------?
原文:https://blog.csdn.net/qq_17272679/article/details/79591540?
總結(jié)
以上是生活随笔為你收集整理的TensorFlow之conv2d函数解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【TensorFlow】Anaconda
- 下一篇: 基于TensorFlow的2个机器学习简