1. 程式人生 > >計算卷積後尺寸

計算卷積後尺寸

這裡單獨把計算卷積之後的維度的公式拿出來,方便檢視
1.卷積後尺寸計算
out_height=(in_height+2pad-filter_height)/strides[1]+1
out_width=(in_width+2pad-filter_width)/strides[2] +1
2.tensorflow中卷積引數same和valid運算之後的維度計算
(1)same
out_height=ceil(float(in_height))/float(strides[1])
out_width=ceil(float(in_width))/float(strides[2])
(2)valid
out_height=ceil(float(in_height-filter_height+1))/float(strides[1])
out_width=ceil(float(in_width-filter_width+1))/float(strides[2])
(3)引數
padding: SAME和VALID兩種形式
filter: [5,5,1,32]表示5*5的卷積核,1個channel,32個卷積核。
strides: [1,4,4,1]表示橫向和豎向的步長都為4
3.tensorflow裡面的tf.pad函式
雖然在卷積過程中有same選項可選,但是tensorflow裡面還有一個可以用於填充的函式tf.pad(),具體用法如下:

tf.pad(tensor, paddings,mode='CONSTANT',name=None)

padings : 是一個張量,代表每一維填充多少行/列
mode : “CONSTANT” ,”REFLECT”,”SYMMETRIC”
“CONSTANT” 填充0, “REFLECT”是對映填充,上下(1維)填充順序和paddings是相反的,左右(零維)順序補齊, “SYMMETRIC”是對稱填充,上下(1維)填充順序是和paddings相同的,左右(零維)對稱補齊
4.在這裡補充一下,關於tensorflow中的max_pool()中的padding的含義,之前一直不能理解,現在理解了
(1)先給出程式碼

import tensorflow as tf
import numpy as np 

x = tf.placeholder(tf.float32, shape=(1, 500, 500, 3))
#print(type(image))
y1 = tf.nn.max_pool(x, [1, 3, 3, 1], [1, 3, 3, 1], padding = 'VALID')
y2 = tf.nn.max_pool(x, [1, 3, 3, 1], [1, 3, 3, 1], padding = 'SAME')

with tf.Session() as sess: 
    a =  np.full((1
, 500, 500, 3), 2) sess.run(tf.global_variables_initializer()) b = sess.run(y1, feed_dict={x: a}) c = sess.run(y2, feed_dict={x: a}) print(b.shape) # Will succeed. print(c.shape) # Will succeed.

(2)結果

(1, 166, 166, 3) #valid
(1, 167, 167, 3) #same

從結果可以看出:
對於padding=’VALID’, 166 = math.floor(l500/3)
對於padding=’SAME’, 167 =math.ceil( 500/3)