目录

  • 1、1d/2d/3d卷积
  • 2、卷积-nn.Conv1d()
    • 2.1 Conv1d的参数说明
    • 2.2 例子说明
  • 3、卷积-nn.Conv2d()
    • 3.1 深入了解卷积层的参数
  • 4、转置卷积-nn.ConvTranspose
    • 4.1 nn.ConvTranspose2d

1、1d/2d/3d卷积

卷积运算: 卷积核在输入信号(图像)上滑动,相应位置上进行乘加;
卷积核: 又称为滤波器,过滤器,可认为是某种模式,某种特征;

卷积过程类似于用一个模板去图像上寻找与它相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取;

AlexNet卷积核可视化,发现卷积核学习到的是边缘,条纹,色彩这一些细节模式;

卷积维度: 一般情况下,卷积核在几个维度上滑动就是几维卷积。


一维卷积一维卷积

二维卷积二维卷积

三维卷积三维卷积

2、卷积-nn.Conv1d()

一维卷积可以应用在对文本中,将一段文字通过word_embedding之后连接成一段一维长向量,然后以一个字或者几个字的词嵌入长度为卷积核进行卷积。

torch.nn.Conv1d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True)

一维卷积层,输入的尺度为(N,Cin,L)(N,C_{in},L)(N,Cin,L),输出尺度为(N,Cout,Lout)(N,C_{out},L_{out})(N,Cout,Lout)。N代表批数量大小,CinC_{in}Cin代表输入数据的通道数,L代表输入数据的长度。CoutC_{out}Cout代表输出数据的通道数,LoutL_{out}Lout表示输入数据长度经过卷积后的长度。

2.1 Conv1d的参数说明

  • in_channels(int):输入信号通道;
  • out_channels(int):卷积产生的通道;
  • kerner_size(int or tuple):卷积核的尺寸;
  • stride(int or tuple,optional):卷积步长;
  • padding(int or tuple,optional):是否对输入数据填充0。Padding可以将输入数据的区域改造成是卷积大小的整数倍,这样对不满足卷积核大小的部分数据就不会忽略了。通过Padding参数指定填充区域的高度何宽度;
  • dilation(int or tuple,‘optional’):卷积核之间的空格;
  • groups(int,optional):将输入数据分成组,in_channels应该被组数整除;
  • bias(bool,optional):如果bias=True,添加偏置。

2.2 例子说明

m = nn.Conv1d(16, 33, 3, stride=2)
inputs = autograd.Variable(torch.randn(20, 16, 50))
output = m(inputs)
  • 上述例子中的一维卷积核的输入通道设置为16,输出通道设置为33,卷积核大小为3,步进为2;
  • 输入数据的批大小为20,通道数为16,每个通道的长度为50;
  • 通过卷积,16通道对应的卷积核运算后进行累加得到输出的一个通道,重复这个步骤得到33个输出通道。
  • 每个通道的长度为50,卷积核大小为3,步进为2,得到的输出通道数据的长度为24。

3、卷积-nn.Conv2d()

功能:对多个二维信号进行二维卷积;

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

主要参数

  • in_channels:输入通道数
  • out_channels:输出通道数,等价于卷积核个数
  • kernel_size:卷积核尺寸
  • stride:步长
  • padding:填充个数
  • dilation:空洞卷积大小
  • groups:分组卷积设置
  • bias:偏置,在卷积求和之后加上偏置的值


padding的作用padding的作用padding

空洞卷积的作用空洞卷积的作用

分层卷积的描述分层卷积的描述
尺寸计算

简化版:outsize=INsize−kernelsizestride+1out_{size}=\frac{IN_{size}-kernel_{size}}{stride}+1outsize=strideINsizekernelsize+1
完整版:Hout=⌊Hin+2∗padding[0]−dilation[0]∗(kernel[0]−1)−1stride[0]+1⌋H_{out}=\left \lfloor \frac{H_{in}+2*padding[0]-dilation[0]*(kernel[0]-1)-1}{stride[0]}+1 \right \rfloorHout=stride[0]Hin+2padding[0]dilation[0](kernel[0]1)1+1


如上图中的卷积之后的尺寸为:4−31+1=2\frac{4-3}{1}+1=2143+1=2

通过代码看一下卷积层的具体作用:

