PyTorch Week 3——卷积

系列文章目录

PyTorch Week 3——nn.Module的容器:Sequential、ModuleList、ModuleDice
PyTorch Week 3——模型创建

PyTorch Week 2——Dataloader与Dataset

PyTorch Week 1


前言

卷积层是我在自己项目中经常用到的操作,尤其是2d卷积。
卷积操作:卷积核在特征图上滑动,卷积核与特征图上对应位置相乘再求和。
卷积核的参数在TensorFlow中通常为(上一特征层的层数×卷积核的宽度w×卷积核的高度h×卷积核的数量),另外还有stride步长和padding填充来决定特征图的尺寸。

一、1d、2d、3d卷积

卷积的维度取决于卷积核滑动的方向,2d卷积核在平面上滑动,3d卷积核在空间中滑动
1d、2d、3d卷积和对应的卷积核

二、pytorch中的nn.Conv2d()

1.参数

代码如下(示例):

nn.Conv2d(in_channels,
		  out_channels,#卷积核的个数,等于输出的通道数
		  kernel_size,
		  stride=1,
		  padding=0,
		  dilation=1,空洞卷积大小
		  groups=1,分组卷积设置,参考AlexNet特征提取器的结构
		  bias=True,
		  padding_model='zeros'

输出特征图的尺寸计算:
输出特征图的尺寸
输出特征图的尺寸 = (输入特征图的尺寸-卷积核的尺寸)/ 步长 + 1
若有padding, 输出特征图的尺寸=(输入特征图的尺寸+2padding - 卷积核的尺寸)/步长 + 1
若有padding和空洞卷积,输出特征图的尺寸 =(输入特征图的尺寸+2
padding - 空洞率*(卷积核的尺寸-1))/ 步长 + 1
带有padding和空洞卷积的尺寸计算公式

2.代码解读

代码如下(示例):

path_img = os.path.join(os.path.dirname(os.path.abspath(__file__)), "lena.png")#文件绝对路径=当前文件路径//文件名
img = Image.open(path_img).convert('RGB')  # 使用Image.open打开图片,并转换为BGR三通道,值域为0~255

# convert to tensor
img_transform = transforms.Compose([transforms.ToTensor()])#定义transform,以Compose包装ToTensor,功能为转为张量
img_tensor = img_transform(img)#调用transform
img_tensor.unsqueeze_(dim=0)  #扩张维度,增加batchsize层

conv_layer = nn.Conv2d(3, 1, 3)   # 定义2d卷积层,input:(i, o, size),i=3,指输入的图片通道数为3,o=1,指卷积核的数量为1或者说输出的特征图数量/通道数为1,size=3,指卷积核的尺寸为3,则卷积核的参数权重weights:(o, i , h, w),是(1,3,3,3),即1个3层的3×3卷积核
nn.init.xavier_normal_(conv_layer.weight.data)#初始化卷积层的weight,初始化方式为xarier_normal

# calculation
img_conv = conv_layer(img_tensor)#将图片的tensor输入conv_layer,计算得到img_conv,仍为img图片格式

img_conv
原图与img_conv

3、转置卷积

1、卷积的算法实现

参考im2col方法实现卷积算法,了解了卷积的算法实现。

简单来说就是将卷积在图像上滑动点乘的过程,通过分别展开图像的子集和子集对应的卷积核,转化成矩阵相乘的过程,具体算法实现这里mark一下,这里值得深扒总结。

转置卷积,卷积核的展开矩阵与正常卷积的展开矩阵在形状上是相互转置的关系。
正常卷积与转置卷积
转置卷积与卷积的参数一致
简单的输出尺寸的计算方法与卷积输出尺寸的计算是互逆的
完整的计算:
转置卷积输出尺寸的计算方法
卷积的输出尺寸 = (卷积的输入尺寸 - 1)× 步长 - 2 × padding + 空洞率 × (卷积核的尺寸 - 1)+ 输出padding + 1
好复杂!

2 代码解读

    conv_layer = nn.ConvTranspose2d(3, 1, 3, stride=2)   # input:(i, o, size)
    nn.init.xavier_normal_(conv_layer.weight.data)

    # calculation
    img_conv = conv_layer(img_tensor)

带stride的img_conv
在这里插入图片描述
可以看出,输入是512,卷积核是3,1,3,3,输出 = (512 - 1)× 2 + 3 = 1025,

三、转置卷积

总结

本文学习了2d卷积的概念,pytorch中的nn.Conv2d、nn.ConvTranspose2d参数及使用方法,mark了python实现卷积算法。
参考链接:
im2col方法实现卷积算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值