Pytorch系列之——nn网络层
卷积层
- 1d/2d/3d卷积
- 卷积-nn.Conv2d()
- 转置卷积-nn.ConvTranspose
1d/2d/3d Convolution
卷积运算:卷积核在输入信号(图像)上滑动,相应位置上进行乘加
卷积核:又称为滤波器,过滤器,可认为是某种模式,某种特征
卷积过程类似于用一个模板去图像上寻找与它相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取。
AlexNet卷积核可视化,发现卷积核学习到的是边缘、条纹、色彩这一些细节模式:
卷积维度:一般情况下,卷积核在几个维度上滑动,就是几维卷积。
上面的是1维卷积和2维卷积;
nn.Conv2d
功能:对多个二维信号进行二维卷积。
主要参数:
- in_channels:输入通道数
- out_channels:输出通道数,等价于卷积核个数
- kernel_size:卷积核尺寸
- stride:步长
- padding:填充个数
- dilation:空洞卷积大小(有空洞的卷积核,常用于图像分割任务,主要作用是提高感受野)
- groups:分组卷积设置
- bias:偏置
尺寸计算:
简化版:outsize=(Insize−kernelsize)stride+1out_{size}=\frac {(In_{size}-kernel_{size})} {stride}+1outsize=stride(Insize−kernelsize)+1
完整版:
接下来通过代码学习Conv2d的具体实现细节:
可以看到这里我们设置的随机种子是1,之后在nn.Conv2d中第一个3代表3个通道,第二个1代表使用1个卷积核,第三个3代表卷积核的尺寸我们设置为3 x 3。运行一下程序,可以得到下面的结果:
下面我们修改一下卷积核的权值,这里我们把随机种子改变一下即可改变这个随机权值:
我们将随机种子改为2,再来运行程序看下结果:
可以看到更改卷积核权重之后图像的差别还是蛮大的,头发部分响应值比较高而其他部分响应值则比较低。
下面分析一下卷积前后图像尺寸的变化:
可以看到,卷积前图像的尺寸是512 x 512的,这里的卷积核的设置是kernel_size为3的卷积核,且没有padding步长为1,所以这个卷积核的计算公式就是(input_size-kernel_size)/stride+1,也就是(512-3)/1+1=510。
前面说过conv2d也是一个Module,所以我们还是来看一下主要的modules和parameters这两个参数:
如上所述,parameters这个字典里存放了权重weight和偏差bias。
从weight这个属性里可以进一步看到,卷积核在这里存储的是一个4维张量,其中1表示输出通道数,3表示输入通道数,后面的两个3表示卷积核的尺寸为3 x 3,那么可能会有个疑问,一个3维的3x3的卷积核怎么去进行2维的卷积操作呢?
其实是这3个二维的卷积核分别会对应每一个通道进行卷积,比如第一个红色的卷积核只会在第一个通道上进行滑动卷积,最后得到一个数(这里是158)第二、三个卷积核也一样,都会各自得到一个输出值,之后再把这三个输出值相加最后再加上一个偏置,才会得到最终一个feature map特征图的一个像素值。原理就是这样不要被卷积核的维度所迷惑…
转置卷积
转置卷积又称为反卷积(Deconvolution)和部分跨越卷积(Fractionally-strided Convolution),用于对图像进行上采样(UpSample),在图像分割任务当中通常会使用。
假设图像尺寸为4x4,卷积核为3x3,padding=0,stride=1
正常卷积:
图像:I_16x1 卷积核:K_4x16 输出:O_4x1=K_4x16 * I_16x1
首先会将图像拉伸成一个向量的形式,也就是4x4的图像会拉成一个16x1的二维矩阵;卷积核会变成一个4x16的二维矩阵,为啥是16呢?这里是将卷积核的3x3这9个权值再进行补0得到这16个数,那么4嘞?4是最终输出特征图的总个数,可以通过计算得到,(4-3)/1+1=2 ,那么就代表输出特征图的尺寸是2x2的,所以总个数就是4,4就是这么来的。
那么转置卷积是怎么来的呢?
假设图像尺寸为2x2,卷积核为3x3,padding=0,stride=1
图像:I_4x1,卷积核:K_16x4 输出:O_16x1 = K_16x4 * I_4x1
这里还没太搞懂…卷积核的4是因为对卷积核权值总个数进行了剔除处理。但可以看到最终的输出和正常卷积的输出是一种转置关系,这也是转置卷积称为"转置卷积"的原因。
nn.ConvTranspose2d
功能:转置卷积实现上采样
主要参数:
- in_channels:输入通道数
- out_channels:输出通道数
- kernel_size:卷积核尺寸
- stride:步长
- padding:填充个数
- dilation:空洞卷积大小
- groups:分组卷积设置
- bias:偏置
尺寸计算:
简化版:outsize=(insize−1)∗stride+kernelsizeout_{size}=(in_{size}-1)*stride+kernel_{size}outsize=(insize−1)∗stride+kernelsize
完整版:
下面用代码实现来查看对图像使用转置卷积操作后的结果:
查看转置卷积前后的尺寸变化:
这里的步长为2,那么根据前面转置卷积尺寸的计算公式计算可得:(512-1)x 2+3=1025,即可得到转置卷积后的图像尺寸大小。
池化、线性、激活函数层
- 池化层——Pooling Layer
- 线性层——Linear Layer
- 激活函数层——Activation Layer
池化层
池化运算:对信号进行“收集”并“总结”,类似水池收集水资源,因而得名池化层。“收集”的意思就是将信号由多变少,“总结”就是某个区域的像素值取最大值或平均值。
从上面可以看到,原始图像的尺寸是4x4,我们用一个2x2的池化窗口对其进行最大池化操作,可见最终得到图像尺寸变小且每个像素值都是池化窗口作用于原图像的感受野的最大值,用一个像素值去表示4个像素值的过程这就是“总结”。
这张图左边的是最大池化操作,右边的是平均池化操作。平均池化当中是会对窗口当中的所有像素值进行求和然后除以像素值的个数求平均的过程。
nn.MaxPool2d
功能:对二维信号(图像)进行最大池化
主要参数:
- kernel_size:池化核尺寸
- stride:步长
- padding:填充个数
- dilation:池化核间隔大小
- ceil_mode:尺寸向上取整
- return_indices:记录池化像素索引(常用于最大值反池化中)
池化可以帮助我们对原图像进行冗余信息剔除,以及减少后面的计算量。
nn.AvgPool2d
功能:对二维信号(图像)进行平均池化
主要参数:
- kernel_size:池化核尺寸
- stride:步长
- padding:填充个数
- ceil_mode:尺寸向上取整
- count_include_pad:填充值用于计算
- divisor_override:除法因子
nn.MaxUnpool2d
功能:对二维信号(图像)进行最大值池化上采样(反池化)
主要参数:
- kernel_size:池化核尺寸
- stride:步长
- padding:填充个数
线性层
线性层又称为全连接层,其每个神经元与上一层所有神经元相连,实现对前一层的线性组合,线性变换:
每一层每一个神经元的输出都是前一层的输入乘以权重进行相加即可得到最终的输出结果,因此线性层的计算也可以通过矩阵乘法来实现。
nn.Linear
功能:对一维信号(向量)进行线性组合
主要参数:
- in_features:输入结点数
- out_features:输出结点数
- bias:是否需要偏置
计算公式:y=x∗WT+biasy= x*W^ {T} +bias y=x∗WT+bias
激活函数层
激活函数对特征进行非线性变换,赋予多层神经网络具有深度意义。
nn.Sigmoid
计算公式:y=11+e−xy = \frac {1} {1+e ^ {-x}}y=1+e−x1
梯度公式:
y′=y∗(1−y)y ^ {'} =y * (1-y)y′=y∗(1−y)
特性:
- 输出值在(0,1),符合概率
- 导数范围是[0,0.25],易导致梯度消失
- 输出为非0均值,破坏数据分布
nn.tanh
计算公式:y=sinxcosx=ex−e−xe−+e−x=21+e−2x+1y = \frac {sinx} {cosx} = \frac {e^ x - e^ {-x} } {e^ - + e ^{-x}} = \frac {2} {1 + e ^ {-2x}} +1 y=cosxsinx=e−+e−xex−e−x=1+e−2x2+1
梯度公式:y′=1−y2y^ {'} = 1 -y ^ 2y′=1−y2
特性:
- 输出值在(-1,1),数据符合0均值
- 导数范围是(0,1),易导致梯度消失
为了解决Sigmoid和tanh这两个饱和函数而引发的梯度消失这一问题,有学者提出采用ReLU修正线性单元这个激活函数。
nn.ReLU
计算公式:y=max(0,x)y = max(0,x) y=max(0,x)
梯度公式:
y′={1,x>0undefined,x=00,x<0y ^ {'} =\left\{ \begin{aligned} 1 , x > 0\\ undefined , x = 0\\ 0 , x < 0 \end{aligned} \right.y′=⎩⎪⎨⎪⎧1,x>0undefined,x=00,x<0
特性:
- 输出值为正数,负半轴导致死神经元
- 导数是1,缓解梯度消失,但易引发梯度爆炸
改进的ReLU:
nn.LeakyReLU
- negative_slope:负半轴斜率
nn.PReLU
- init:可学习斜率
nn.RReLU
- lower:均匀分布下限
- upper:均匀分布上限
参考资料
深度之眼训练营——Pytorch课程
Pytorch系列之——nn网络层相关推荐
- PyTorch系列入门到精通——模型创建与nn.Module
PyTorch系列入门到精通--模型创建与nn.Module
- pytorch教程之nn.Module类详解——使用Module类来自定义网络层
前言:前面介绍了如何自定义一个模型--通过继承nn.Module类来实现,在__init__构造函数中申明各个层的定义,在forward中实现层之间的连接关系,实际上就是前向传播的过程. 事实上,在p ...
- 简单粗暴PyTorch之nn网络层(卷积、池化、线性、激活)
nn网络层 一.卷积层 1.1 卷积概念 1.2 nn.Conv2d 1.3 转置卷积 二.池化层 Pooling Layer 2.1 最大池化nn.MaxPool2d 2.2 平均池化nn.AvgP ...
- PyTorch框架学习十一——网络层权值初始化
PyTorch框架学习十一--网络层权值初始化 一.均匀分布初始化 二.正态分布初始化 三.常数初始化 四.Xavier 均匀分布初始化 五.Xavier正态分布初始化 六.kaiming均匀分布初始 ...
- [Pytorch系列-35]:卷积神经网络 - 搭建LeNet-5网络与CFAR10分类数据集
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- [Pytorch系列-61]:循环神经网络 - 中文新闻文本分类详解-3-CNN网络训练与评估代码详解
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- [Pytorch系列-60]:循环神经网络 - 中文新闻文本分类详解-2-LSTM网络训练与评估代码详解
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- [Pytorch系列-41]:卷积神经网络 - 模型参数的恢复/加载 - 搭建LeNet-5网络与MNIST数据集手写数字识别
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- PyTorch中的nn.Conv1d与nn.Conv2d
本文主要介绍PyTorch中的nn.Conv1d和nn.Conv2d方法,并给出相应代码示例,加深理解. 一维卷积nn.Conv1d 一般来说,一维卷积nn.Conv1d用于文本数据,只对宽度进行卷积 ...
最新文章
- ​JGG | TaxonKit:一款实用又高效的NCBI分类学数据工具包
- 【PAT乙级】 1004 成绩排名 (20 分)
- 基于verilog流水灯设计
- mysql8和5.7区别_MySQL 8、MySQL 5.7和Percona server for MySQL性能比较
- 我的docker随笔31:oracle数据库再次部署
- 关注Ionic底部导航按钮tabs在android情况下浮在上面的处理
- 南宁公交有两个应用付费通道,互不通用
- c语言计算器自动计算源代码,c语言计算器源代码
- 【TransE模型】基于分布式表示推理
- 自动驾驶相关功能名词和汽车名词解释
- The Little Schemer Fourth Edition,笔记01
- Matlab按照二进制读写txt文件
- 【Python】科研论文绘图实操干货汇总,11类Matplotlib图表,含代码
- sspanel php,sspanelv3魔改版邮件设置指南及常用配置
- gvim常用命令行大全
- 试题 算法提高 陶陶摘苹果
- Windows10搭建turn服务器
- html5教程渐变效果,科技常识:html5教程实现Photoshop渐变色效果
- 用友安装时显示加密服务器,用友云主机指向加密服务器
- Vue的patch算法(了解)
热门文章
- 北京科技大学计算机导师怎么样,【计算机考研导师】北京科技大学计算机科学与技术系硕士生导师王卫苹...
- 单片机2017福建省中职省赛_2017年福建省职业院校技能大赛首批设115个赛项
- Mysql修改服务中可执行文件路径
- Sqlite3并发读写注意事项
- 漫谈自动化测试(一)——如何入门
- HTML基础教程 插图
- 计算机云维护是做什么的,IT运维是什么?云时代下的运维人员是怎样的?
- 测绘人真实故事 | 放弃上万月薪从私企跳回国企
- 单片机---1.仿真实现跑马灯(从左往右,在从右往左)
- 51单片机——人体红外感应报警