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