"""
代码来源于深度之眼pytorch课程-余老师
"""
import os
import torch.nn as nn
from PIL import Image
from torchvision import transforms
from matplotlib import pyplot as plt
from common_tools import transform_invert, set_seedset_seed(1)  # 设置随机种子,不同的随机种子会给卷积层权重不一样,这会导致提取到的特征不同# ================================= load img ==================================
path_img = os.path.join(os.path.dirname(os.path.abspath(__file__)), "E:/pytorch深度学习/lenaa.png")
img = Image.open(path_img).convert('RGB')  # 0~255# convert to tensor
img_transform = transforms.Compose([transforms.ToTensor()])  # RGB图像转换成张量的形式
img_tensor = img_transform(img)
img_tensor.unsqueeze_(dim=0)    # C*H*W to B*C*H*W,拓展到四维的张量,增加batch_size的维度# ================================= create convolution layer ==================================# ================ 2d
flag = 1
# flag = 0
if flag:conv_layer = nn.Conv2d(3, 1, 3)   # input:(i, o, size) weights:(o, i , h, w),输入为三个通道,卷积核个数1个,输出通道为1nn.init.xavier_normal_(conv_layer.weight.data)  # 卷积层初始化# calculationimg_conv = conv_layer(img_tensor)  # 图片进入卷积层# ================ transposed
# flag = 1
flag = 0
if flag:conv_layer = nn.ConvTranspose2d(3, 1, 3, stride=2)   # input:(i, o, size)nn.init.xavier_normal_(conv_layer.weight.data)# calculationimg_conv = conv_layer(img_tensor)# ================================= visualization ==================================
print("卷积前尺寸:{}\n卷积后尺寸:{}".format(img_tensor.shape, img_conv.shape))
img_conv = transform_invert(img_conv[0, 0:1, ...], img_transform)  # 对transform进行逆操作,将张量转换成PIL的图像
img_raw = transform_invert(img_tensor.squeeze(), img_transform)
plt.subplot(122).imshow(img_conv, cmap='gray')  # 图像可视化
plt.subplot(121).imshow(img_raw)
plt.show()

设置不同的随机种子,Xavier初始化权重不同,输出的结果不同:

随机种子为1随机种子为11

随机种子为2随机种子为22

随机种子为3随机种子为33

3.1 深入了解卷积层的参数

对代码设置断点,进行单步调试:

flag = 1
# flag = 0
if flag:(设置断点)conv_layer = nn.Conv2d(3, 1, 3)   # input:(i, o, size) weights:(o, i , h, w),输入为三个通道,卷积核个数1个,输出通道为1nn.init.xavier_normal_(conv_layer.weight.data)

代码进入conv.py文件中的Conv2d()类,如下所示,Conv2d是继承于ConvNd类的,而ConvNd又继承于module基本类,所以Conv2d也是一个nn.module,这样就创建好了一个卷积层:

class Conv2d(_ConvNd):def __init__(self, in_channels, out_channels, kernel_size, stride=1,padding=0, dilation=1, groups=1,bias=True, padding_mode='zeros'):kernel_size = _pair(kernel_size)stride = _pair(stride)padding = _pair(padding)dilation = _pair(dilation)super(Conv2d, self).__init__(in_channels, out_channels, kernel_size, stride, padding, dilation,False, _pair(0), groups, bias, padding_mode)

创建好一个卷积层后,可以查看这个卷积层的8个字典参数,如下:

这些属性中,权值属性是最重要的属性,从下图中可以看到权值是一个4维的张量[1,3,3,3]。怎么理解四维的张量去进行二维的卷积呢?[1,3,3,3]中1表示输出通道数,也就是卷积核个数;第二个3表示输入的通道数;最后的两个3是二维的卷积核的尺寸。

下面通过一个图看看上面提到的[1,3,3,3]是怎么工作的。


输入的图片是一个三维的RGB图像,创建三个二维的卷积核,三个二维的卷积核分别对应每个通道进行卷积,然后三个卷积核卷积得到的值进行相加。一个卷积核只在其中的一个二维图像上移动,所以这是二维的卷积。虽然卷积核是三维的卷积核,但是我们并不能认为这是一个三维卷积。

4、转置卷积-nn.ConvTranspose

转置卷积又称为反卷积(Deconvolution)和部分跨越卷积(Fractionally-strided Convolution),用于对图像上进行上采样(UpSample),在图像分割任务中经常使用。

为什么称为转置卷积?

假设图片尺寸为44,卷积核为33,padding=0,stride=1,如下所示。

现在看看代码是怎么实现正常卷积操作的,首先将图像拉成一个向量的形式,4*4的图像会变成I16∗1I_{16*1}I161的二维矩阵,16是图像的所有像素,1是一张图片。

