F.conv2d pytorch卷积计算

Pytorch里一般小写的都是函数式的接口,相应的大写的是类式接口。函数式的更加low-level一些,如果不需要做特别复杂的配置只需要用类式接口就够了。

可以这样理解:nn.Conved是2D卷积层,而F.conv2d是2D卷积操作。

import torch
from torch.nn import functional as F

"""手动定义卷积核(weight)和偏置"""
w = torch.rand(16, 3, 5, 5)  # 16种3通道的5乘5卷积核
b = torch.rand(16)  # 和卷积核种类数保持一致(不同通道共用一个bias)

"""定义输入样本"""
x = torch.randn(1, 3, 28, 28)  # 1张3通道的28乘28的图像

"""2D卷积得到输出"""
out = F.conv2d(x, w, b, stride=1, padding=1)  # 步长为1,外加1圈padding,即上下左右各补了1圈的0,
print(out.shape)

out = F.conv2d(x, w, b, stride=2, padding=2)  # 步长为2,外加2圈padding
print(out.shape)
out = F.conv2d(x, w)  # 步长为1,默认不padding, 不够的舍弃,所以对于28*28的图片来说,算完之后变成了24*24
print(out.shape)

在DSSINet发现又用到了空洞卷积dilated convolution

mu1 = F.conv2d(img1, window , padding=padd, dilation=dilation, groups=channel)

Dilated/Atrous convolution或者是convolution with holes从字面上就很好理解,是在标准的convolution map里注入空洞,以此来增加感受野reception field。相比原来的正常卷积,空洞卷积多了一个超参数dilation rate,指的是kernel的间隔数量(正常的卷积是dilation rate=1)

正常图像的卷积为

空洞卷积为

现在我们再来看下卷积本身,并了解他背后的设计直觉,以下主要探讨空洞卷积在语义分割(semantic segmentation)的应用。

卷积的主要问题

1、up-sampling/pooling layer(e.g. bilinear interpolation) is deterministic(not learnable)

2、内部数据结构丢失,空间层级化信息丢失。

3、小物体信息无法重建(假设有4个pooling layer,则任何小于2^4=16 pixel的物体信息将理论上无法重建)

在这样问题的存在下,语义分割问题一直处于瓶颈期无法再明显提高精度,而dilated convolution 的设计就良好的避免了这些问题。

对于dilated convolution,我们已经可以发现他的优点,即内部数据结构的保留和避免使用down_sampling这样的特性。但是完全基于dilated convolution的结构如何设计则是一个新的问题。

pytorch中空洞卷积分为两类,一类是正常图像的卷积,另一类是池化时候。

空洞卷积的目的是为了在扩大感受野的同时,不降低图片分辨率和不引入额外参数及计算量(一般在CNN中扩大感受野都需要使用S》1的conv或者pooling,导致分辨率降低,不利于segmentation,如果使用大卷积核,确实可以达到增大感受野,但是会引入额外的参数及计算量)。

 

你可能感兴趣的:(F.conv2d pytorch卷积计算)