赞
踩
输出大小 = (输入大小-卷积核大小+2*填充大小)/步长+1(向下取整)
padding=‘SAME’:输出大小=输入大小/步长(向上取整)(SAME方式时padding大小是由tf自动决定,一般都是将输入大小填充到步长的整数倍)
padding=‘VALID’:输出大小=(输入大小-卷积核大小+1)/步长(即无填充时的最基本公式)
示例如下:
# SAME方式
x = tf.random.normal([2,5,5,3])
w = tf.random.normal([3,3,3,4])
out = tf.nn.conv2d(x,w,strides=3,padding='SAME')
# out [4]:TensorShape([2, 2, 2, 4])(5/3向上取整为2)
# 也可以理解为padding为1,使得5+1变为6,3的整数倍,(5-3+2*1)/3+1=2
# VALID方式
x = tf.random.normal([2,5,5,3])
w = tf.random.normal([3,3,3,4])
out = tf.nn.conv2d(x,w,strides=2,padding='VALID')
# out:TensorShape([2, 2, 2, 4])((5-2+1)/2=2)
# 也可以理解为padding为0,(5-3+2*0)/2+1=2
padding=‘VALID’:(输入大小-1)x步长+卷积核大小
padding=‘SAME’:输入大小x步长
PS:同样也可以利用基本公式计算,因为转置卷积相当于普通卷积的逆过程,所以只需要将基本公式里的输入大小换成输出大小,公式里的输出大小换成输入大小,再移项即可,但是这样计算不方便且SAME方式下的填充大小还需要根据你设置的output_shape大小来自己推断很麻烦
另外,output_shape大小不能随意设置,必须是((输入大小-1)x步长,输入大小x步长](左开右闭)
没有特殊需要,output_shape大小就直接设置成上面公式计算出来的数值就行
示例如下:
# VALID方式 x = tf.range(16)+1 x = tf.reshape(x,[1,4,4,1]) x = tf.cast(x, tf.float32) # 创建3x3 卷积核 w = tf.constant([[-1,2,-3.],[4,-5,6],[-7,8,-9]]) w = tf.expand_dims(w,axis=2) w = tf.expand_dims(w,axis=3) # 普通卷积运算 out = tf.nn.conv2d(x,w,strides=1,padding='VALID') xx = tf.nn.conv2d_transpose(out, w, strides=3, padding='VALID',output_shape=[1,6,6,1]) # out:TensorShape([1, 2, 2, 1])(4-3+1)/1=2) # xx:TensorShape([1, 6, 6, 1])((2-1)*3+3=6) # SAME方式 x = tf.range(16)+1 x = tf.reshape(x,[1,4,4,1]) x = tf.cast(x, tf.float32) # 创建3x3 卷积核 w = tf.constant([[-1,2,-3.],[4,-5,6],[-7,8,-9]]) w = tf.expand_dims(w,axis=2) w = tf.expand_dims(w,axis=3) # 普通卷积运算 out = tf.nn.conv2d(x,w,strides=1,padding='VALID') xx = tf.nn.conv2d_transpose(out, w, strides=3, padding='SAME',output_shape=[1,6,6,1]) # out:TensorShape([1, 2, 2, 1])(4-3+1)/1=2) # xx:TensorShape([1, 6, 6, 1])(2*3=6) # output_shape也可以设置成[1,4,4,1],[1,5,5,1],范围为(3,6]
[1]Tensorflow深度学习
[2]卷积层输出大小尺寸计算及padding为 “SAME” 和 “VALID”的计算
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。