33的卷积核会变成K4∗16K_{4*16}K416的矩阵,16是通过9个卷积核权值进行补零得到的16个数,4是输出像素值的总的个数。得到这两个矩阵之后,通过矩阵运算得到输出的特征图。O4∗1=K4∗16∗I16∗1O_{4*1}=K_{4*16}*{I_{16*1}}O41=K416I161
得到的输出O4∗1O_{4*1}O41进行resize就可以得到2*2的输出。

下面看一下转置卷积的具体操作:


转置卷积实现的是上采样,就是输入的尺寸小于输出的尺寸,现在看看怎样通过矩阵乘法实现转置卷积。

假设图像尺寸为22,卷积核大小为 33,padding=0,stride=1。把输入的尺寸拉成一个矩阵I4∗1I_{4*1}I41,卷积核变成一个K16∗4K_{16*4}K164的矩阵,16是输出的像素个数,而4是卷积核中9个值的某些值,这里和正常卷积不同,正常卷积是补零,这里是剔除一些卷积核权值。可以看一下上面的示意图,卷积核有9个权值,但是能与图像相乘的最多只能有4个,所以会采取剔除的方法,从九个权值中挑选出来对应的四个权值与图像进行相乘。

得到两个矩阵后,通过矩阵相乘的方法就可以实现一个转置卷积,得到O16∗1O_{16*1}O161的数据:O16∗1=K16∗4∗I4∗1O_{16*1}=K_{16*4}*{I_{4*1}}O161=K164I41然后进行resize就可以得到4*4的输出值。

我们现在看一下正常卷积和转置卷积的区别,如下图:

正常卷积的卷积矩阵是K4∗16K_{4*16}K416,而转置卷积是K16∗4K_{16*4}K164,这两个卷积核矩阵是转置的关系,这就是转置卷积名字的由来。但是需要注意,这两个矩阵只是形状上的转置,这两者的权值是完全不相同的。由于权值完全不同,所以正常卷积和转置卷积是不可逆的。也就是16个像素经过正常卷积,然后反卷积得到的16个像素是完全不相等的,这也是不建议称为逆卷积或者反卷积的原因,因为这两个是不可逆的。

4.1 nn.ConvTranspose2d

功能:转置卷积实现上采样

nn.ConvTranspose2d(in_channels,out_channels,kernel_size,stride=1,padding=0,output_padding=0,groups=1,bias=True,dilation=1,padding_mode='zores')

主要参数:

  • in_channels:输入通道数
  • out_channels:输出通道数
  • kernel_size:卷积核尺寸
  • stride:步长
  • padding:填充个数
  • dilation:空洞卷积大小
  • groups:分组卷积设置
  • bias:偏置

尺寸计算:

简化版:outsize=(insize−1)∗stride+kernelsizeout_{size}=(in_{size}-1)*stride+kernel_{size}outsize=(insize1)stride+kernelsize
完整版:Hout=(Hin−1)∗stride[0]−2∗padding[0]+dilation[0]∗(kernel_size[0]−1)+output_padding[0]+1H_{out}=(H_{in}-1)*stride[0]-2*padding[0]+dilation[0]*(kernel\_size[0]-1)+output\_padding[0]+1Hout=(Hin1)stride[0]2padding[0]+dilation[0](kernel_size[0]1)+output_padding[0]+1

下面看一下代码中ConvTranspose2d的具体使用过程:

conv_layer = nn.ConvTranspose2d(3, 1, 3, stride=2)   # input:(i, o, size)
nn.init.xavier_normal_(conv_layer.weight.data)# calculation
img_conv = conv_layer(img_tensor)

运算之后得到的图片结果如下所示:

通过图片可以发现,经过转置卷积上采样之后,图像有一个奇怪的现象,有一格一格的方块,像一个棋盘,这是转置卷积的通病,称为棋盘效应,它是由于不均匀重叠导致的,关于棋盘效应的解释以及解决方法可以看《Deconvolution and Checkerboard Artifacts》

