pytorch中的Tensor通道排列顺序是:[batch, channel, height, width]

我们常用的卷积(Conv2d)在pytorch中对应的函数是:

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')

其中:

  • in_channels参数代表输入特征矩阵的深度即channel,比如输入一张RGB彩色图像,那in_channels=3
  • out_channels参数代表卷积核的个数,使用n个卷积核输出的特征矩阵深度即channel就是n
  • kernel_size参数代表卷积核的尺寸,输入可以是int类型如3代表卷积核的height=width=3,也可以是tuple类型如(3, 5)代表卷积核的height=3,width=5
  • stride参数代表卷积核的步距默认为1,和kernel_size一样输入可以是int类型,也可以是tuple类型
  • padding参数代表在输入特征矩阵四周补零的情况默认为0,同样输入可以为int型如1代表上下方向各补一行0元素,左右方向各补一列0像素(即补一圈0),如果输入为tuple型如(2, 1)代表在上方补两行下方补一行,左边补两列,右边补一列。
  • bias参数表示是否使用偏置默认使用
  • dilation、groups是高阶用法这里不做讲解,如有需要可以参看官方文档

在卷积操作过程中,我们知道矩阵经卷积操作后的尺寸由以下几个因数决定:

  • 输入图片大小 W×W
  • Filter大小 F×F
  • 步长 S
  • padding的像素数 P

经卷积后的矩阵尺寸大小计算公式为:N=(W−F+2P)/S+1N=(W-F+2 P) / S+1N=(W−F+2P)/S+1

但在实际应用中,有时会出现N为非整数的情况(例如在alexnet,googlenet网络的第一层输出),再例如输入的矩阵 H=W=5,卷积核的F=2,S=2,Padding=1。经计算我们得到的N =(5 - 2 + 21)/ 2 +1 = 3.5 此时在Pytorch中是如何处理呢,先直接告诉你结论:在卷积过程中会直接将最后一行以及最后一列给忽略掉,以保证N为整数,此时N = (5 - 2 + 21 - 1)/ 2 + 1 = 3,接下来我们来看个简单的实例:

  • (1)首先使用torch中的随机函数生成一个batch_size为1,channel为1,高和宽都等于5的矩阵
  • (2)接着我们定义一个卷积核,input_size=1, output_size=1, kernel_size=2, stride=2,padding=1
  • (3)然后我们使用该卷积核对我们生成的随机矩阵进行卷积操作
  • (4)打印各参数的数值
import torch.nn as nn
import torchim = torch.randn(1, 1, 5, 5)
c = nn.Conv2d(1, 1, kernel_size=2, stride=2, padding=1)
output = c(im)print(im)
print(output)
print(list(c.parameters()))

通过计算我们知道输出矩阵尺寸应该为N=(5−2+2∗1)/2+1=3.5N=\left(5-2+2^{*} 1\right) / 2+1=3.5N=(5−2+2∗1)/2+1=3.5
但实际的打印信息如下:
通过分析,我们可以知道真正的输出矩阵尺寸是3x3,那内部具体是如何操作的呢,

(1)首先进行padding的填充,size:7 x 7

[0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000],
[0.0000,  0.3633,  1.1750, -0.1432, -0.9463,  1.0776,  0.0000],
[0.0000, -1.1750,  0.0361,  0.6624, -0.4544,  0.6980,  0.0000],
[0.0000, -0.8161, -1.2988, -0.0263,  1.7814,  0.4467,  0.0000],
[0.0000,  0.7315,  0.2855, -0.4346,  0.3127, -0.7801,  0.0000],
[0.0000, -0.7387,  1.4969, -1.1641, -0.1837, -0.3165,  0.0000],
[0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000]

(2)通过计算发现输出为非整数,为了得到整数,将最后一行以及最后一列删除掉,size:6 x 6

[0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000],
[0.0000,  0.3633,  1.1750, -0.1432, -0.9463,  1.0776],
[0.0000, -1.1750,  0.0361,  0.6624, -0.4544,  0.6980],
[0.0000, -0.8161, -1.2988, -0.0263,  1.7814,  0.4467],
[0.0000,  0.7315,  0.2855, -0.4346,  0.3127, -0.7801],
[0.0000, -0.7387,  1.4969, -1.1641, -0.1837, -0.3165]

(3)接着使用卷积核进行卷积操作,就能得到我们的输出矩阵,需要注意的是pytorch中的卷积默认是带有bias的,所以计算卷积后需要加上bias偏量。例如输出的第一个值的计算过程如下:\

[0.0000,  0.0000],        [-0.0114,  -0.3502],卷积                        加上  [-0.1196]
[0.0000,  0.3633]         [-0.1244, 0.4637]# 即
(0*(-0.0114)+ 0*(-0.3502)+ 0*(-0.1244)+(0.3633)*(0.4637))+(-0.1196)= 0.0489

我们的计算结果与pytorch的输出相同,我们只计算了其中一个值,其他的值也一样:

tensor([[[[ 0.0489, -0.3322,  0.4978],[-0.0865, -0.2026, -0.3733],[-0.7183, -0.6966,  0.0262]]]], grad_fn=<ThnnConv2DBackward>)

