Pytorch系列:(五)CNN
卷积
Conv2d
2D卷积函数和参数如下
nn.Conv2d(
in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
dilation=1,
groups=1,
bias=True,
padding_mode='zeros'
)
参数说明:
in_channels: 输入通道数,RGB图片一般是3
out_channels: 输出通道,也可以理解为kernel的数量
kernel_size:kernel的和宽设置
kernel 输出尺寸计算:
\(\lfloor(n_h -k_h+p_h)/s_h+1\rfloor *\lfloor(n_w -k_w+p_w)/s_w+1\rfloor\)
stride:kernel移动的步伐
padding:在四周加入padding的数量,默认补0
dilation:
空洞就是计算的时候,对输入层进行挖空操作,如下图所示(图片来源于网络)

group:
分组计算,输出的feature map数量还是一样,只不过,每一个输出feature map 并不是用所有的输入feature map 计算的,而是分组计算,这样可以并行化并且减少计算成本

假设输入为12个feature map , 输出为6个通道,常规卷积Conv参数\(6*12*k^2\),但是假设goup=3,那么参数为 3个 \(2*4*k^2\),这是因为计算的时候,输入的feature map 和 计算的kernel 都要分成3组(如下图所示,图片来源网络)。

bias: 如果bias=True,添加偏置
Conv1d
一维卷积的特点是,卷积核有一个维度和特征的维度是保持一致的,卷积核的另外一个维度是作用在sequenc length上面。
Conv1d(
in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
dilation=1,
groups=1,
bias=True
)
in_channels: – 输入信号的通道。即为词向量的维度。2维RGB图像卷积中,为3, 一般用在序列模型中,例如一句话中的单词表征为300,那么输入就设置为300
out_channels: 输出多少个channel
kernel_size:设置卷积尺寸,其中一个维度为in_channels,所以实际上卷积大小为kernel_size*in_channels
stride:卷积步长,作用在sequence len上面
padding:在序列两边补0
dilation:卷积核元素之间的间距,同上面conv2d
groups: 同上面conv2d
bias: 如果bias=True,添加偏置
尺寸计算方法
假设输入尺寸为 (batch, sequence len, feature_len) 需要将维度转换为( batch , feature_len, sequence len),卷积核的尺寸为(feature_len, kernel_size) , 输出为( batch, kernel_size, Lout) ,其中Lout的计算方法如下:
\(L_{out} = \lfloor(feature\_len -k_h+p_h)/s_h+1\rfloor\)
转置卷积
反卷积(转置卷积)和正常卷积相反,具有尺寸扩张作用,也可以理解为带参数学习的上采样功能,主要可以用到GAN中的。
转置卷积的操作如下图所示:
相当于将被卷积的2*2 feature map进行padding,之后再做卷积操作。
设卷积核大小为k*k,输入为方形矩阵
对输入进行四边补零,单边补零的数量为k-1
将卷积核旋转180°,在新的输入上进行直接卷积 (上下翻转,左右翻转)


在pytorch中转置卷积函数如下,其中参数和传统卷积基本一致
nn.ConvTranspose2d(
in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
output_padding=0,
groups=1,
bias=True,
dilation=1,
padding_mode='zeros'
)
尺寸计算方法
简化版
\(out = (in\_{channel}-1) * stride + kernel\_size\)
完整版
\(out = (in\_{channel}-1) * stride -2*padding_size + dilation * (kernel\_size-1)+output\_padding +1\)
推荐一个细致讲解转置卷积的帖子:https://blog.csdn.net/tsyccnh/article/details/87357447
池化函数
nn.MaxPool2d
nn.MaxPool2d(
kernel_size,
stride=None,
padding=0,
dilation=1,
return_indices=False,
ceil_mode=False
)
其中,
return_indices: 可以返回池化的位置,主要用于自编码其中池化上采样(最大池化)
ceil_mode: 表示尺寸向上取整,主要用于kernel_size无法被长宽整除的时候。
其他参数和上述卷积参数含义一样。
主要功能是进行特征缩减,同时保留最大信息,2*2的MaxPoold执行操作如下图所示(来源于cs231n )

pytorch中的pooling函数,默认kernel size和stride是一样的
pool2d = nn.MaxPool2d(3) # 这里省略stride设置 pool2d(X)
# 也可以手动设置更详细的:
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
nn.AvgPool2d
nn.AvgPool2d(
kernel_size,
stride=None,
padding=0,
ceil_mode=False,
count_include_pad=True,
divisor_override=None
)
其中:
count_include_pad:求平均值的时候,是否考虑将padding加入计算,divisor_override:可以设置分母,例如2*2均值就是除以4,但是我们可以设置其他值
其他参数和上述nn.MaxPool2d含义一样
主要操作和nn.MaxPool2d一样,不同的是,这里做的是求平均操作。
nn.MaxUnpool2d
反池化操作,就是池化的反向操作,具体如下图所示(图片来源网络):

