tf padding方式和输出特征图大小关系

一、基本公式(普通卷积)

输出大小 = (输入大小-卷积核大小+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”的计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值