Pytorch下的卷积和池化

Pytorch中卷积Conv2d和池化MaxPool2d介绍及代码

1、卷积层

1.1、卷积机制:

假设有一个5×5的图像,使用一个3×3的卷积核进行卷积,步长(stride)为1,得到一个3×3的结果,如下所示:
在这里插入图片描述
计算过程:
在这里插入图片描述
当步长为2时,计算如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到,步长改变时输出的结果也会改变。输入图像、卷积核、步长的关系如下:

W o u t = ( W i n − F w + 2 P ) / S w + 1 W_{out}=(W_{in}-F_{w}+2P)/S_{w}+1 Wout=(WinFw+2P)/Sw+1
H o u t = ( H i n − F h + 2 P ) / S h + 1 H_{out}=(H_{in}-F_{h}+2P)/S_{h}+1 Hout=(HinFh+2P)/Sh+1

式中:
W i n 、 H i n W_{in}、H_{in} WinHin为输入图像的宽、高;
W o u t 、 H o u t W_{out}、H_{out} WoutHout为输出图像的宽、高;
F w 、 F h F_{w}、F_{h} FwFh为卷积核的宽、高,可以相等也可以不等;
S w 、 S h S_{w}、S_{h} SwSh为步长的大小, S w S_{w} Sw为左右移动步长, S h S_{h} Sh为上下移动步长,可以相等也可以不等;
P P P是Zero Padding,指在输入图像周围补几圈0,如果P=1,就补1圈0。

1.2、Conv2d

卷积在 pytorch 中有两种方式,一种是 torch.nn.Conv2d(),一种是torch.nn.functional.conv2d()
1、torch.nn.Conv2d(类式接口)

class torch.nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True))

参数:
in_channels – 输入数据的通道数,例RGB图片通道数为3;
out_channels – 输出数据的通道数,这个根据模型调整;
kennel_size – 卷积核大小,可以是int,kennel_size=2,意味着卷积大小(2,2);也可以是tuple,kennel_size=(2,3),意味着卷积大小(2,3),即非正方形卷积;
stride – 步长,默认为1,与kennel_size类似,stride=2,意味着步长上下左右扫描皆为2, stride=(2,3),左右扫描步长为2,上下为3;
padding – 零填充

输入要求:
(batch, channel, H, W),其中 batch 表示输入的一批数据的数目,channel是输入的通道数,H 和 W 表示输入图片的高度和宽度。

例:

import torch
import torch.nn as nn

"""定义输入样本"""
x = torch.randn(10, 16, 30, 32) # 10组数据, 16通道 , 高30 , 宽32

"""定义卷积"""
conv = nn.Conv2d(16, 33, (3, 2), (2,1)) #in_channel,out_channel,kennel_size,stride

y = conv(x)
print(y.shape) #torch.Size([10, 33, 14, 31])

计算过程:
h = (30 - 3 + 2 × 0)/2 +1 = 14
w = (32 - 2 + 2 × 0)/1 +1 = 31

2、torch.nn.functional.conv2d(函数式接口)
Pytorch里一般小写的都是函数式的接口,相应的大写的是类式接口。如果不需要做特别复杂的配置只要用类式接口就够了。

torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

参数:
input – 输入的张量 (minibatch x in_channels x iH x iW)
weight – 过滤器 (out_channels, in_channels/groups, kH, kW)
bias – 偏置。默认值:None
stride – 卷积核的步长,可以是单个数字或元组(sh x sw)。默认值:1
padding – 输入上的隐含零填充。可以是单个数字或元组。默认值:0

例:

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
print(out.shape) #torch.Size([1, 16, 26, 26])

out = F.conv2d(x, w, b, stride=2, padding=2)  # 步长为2,外加2圈padding
print(out.shape) #torch.Size([1, 16, 14, 14])

nn.Conv2d是2D卷积层,而F.conv2d是2D卷积操作,所以使用后者需要再额外去定义一个 weight,而使用 nn.Conv2d() 则会帮我们默认定义一个随机初始化的 weight

"""定义wight"""
sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32')  
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3))  # 适配卷积的输入输出

w = torch.from_numpy(sobel_kernel) #F.conv2d
conv.weight.data = torch.from_numpy(sobel_kernel) #nn.Conv2d

2、池化层

2.1、池化机制

池化层(Pooling)主要的作用是下采样,通过去掉不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。Max Pooling实际上就是在n*n的样本中取最大值,作为采样后的样本值。
在这里插入图片描述

2.2、MaxPool2d

在 Pytorch 中最大值池化的方式也有两种,一种是 nn.MaxPool2d(),一种是 torch.nn.functional.max_pool2d(),他们对于图片的输入要求跟卷积对于图片的输入要求是一样的。

class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

参数:
kernel_size(int or tuple) - max pooling的窗口大小,
stride(int or tuple, optional) - max pooling的窗口移动的步长。默认值是kernel_size
padding(int or tuple, optional) - 输入的每一条边补充0的层数

例:

"""定义输入样本"""
a = torch.randn(3,5,10) #3通道,5H,10W
"""定义池化层"""
b = nn.Maxpool2d((5,1))  # kernel = 5*1,stride默认

c = b(a)
print(c.shape) #torch.size([3,1,10])
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值