nn.MaxUnpool2d(
kernel_size,
stride=None,
padding=0
)
一个例子,首先使用MaxPool2d采样,然后保留采样位置,最后使用采样位置indices来进行反池化操作。
img = torch.randn((28,28))
max_pool_l = nn.MaxPool2d((2,2),stride=(2,2),return_indices=True)
img_pool,indices = max_pool_l(img)
maxUpPool_l = nn.MaxUnpooled((2,2),stride=(2,2))
img_Up = maxUpPool_l(input_i , indices)
Pytorch系列:(五)CNN的更多相关文章
- CSS 魔法系列:纯 CSS 绘制各种图形《系列五》
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
- Netty4.x中文教程系列(五)编解码器Codec
Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就 ...
- WCF编程系列(五)元数据
WCF编程系列(五)元数据 示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...
- JVM系列五:JVM监测&工具
JVM系列五:JVM监测&工具[整理中] http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...
- SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型
原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...
- VSTO之旅系列(五):创建Outlook解决方案
原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案 ...
- 系列五AnkhSvn
原文:系列五AnkhSvn AnkhSvn介绍 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交.而且该插件属于开 ...
- java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析
java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java ...
- java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别
java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 目录 java基础解析系列(一)---String.StringBuffer.St ...
- Pytorch系列教程
介绍 不久前Pytorch发布了1.0版本,官网的doc页也更新了.这里说下官网的教程很实用,边学pytorch搭网络边学NLP-图像等领域的先进技术. 官网的教程都是英文的,本人就用这个系列博客做个 ...
随机推荐
- A Color Game
题目大意: 给定一个只包含七种字母的字符串,如果满足一段连续相同的字符长度大于等于K那么即可消除,问最后能不能变为空字符. 题解:很明显是用区间dp来解决,我们设dp[l][r][k]代表的是在[l ...
- Hdu 4821 (字符串hash+map)
题目链接https://vjudge.net/problem/HDU-4821 题意:给定字符串S ,询问用几个子串满足 : 1.长度为n*len . 2. n个子串都不相同. 题解:倒序hash将 ...
- 记录Java注解在JavaWeb中的一个应用实例
概述 在学习注解的时候,学了个懵懵懂懂.学了JavaWeb之后,在做Demo项目的过程中,借助注解和反射实现了对页面按钮的权限控制,对于注解才算咂摸出了点味儿来. 需求 以"角色列表&quo ...
- PTA 中序输出叶子结点
6-8 中序输出叶子结点 (10 分) 本题要求实现一个函数,按照中序遍历的顺序输出给定二叉树的叶结点. 函数接口定义: void InorderPrintLeaves( BiTree T); T ...
- Java进阶专题(二十六) 将近2万字的Dubbo原理解析,彻底搞懂dubbo
前言 前面我们研究了RPC的原理,市面上有很多基于RPC思想实现的框架,比如有Dubbo.今天就从Dubbo的SPI机制.服务注册与发现源码及网络通信过程去深入剖析下Dubbo. Dubbo架构 ...
- 京东 vue3 组件库震撼升级,如约而至!
京东零售开源项目 NutUI 是一套京东风格的轻量级移动端 Vue 组件库,是开发和服务于移动 Web 界面的企业级产品.经过长时间的开发与打磨,NutUI 3.0 终于和大家见面了!3.0 版本在技 ...
- java例题 判断一个数能被几个9整除
有点懵,被几个9整除,我理解的是n=n/9能整除几次,代码如下: 1 /*45 [程序 45 被 9 整除] 2 题目:判断一个数能被几个 9 整除 3 */ 4 5 /*分析 6 * 1.用whil ...
- 计划任务统一集中管理系统cronsun(替代crontab)
一.背景 crontab 是 Linux 系统里面最简单易用的定时任务管理工具,相信绝大多数开发和运维都用到过,很多业务系统的定时任务都是通过 crontab 来定义的,时间长了后会发现存在很多问题: ...
- 盘点 Django 展示可视化图表的多种方式(建议收藏)
1. 前言 大家好,我是安果! 使用 Django 进行 Web 开发时,经常有需要展示图表的需求,以此来丰富网页的数据展示 常见方案包含:Highcharts.Matplotlib.Echarts. ...
- openGL常见函数意义
最近在课程上在学习计算机图像,对于突然冒出来的好多glut库里的函数感觉很难招架.把示例代码一行行百度下来,总算是差不多理解了大概的意思,在这里分享一下绘制图像需要的基础的函数. 1. 配置环境 对于 ...