【CNN】卷积层参数与输入输出大小计算说明

基本计算公式

W W W为输入大小, F F F为卷积核大小, P P P为填充大小(padding), S S S为步长(stride), N N N为输出大小。有如下计算公式: N = ( W − F + 2 P ) S + 1 N=\frac{(W-F+2P)}{S}+1 N=S(WF+2P)+1
由上述公式很容易推得一些常用的卷积层参数——输入输出的大小不变,仅通道数量改变。

# 一个卷积核大小为5*5的卷积层参数
kernel_size = 5
stride = 1
padding = 2
# 一个卷积核大小为3*3的卷积层参数
kernel_size = 3
stride = 1
padding = 1

更简单地,若步长为1,填充大小只要满足下述公式,输入输出的大小就是一致的: P = F − 1 2 P=\frac{F-1}{2} P=2F1

注意事项

若输入输出的长与宽不一样,只需要分别计算就可以了,可以灵活地依据公式调整卷积核大小以及其他参数值。

  • 计算示例:
    现有 (800,1000) 的输入,想要得到 (600,800) 的输出,卷积核设定为 (3,5),步长设定为 2,那么需要如何设置padding得到想要的输出?
    代入上式计算显然有(向上舍入): P h = ( 600 − 1 ) ∗ 2 + 3 − 800 2 = 201 P_h=\frac{(600-1)*2+3-800}{2}=201 Ph=2(6001)2+3800=201 P w = ( 800 − 1 ) ∗ 2 + 5 − 1000 2 = 302 P_w=\frac{(800-1)*2+5-1000}{2}=302 Pw=2(8001)2+51000=302
#input size (800,1000)
kernel_size=(3,5),       
stride=2,                
padding=(201,302),
#output size (600,800)

总而言之,调整卷积核大小、步长或者填充大小都可以改变输出大小,但考虑到网络有效性问题,一般kernel_size依据经验设置为常用的 (5,5) 或是 (3,3) 或是 (3,3)+(1,3)+(3,1) 等,而padding也不会太大,stride也一般为1或者2。当然,各种各样的网络结构还是都有去尝试的价值。

说明

如下面所示,一个长度为6的像素块,若卷积核大小为3,步长为1,则需要填充2个像素点才能使做卷积后的长度依旧为6。
在这里插入图片描述

逆卷积计算

在上采样中需要用到逆卷积运算,此类运算可以实现矩阵的扩展。现有 W W W为输入大小, F F F为卷积核大小, P i P_i Pi为输入填充大小, P o P_o Po为输出填充大小, S S S为步长,有如下公式计算输出大小 N N N
N = ( W − 1 ) ∗ S + P o − 2 P i + F N=(W-1)*S+P_o-2P_i+F N=(W1)S+Po2Pi+F
在pytorch下可以这样写:

# input (n,32,height,width)
self.deconv = nn.ConvTranspose2d(
				32, 1, 
				kernel_size=3, 
				stride=2, 
				padding=1, 
				dilation=1, 	# 卷积核元素间距
				output_padding=1)
# output (n,1,height*2,width*2)

关于逆卷积的详细操作,以后有时间再补充

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值