pytorch对卷积神经网络常见操作
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对卷积神经网络常见操作相关推荐
- 用PyTorch搭建卷积神经网络
用PyTorch搭建卷积神经网络 本篇是加拿大McGill本科,Waterloo硕士林羿实习时所作的工作.发文共享,主要是面对PyTorch的初学者. 本篇文章是一篇基础向的PyTorch教程,适合有 ...
- Pytorch实现卷积神经网络(回归问题)
Pytorch实现卷积神经网络(回归问题) 前言 一.Pytorch 二.卷积神经网络 1.CNN结构 2.实现一个卷积神经网络类--代码 总结 前言 深度学习当前的热度虽然没有前两年那么火热,尤其是 ...
- Educoder 机器学习 神经网络 第四关:使用pytorch搭建卷积神经网络识别手写数字
任务描述 相关知识 卷积神经网络 为什么使用卷积神经网络 卷积 池化 全连接网络 卷积神经网络大致结构 pytorch构建卷积神经网络项目流程 数据集介绍与加载数据 构建模型 训练模型 保存模型 加载 ...
- 【PyTorch】卷积神经网络
卷积神经网络 卷积神经网络最初是为了解决计算机视觉的相关问题设计的,现在其不仅被应用在图像和视频领域,也可用于诸如音频信号的时间序列信号的处理之中. 本文主要着重于卷积神经网络的基本原理和使用PyTo ...
- Pytorch 深度卷积神经网络 AlexNet
Pytorch 深度卷积神经网络 AlexNet 0. 环境介绍 环境使用 Kaggle 里免费建立的 Notebook 教程使用李沐老师的 动手学深度学习 网站和 视频讲解 小技巧:当遇到函数看不懂 ...
- 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(一)
[深度学习]基于Pytorch的卷积神经网络API妙用(一) 文章目录 1 不变性 2 卷积的数学分析 3 通道 4 互相关运算 5 图像中目标的边缘检测 6 基于Pytorch的卷积核 7 特征映射 ...
- 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(二)
[深度学习]基于Pytorch的卷积神经网络API妙用(二) 文章目录1 Padding和Stride 2 多输入多输出Channel 3 1*1 Conv(笔者在看教程时,理解为降维和升维) 4 池 ...
- pytorch卷积神经网络_知识干货-动手学深度学习(pytorch)-06 卷积神经网络基础
卷积神经网络基础 本节我们介绍卷积神经网络的基础概念,主要是卷积层和池化层,并解释填充.步幅.输入通道和输出通道的含义. 二维卷积层 本节介绍的是最常见的二维卷积层,常用于处理图像数据. 二维互相关运 ...
- 卷积神经网络常见模块
深度学习常见模型子模块 常见模块 1.卷积 1.1 2D卷积(单通道和多通道) 1.2 1x1 卷积 1.3 转置卷积(反卷积 Transposed convolution) 1.4 分组卷积(Gro ...
最新文章
- 安装tensorflow-gpu==1.13.1成功案例
- window python输入路径问题--转义字符
- java微信公众号开发token验证失败的问题及解决办法
- 织梦后台添加友链,前台不显示|修改友情链接的显示行数
- PAT甲级1125 Chain the Ropes:[C++题解]贪心、优先队列、合并果子
- 再破纪录!ECCV 2020 旷视研究院15篇成果总览
- mysql 存储过程调用权限消失的问题,恢复权限
- Flex与Javascript交互
- epplus word html,EPPlus简介
- 现代分类方法在医学诊断中的应用——基于R的实现
- Sudoku Solver
- sap 服务采购订单研究
- bias tee电路设计-电容电感值
- 2021几款好用的思维导图软件推荐!
- android eclipse ddms 查看线程,android ddms中查看线程释疑
- excel查找在哪里_数据分析,如何学好Excel
- 超级课程表查成绩显示服务器错误,超级课程表怎么查询期末成绩
- Base64编码理解
- 鸿蒙操作系统详细流程,鸿蒙系统的启动流程
- 大屏h5互动小程序游戏又出圈啦 鱿鱼游戏跳一跳玩出了新高度
热门文章
- 计算机编程嘉兴,嘉兴自学电脑编程一对一
- json转python_将“true”(JSON)转换为Python等效的“True”
- js用函数实现输出100以内与7有关的数_走近(javascript, 函数式)
- 给自己的网站添加复制提示代码
- angular2创建应用_如何在Angular 2+应用程序中使用JavaScript库
- 适合初学者的安卓开源项目_开源世界中初学者的颠簸之旅
- 远程桌面连接一个域网的计算机,怎样远程控制局域网的另一台电脑(远程桌面)win10...
- android项目实战博学谷源码_阿里爆款SpringBoot项目实战PDF+源码+视频分享
- gitee自动部署的使用
- 双向链表的常用基本操作