pytorch —— nn网络层 - 卷积层相关推荐

  1. 【PyTorch】3.3 nn网络层-卷积层

    目录 一.1d/2d/3d卷积 二.卷积–nn.Conv2d() 1. nn.Conv2d() 2. AlexNet:分组卷积 ​3.尺寸计算 4.三维卷积核实现二维卷积 ​三.转置卷积–nn.Con ...

  2. pytroch学习笔记六:nn网络层——卷积层

    通过前面两节的学习,已经知道如何搭建一个网络模型以及搭建模型一个非常重要的类nn.Module和模型容器Containers.搭建网络模型有两个基本的步骤:建立子模块和拼接子模块.建立的子模块就包括卷 ...

  3. 简单粗暴PyTorch之nn网络层(卷积、池化、线性、激活)

    nn网络层 一.卷积层 1.1 卷积概念 1.2 nn.Conv2d 1.3 转置卷积 二.池化层 Pooling Layer 2.1 最大池化nn.MaxPool2d 2.2 平均池化nn.AvgP ...

  4. pytorch神经网络之卷积层与全连接层参数的设置

    当使用pytorch写网络结构的时候,本人发现在卷积层与第一个全连接层的全连接层的input_features不知道该写多少?一开始本人的做法是对着pytorch官网的公式推,但是总是算错. 后来发现 ...

  5. 11nn网络层-卷积层

    一.1d/2d/3d卷积 卷积运算: 卷积核在输入信号(图像)上滑动,相应位置上进行乘加 卷积核: 又称为滤波器,过滤器,可认为是某种模式,某种特征 卷积过程类似于用一个模版去图像上寻找与它相似的区域 ...

  6. 反卷积原理 + pytorch反卷积层参数output_padding

    一般我们会认为2维卷积的计算分为了以下3类: 1.full   2.same   3. valid 参考:https://cn.mathworks.com/help/matlab/ref/conv2. ...

  7. Lesson 16.5 在Pytorch中实现卷积网络(上):卷积核、输入通道与特征图在PyTorch中实现卷积网络(中):步长与填充

    卷积神经网络是使用卷积层的一组神经网络.在一个成熟的CNN中,往往会涉及到卷积层.池化层.线性层(全连接层)以及各类激活函数.因此,在构筑卷积网络时,需从整体全部层的需求来进行考虑. 1 二维卷积层n ...

  8. 【Pytorch】基于卷积神经网络实现的面部表情识别

    作者:何翔 学院:计算机学院 学号:04191315 班级:软件1903 转载请标注本文链接: https://blog.csdn.net/HXBest/article/details/1219812 ...

  9. Pytorch —— nn.Module类(nn.sequential)

    对于前面的线性回归模型. Logistic回归模型和神经网络,我们在构建的时候定义了需要的参数.这对于比较小的模型是可行的,但是对于大的模型,比如100 层的神经网络,这个时候再去手动定义参数就显得非 ...

最新文章

  1. [Java面试五]Spring总结以及在面试中的一些问题.
  2. UITextView 取消键盘方法
  3. Chapter11-RMAN Backups
  4. 0428 团队项目2.0
  5. mingw64 下 java_在 Windows 10 64 位下安装 Mingw-w64
  6. linux使用外部smtp发送邮件,Centos 配置mailx使用外部smtp发送邮件
  7. mysql innodb 数据恢复_MYSQL INNODB 数据库恢复 转
  8. Linux文件浏览命令
  9. 字节跳动面试分享:java从入门到精通第五版答案位置
  10. SpringBoot part4 day15
  11. 利用pm2 启动node项目
  12. Flask框架学习笔记9-jinjia2模板语言
  13. 硬件知识学习整理:(上拉,下拉),(三极管),(OC,OD,推挽输出),(NMOS与PMOS),(MOSFET驱动电路),(IR2110S)
  14. 计算机画图虚线,天正建筑怎么把直线变成虚线
  15. MySQL — 数据库的基本概念、安装并配置MySQL、MySQL的基本使用、在项目中操作MySQL、前后端的身份认证
  16. j2se学习笔记-Enum枚举类型
  17. 计算机word操作基础题,计算机操作基础Word练习题
  18. 可过滤多种广告的“ADM(阿呆喵)广告拦截工具
  19. 有向图的强联通分量之:【求最长链】【求最长链的方案数(图论中的方案数DP)】【最长链和最大半联通子图 节点数相同】【最长链与最大半联通子图等价又不完全等价】
  20. 论文阅读——(邬江兴院士) 网络空间内生安全综述 Cyberspace Endogenous Safety and Security

热门文章

  1. 惠普HP1280墨盒型号
  2. .net知识和学习方法系列(二十)CLR-委托
  3. [转] 外企面试官最爱提的问题 TOP10
  4. 容器编排技术 -- Kubernetes kubectl run 命令详解
  5. Redis面试 - 内存淘汰机制
  6. 国开本科计算机应用基础操作题,2019秋国开大学计算机应用基础Windows7操作系统形考题目及答案...
  7. MyBatis整合Spring原理分析
  8. 【熊猫多模式站群开发日志】 优化了关键词调度和模板调度
  9. Suggestion [3,General]: 找不到命令 webpack,但它确实存在于当前位置。默认情况下,Windows PowerShell 不会从当前位置加载命令。如果信任此命令,请改为键
  10. 人脸识别技术原理与工程实践