当前位置:主页 > python教程 > F.conv2d pytorch卷积计算

F.conv2d pytorch卷积计算方式

发布:2023-03-31 15:40:01 59


给寻找编程代码教程的朋友们精选了相关的编程文章,网友庾子琪根据主题投稿了本篇教程内容,涉及到pytorch、F.conv2d、pytorch卷积计算、pytorch卷积、F.conv2d pytorch卷积计算相关内容,已被420网友关注,涉猎到的知识点内容可以在下方电子书获得。

F.conv2d pytorch卷积计算

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和nn.Conv2d

import torch
import torch.nn.functional as F
# 小括号里面有几个[]就代表是几维数据
input = torch.tensor([[1,2,0,3,1],
                      [0,1,2,3,1],
                      [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]])

kernel = torch.tensor([[1,2,1],
                       [0,1,0],
                       [2,1,0]])

input = torch.reshape(input,(1,1,5,5))
kernel = torch.reshape(kernel,(1,1,3,3))

# stride代表的是步长的意思,即每次卷积核向左或者向下移动多少步进行相乘
#  因为conv2d的input和weight对应的tensor是[batch,channel,h,w],所以上述才将它们进行reshape
output = F.conv2d(input,kernel,stride=1)
print(output)

output = F.conv2d(input,kernel,stride=2)
print(output)

# padding代表的是向上下左右填充的行列数,里面数字填写0
output3 = F.conv2d(input,kernel,stride=1,padding=1)
print(output3)
import torch
import torchvision
from torch.utils.data import DataLoader
from torch import nn
from torch.nn import Conv2d
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10('./torchvision_dataset', train=False, download=False,            transform=torchvision.transforms.ToTensor())

# 准备好数据集就放在dataloader中进行加载
dataloader = DataLoader(dataset, batch_size=64)


# 开始定义一个卷积类
class Zkl(nn.Module):
    def __init__(self):
        super(Zkl, self).__init__()
        self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)

    def forward(self,x):
        x = self.conv1(x)
        return x

writer = SummaryWriter("nn_conv2d")
zkl = Zkl()
# print(zkl)
step = 0
for data in dataloader:
    imgs,target = data
    output = zkl(imgs)
    #print(imgs.shape)
    #print(output.shape)
    writer.add_images('nn_conv2d_input',imgs,step)
    #因为输出是6个通道,tensorboard无法解析,所以需要reshape三个通道
    output = torch.reshape(output,(-1,3,30,30))
    writer.add_images('nn_conv2d_output',output,step)
    step+=1
writer.close()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持码农之家。


参考资料

相关文章

  • pytorch中关于backward的几个要点说明

    发布:2023-04-02

    这篇文章主要介绍了pytorch中关于backward的几个要点说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • pytorch实现模型剪枝的操作方法

    发布:2023-03-25

    PyTorch 提供了内置剪枝 API ,也支持了一些非结构化和结构化剪枝方法,但是 API 比较混乱,对应文档描述也不清晰,所以后面我还会结合微软的开源 nni 工具来实现模型剪枝功能,这篇文章主要介绍了pytorch实现模型剪枝, 需要的朋友可以参考下


  • pytorch转换矩阵的维数位置实例方法

    发布:2021-06-02

    今天小编就为大家分享一篇pytorch 转换矩阵的维数位置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧


  • pytorch-gpu安装的经验与教训

    发布:2023-03-05

    本文主要介绍了pytorch-gpu安装的经验与教训,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • PyTorch上搭建简单神经网络实现回归和分类的示例

    PyTorch上搭建简单神经网络实现回归和分类的示例

    发布:2022-06-17

    给网友朋友们带来一篇关于PyTorch的教程,本篇文章主要介绍了PyTorch上搭建简单神经网络实现回归和分类的示例,现在分享给大家,也给大家做个参考。一起过来看看吧


  • Pytorch中的数据转换Transforms与DataLoader方式

    发布:2023-04-23

    这篇文章主要介绍了Pytorch中的数据转换Transforms与DataLoader方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • Pytorch基础之torch.randperm的使用

    发布:2023-04-22

    这篇文章主要介绍了Pytorch基础之torch.randperm的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • pytorch/transformers 最后一层不加激活函数的原因分析

    发布:2023-03-02

    这里给大家解释一下为什么bert模型最后都不加激活函数,是因为损失函数选择的原因,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧


网友讨论