通过我们的实验可以发现,在pytorch的卷积过程中,当通过N=(W−F+2P)/S+1N=(W-F+2 P) / S+1N=(W−F+2P)/S+1计算式得到的输出尺寸非整数时,会通过删除多余的行和列来保证卷积的输出尺寸为整数。

pytorch对卷积神经网络常见操作相关推荐

  1. 用PyTorch搭建卷积神经网络

    用PyTorch搭建卷积神经网络 本篇是加拿大McGill本科,Waterloo硕士林羿实习时所作的工作.发文共享,主要是面对PyTorch的初学者. 本篇文章是一篇基础向的PyTorch教程,适合有 ...

  2. Pytorch实现卷积神经网络(回归问题)

    Pytorch实现卷积神经网络(回归问题) 前言 一.Pytorch 二.卷积神经网络 1.CNN结构 2.实现一个卷积神经网络类--代码 总结 前言 深度学习当前的热度虽然没有前两年那么火热,尤其是 ...

  3. Educoder 机器学习 神经网络 第四关:使用pytorch搭建卷积神经网络识别手写数字

    任务描述 相关知识 卷积神经网络 为什么使用卷积神经网络 卷积 池化 全连接网络 卷积神经网络大致结构 pytorch构建卷积神经网络项目流程 数据集介绍与加载数据 构建模型 训练模型 保存模型 加载 ...

  4. 【PyTorch】卷积神经网络

    卷积神经网络 卷积神经网络最初是为了解决计算机视觉的相关问题设计的,现在其不仅被应用在图像和视频领域,也可用于诸如音频信号的时间序列信号的处理之中. 本文主要着重于卷积神经网络的基本原理和使用PyTo ...

  5. Pytorch 深度卷积神经网络 AlexNet

    Pytorch 深度卷积神经网络 AlexNet 0. 环境介绍 环境使用 Kaggle 里免费建立的 Notebook 教程使用李沐老师的 动手学深度学习 网站和 视频讲解 小技巧:当遇到函数看不懂 ...

  6. 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(一)

    [深度学习]基于Pytorch的卷积神经网络API妙用(一) 文章目录 1 不变性 2 卷积的数学分析 3 通道 4 互相关运算 5 图像中目标的边缘检测 6 基于Pytorch的卷积核 7 特征映射 ...

  7. 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(二)

    [深度学习]基于Pytorch的卷积神经网络API妙用(二) 文章目录1 Padding和Stride 2 多输入多输出Channel 3 1*1 Conv(笔者在看教程时,理解为降维和升维) 4 池 ...

  8. pytorch卷积神经网络_知识干货-动手学深度学习(pytorch)-06 卷积神经网络基础

    卷积神经网络基础 本节我们介绍卷积神经网络的基础概念,主要是卷积层和池化层,并解释填充.步幅.输入通道和输出通道的含义. 二维卷积层 本节介绍的是最常见的二维卷积层,常用于处理图像数据. 二维互相关运 ...

  9. 卷积神经网络常见模块

    深度学习常见模型子模块 常见模块 1.卷积 1.1 2D卷积(单通道和多通道) 1.2 1x1 卷积 1.3 转置卷积(反卷积 Transposed convolution) 1.4 分组卷积(Gro ...

最新文章

  1. 安装tensorflow-gpu==1.13.1成功案例
  2. window python输入路径问题--转义字符
  3. java微信公众号开发token验证失败的问题及解决办法
  4. 织梦后台添加友链,前台不显示|修改友情链接的显示行数
  5. PAT甲级1125 Chain the Ropes:[C++题解]贪心、优先队列、合并果子
  6. 再破纪录!ECCV 2020 旷视研究院15篇成果总览
  7. mysql 存储过程调用权限消失的问题,恢复权限
  8. Flex与Javascript交互
  9. epplus word html,EPPlus简介
  10. 现代分类方法在医学诊断中的应用——基于R的实现
  11. Sudoku Solver
  12. sap 服务采购订单研究
  13. bias tee电路设计-电容电感值
  14. 2021几款好用的思维导图软件推荐!
  15. android eclipse ddms 查看线程,android ddms中查看线程释疑
  16. excel查找在哪里_数据分析,如何学好Excel
  17. 超级课程表查成绩显示服务器错误,超级课程表怎么查询期末成绩
  18. Base64编码理解
  19. 鸿蒙操作系统详细流程,鸿蒙系统的启动流程
  20. 大屏h5互动小程序游戏又出圈啦 鱿鱼游戏跳一跳玩出了新高度

热门文章

  1. 计算机编程嘉兴,嘉兴自学电脑编程一对一
  2. json转python_将“true”(JSON)转换为Python等效的“True”
  3. js用函数实现输出100以内与7有关的数_走近(javascript, 函数式)
  4. 给自己的网站添加复制提示代码
  5. angular2创建应用_如何在Angular 2+应用程序中使用JavaScript库
  6. 适合初学者的安卓开源项目_开源世界中初学者的颠簸之旅
  7. 远程桌面连接一个域网的计算机,怎样远程控制局域网的另一台电脑(远程桌面)win10...
  8. android项目实战博学谷源码_阿里爆款SpringBoot项目实战PDF+源码+视频分享
  9. gitee自动部署的使用
  10. 双向链表的常用基本操作