6.3 填充和步幅 & 卷积层的输出形状公式

本文详细解释了卷积操作中填充的作用、计算方法,以及步幅的概念。通过实例演示了如何使用PyTorch的Conv2d函数处理填充和步幅,特别提到了奇数卷积核的应用。还提到在Yolov5中步长计算的小技巧。
摘要由CSDN通过智能技术生成

一.填充

1.作用:

为了防止丢失边缘像素。如240x240的像素图像,经过10层5x5卷积,变成了200x200像素。可以根据输出形状计算公式 (w-k+1) x (h-k+1)计算得出。

2.方法:

最常用的方法是填充0。如下:
在这里插入图片描述

3.公式:计算填充原图像后的输出形状

假设填充p行(上面填充p/2行,下面填充p/2行),p列。输出大小为:

w = (原图片h行 + 填充p行 -k + 1)
h = (原图片w列 + 填充p列 -k + 1)

相当于输出的高度和宽度直接增加p行和p列

4.应用:使输入和输出具有相同的形状

设置

 p_w = k_w - 1
 p_h = k_h - 1

5.补充:为什么卷积核需要设置成奇数?

如果需要输入输出具有相同形状,那么一般设置卷积核奇数,这样填充的w和h将会是偶数,就可以让顶部和底部填充相同的行,左侧右侧填充相同的列

6.代码

import torch
from torch import nn

def comp_conv2d(conv2d,X):
    # 输入X的shape为(8,8),输出为(1,1,8,8),1,1表示批量大小和通道数
    X = X.reshape((1,1) + X.shape)
    Y = conv2d(X)
    return Y
    
#随机生成一个8*8的X
X = torch.rand(size=(8,8))
# 1,1表示通道数和维度
conv2d = nn.Conv2d(1,1,kernel_size=3,padding=1)
comp_conv2d(conv2d,X).shape

输出结果:torch.Size([1, 1, 8, 8])

二.步幅

1.是什么

卷积窗口每次滑动元素的数量,也叫步长

2.例子

垂直步幅为3,水平步幅为2的卷积运算:

在这里插入图片描述

输出形状计算

w = (原图片行数 + 2 * 填充行数 - k )  / 水平步幅 + 1
h  = (原图片列数 +2 * 填充列数 - k )  / 垂直步幅 + 1

当没有填充时,步长大于1时

在学习Yolov5时,yolov5 backbone第二层的conv形状为[128,3,2](输出通道,卷积核,步长),没有Padding。
按公式得出:(320-3)/2 + 1 = 159.5,不是整数感觉有点奇怪。看了知乎得知,没有padding时的计算需要向上取整:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

computer_vision_chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值