上采样下采样以及pytorch中的卷积与反卷积(转置卷积)方法介绍(conv2d和convtranspose2d)(代码片段)

非晚非晚 非晚非晚     2022-12-09     358

关键词:

文章目录

1. 上采样与下采样

1.1 上采样

上采样(upsampling),又叫放大图像、图像插值(interpolating),主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。上采样有3种常见的方法:双线性插值(bilinear),反卷积(Transposed Convolution),反池化(Unpooling)。

  • 插值法:最近邻算法、双线性插值算法、双三次插值算法(bicubic)
  • 反卷积:又称为转置卷积
  • 反池化:平均池化的反池化是把池化后的平均数字结果分布到池化前图像上的每个像素格子上。 最大池化的反池化是把池化后的最大数字结果填充到池化前图像上对应的像素格子上,而其他格子则填充0。

1.2 下采样

下采样(subsampled)或降采样(downsampled)或者称为缩小图像,它的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。

下采样一般为池化操作。池化最直观的作用便是降维,常见的池化有最大池化、平均池化和随机池化;池化层不需要训练参数。

2. 卷积函数——Conv2d

2.1 卷积函数说明

卷积操作可以压缩整合图片特征,让[通道, 宽, 高]分别为 [ c , h , w ] [c,h,w] [c,h,w]的特征图片通过Conv2d。变为更多的通道(维度) c c c,更小的尺寸 [ h , w ] [h,w] [h,w]。也就是说,当输入为一组图片 [ n , c , h , w ] [n,c,h,w] [n,c,h,w]格式时,输出也为 [ n , c , h , w ] [n,c,h,w] [n,c,h,w]格式。

卷积函数Conv2d定义形式如下所示。

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

卷积函数参数说明:

  • in_channels (int) – 输入信号通道数(channels);
  • out_channels (int) – 输出信号通道数(channels);
  • kernel_size (int or tuple) – 卷积核的大小;卷积核尺寸,尺寸越大‘感受野’越大,及处理的特征单位越大,同时计算量也越大
  • stride (int or tuple, optional) – 卷积步长(默认为1);卷积核移动的步数,默认1步,增大步数会忽略局部细节计算,适用于高分辨率的计算提升
  • padding (int, tuple or str, optional) – 输入信号四周的填充,默认填充0。就是填充的意思,通过padding,可以填充图片的边缘,让图片的边缘的特征得到更充分的计算(不至于被截断)
  • padding_mode (string, optional) – ‘zeros’, ‘reflect’, ‘replicate’ or ‘circular’. Default: ‘zeros’;
  • dilation (int or tuple, optional) – 卷积核元素之间的间距,默认为1,也就是常规的卷积方式;
  • groups (int, optional) – 从输入通道到输出通道的阻塞连接数,默认为1;
  • bias (bool, optional) – 如果bias=True,添加偏置,默认为True;

卷积操作的输入与输出尺寸之间的关系如下所示。注意下列除法为 向下取正。简化版为: H o = ( H i + 2 p − d ∗ ( k − 1 ) − 1 ) / s + 1 H_o=(H_i+2p-d*(k-1) - 1)/s +1 Ho=(Hi+2pd(k1)1)/s+1

2.2 卷积操作可视化与举例

(1)举例一:padding=0,stride=1,kernel_size=3

假设padding=0,stride=1,kernel_size=3。下图中,蓝色为输入[4,4],蓝色上的阴影为卷积核[3,3],绿色为输出[2,2],蓝色边缘的白色框为padding。可视化效果如下。


代码表示形式如下:

import torch
import torch.nn as nn

x = torch.randn(1,1,4,4) # [n,c,h,w]
l = nn.Conv2d(1,1,3)#Conv2d(1, 1, kernel_size=(3, 3), stride=(1, 1),padding=0)
y = l(x)

print(y.shape) # torch.Size([1, 1, 2, 2])

(2)举例二:padding=2,stride=1,kernel_size=4

假设padding=2,stride=1,kernel_size=4。下图中,蓝色为输入[5,5],蓝色上的阴影为卷积核[4,4],绿色为输出[6,6],蓝色边缘的白色框为padding[2,2]。可视化效果如下。

代码表示形式如下:

import torch
import torch.nn as nn

x = torch.randn(1,1,5,5) # [n,c,h,w]
l = nn.Conv2d(1,1,4,padding=2)#Conv2d(1, 1, kernel_size=4,stride=1,padding=2)
y = l(x)

print(y.shape) # torch.Size([1, 1, 6, 6])

3. 反卷积(转置卷积)——convTranspose2d

反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其之后的工作中。

转置卷积,也称为反卷积(deconvlution)和分部卷积(fractionally-strided convolution)。为卷积的逆操作,即把特征的维度压缩,但尺寸放大。注意它 不是真正意义上 的卷积的逆操作。通过反卷积,只能恢复原矩阵的大小,但并不能完全恢复原矩阵的数值

3.1 反卷积原理

所谓的反卷积,就是卷积的逆操作,反卷积就可以看成通过卷积核透视。如下图所示:


比如左上角的图,拿55举例,它的输出为[[55,110,55],[110,55,110],[55,55,110]]。我们将得到的四张特征图进行叠加(重合的地方其值相加),可以得到下图:

3.2 反卷积函数说明

该模块可视为Conv2d相对于其输入的梯度。卷积函数convTranspose2d定义形式如下所示。

torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, 
groups=1, bias=True, dilation=1, padding_mode='zeros', device=None, dtype=None)

反卷积参数说明如下,stride、padding和output_padding参数需要单独理解,其他大部分参数与卷积相似。

  • in_channels(int) – 输入信号的通道数;
  • out_channels(int) – 卷积产生的通道数;
  • kerner_size(int or tuple) - 卷积核的大小;
  • stride(int or tuple,optional) - 输入层之间的间隔,默认为1

stride=1时,输入层元素之间没有间隔,当stride=2时,输入层元素之间间隔为1,stride=3时,输入层元素之间间隔为2,以此类推。

  • padding(int or tuple, optional) - 卷积核与输入层相交的最少像素参数,默认为0,也就是说最少要相交1个点;

padding=0时,卷积核和输入层相交一个像素,当padding=1时,卷积核和输入层相交2个像素,依此类推;

  • output_padding(int or tuple, optional) - 输出数据每条边的填充0的个数,默认为0;

output_padding=0表示不进行填补,output_padding=1表示进行填补一圈0,等于2表示进行填补2圈0.

  • dilation(int or tuple, optional) – 卷积核元素之间的间距
  • groups(int, optional) – 从输入通道到输出通道的阻塞连接数
  • bias(bool, optional) - 如果bias=True,添加偏置,默认为True

反卷积操作的输入与输出尺寸之间的关系如下所示。从公式可以看出,它是卷积的反求关系,简化版: H o = H i ∗ 2 − 2 p + d ∗ ( k − 1 ) + o u t p u t _ p a d d i n g + 1 H_o=H_i *2-2p +d*(k-1)+output\\_padding+1 Ho=Hi22p+d(k1)+output_padding+1

H o u t = ( H i n − 1 ) × s t r i d e [ 0 ] − 2 × p a d d i n g [ 0 ] + d i l a t i o n [ 0 ] × ( k e r n e l _ s i z e [ 0 ] − 1 ) + o u t p u t _ p a d d i n g [ 0 ] + 1 H_out =(H_in −1)×stride[0]−2×padding[0]+dilation[0]×(kernel\\_size[0]−1)+output\\_padding[0]+1 Hout=(Hin1)×stride[0]2×padding[0]+dilation[0]×(kernel_size[0]1)+output_padding[0]+1
W o u t = ( W i n − 1 ) × s t r i d e [ 1 ] − 2 × p a d d i n g [ 1 ] + d i l a t i o n [ 1 ] × ( k e r n e l _ s i z e [ 1 ] − 1 ) + o u t p u t _ p a d d i n g [ 1 ] + 1 W_out=(W_in−1)×stride[1]−2×padding[1]+dilation[1]×(kernel\\_size[1]−1)+output\\_padding[1]+1 Wout=(Win1)×stride[1]2×padding[1]+dilation[1]×(kernel_size[1]1)+output_padding[1]+1

3.3 反卷积操作可视化与举例

(1)举例一:padding=0,kernel_size=3,stride=1

padding = 0,表示蓝色的输入[2,2]与卷积核最少有(1,1)个像素相交,stride = 1,表示输入输入数据没有间隔。具体动态图视如下:

代码表示形式如下:

import torch
import torch.nn as nn

x = torch.randn(1,1,2,2)
l = nn.ConvTranspose2d(1,1,3)#Conv2d(1, 1, kernel_size=3,stride=1,padding=0)
y = l(x) 

print(y.shape) # torch.Size([1, 1, 4, 4])

(2)举例二:padding=2,kernel_size=4,stride=1

padding = 2表示蓝色输入数据[6,6]与卷积核函最少交(3,3)个像素,stride=1表示输入数据没有间隔。具体动态图视如下:


代码表示如下:

import torch
import torch.nn as nn

x = torch.randn(1,1,6,6)
l = nn.ConvTranspose2d(1,1,4,padding=2)#Conv2d(1, 1, kernel_size=4,stride=1,padding=2)
y = l(x)

print(y.shape) # torch.Size([1, 1, 5, 5])

(3)举例三:padding=2,kernel_size=3,stride=1

padding = 2表示蓝色输入数据[7,7]与卷积核函最少交(3,3)个像素,stride=1表示输入数据没有间隔。具体动态图视如下:

代码表示如下:

import torch
import torch.nn as nn

x = torch.randn(1,1,7,7)
l = nn.ConvTranspose2d(1,1,3,padding=2)#Conv2d(1, 1, kernel_size=3,stride=1,padding=2)
y = l(x) 

print(y.shape) # torch.Size([1, 1, 5, 5])

(4)举例4:padding=0,kernel_size=3,stride=2

padding = 0表示蓝色输入数据[2,2]与卷积核函最少交(1,1)个像素,stride=2表示输入数据间隔1个像素就填充0值。具体动态图视如下:


代码表示如下:

import torch
import torch.nn as nn

x = torch.randn(1,1,2,2)
l = nn.ConvTranspose2d(1,1,3,stride=2,padding=0)#Conv2d(1, 1, kernel_size=3,stride=2,padding=0)
y = l(x) 

print(y.shape) # torch.Size([1, 1, 5, 5])

Conv2d参考链接:https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html?highlight=conv2d#torch.nn.Conv2d
ConvTranspose2d参考链接:https://pytorch.org/docs/1.11/generated/torch.nn.ConvTranspose2d.html?highlight=convtranspose2d#torch.nn.ConvTranspose2d

反卷积网络论文:https://www.matthewzeiler.com/mattzeiler/deconvolutionalnetworks.pdf

卷积动态图:https://github.com/vdumoulin/conv_arithmetic

checkerboardartifacts(棋盘伪影)的发生以及解决方案:

...盘伪影传统方法通常使用不同的“插值”方法实现特征上采样操作,后来深度学习的趋势引入转置卷积通过参数学习的方式替代“插值”方法进行特征上采样操作。标准卷积通过设置合适卷积核将输入的多个像素映射到输出... 查看详情

未对特征图进行下采样时转置卷积的必要性

】未对特征图进行下采样时转置卷积的必要性【英文标题】:necessityoftransposedconvolutionwhenfeaturemapsarenotdownsampled【发布时间】:2017-12-0205:29:42【问题描述】:我正在阅读一篇论文here。论文中的作者提出了一种对称生成器网络,该... 查看详情

语义分割学习

...xff0c;使其不受输入图片宽高的影响。图像分类模型使用降采样层(步长卷积或池化)获得高层次特征,导致全卷积网络输出尺寸小于原图,而分割要求同尺寸输出。因此,对预测的分割图升采样。双线性插值... 查看详情

卷积神经网络(cnn)

...网络的结构由输入层、卷积神经层(ConvolutionalLayer)、下采样层(PoolingLayer)、全连接层(FullyConnectedNetwork)及输出层构成[20]。其中卷积神经网络层、下采样层、全连接被合称为隐含层。在卷积神经网络中,卷积神经层与下采样层... 查看详情

非常详细的反卷积(transposedconvolution)的理解

...考链接其实了解卷积之后可以直接看第4,5,6部分的。上采样是把低分辨率输入转成高分辨率输出。有以下几种上采样的方法:如何用合适的方法进行上采样?参考文章反卷积不是一个预先定义好的插值方法,它有一些可学习参... 查看详情

python图像处理采样卷积与离散傅里叶变换(代码片段)

采样、卷积与离散傅里叶变换0.前言1.图像傅里叶变换1.1傅里叶变换基础1.2傅里叶变换应用1.3逆傅里叶变换应用2.利用采样改变图像分辨率2.1上采样2.2下采样小结系列链接0.前言采样(Sampling)是用于选择/丢弃图像像素的空间操作ÿ... 查看详情

消融实验,上采样,下采样,池化是什么

目录什么是消融实验(Ablationexperiment)池化是什么意思下采样与上采样空洞卷积 查看详情

消融实验,上采样,下采样,池化是什么

目录什么是消融实验(Ablationexperiment)池化是什么意思下采样与上采样空洞卷积 查看详情

inceptionv3通用设计原则分解卷积不对称卷积下采样模块labelsmoothing

Inceptionv3RethinkingtheInceptionArchitectureforComputerVisionAbstract通过增加模型大小和增加参数数量可以提升模型性能,但是要考虑计算资源,模型轻量化,兼顾计算效率,提出了分解卷积和labelsmoothing。通用设计原则(作者推... 查看详情

重采样上采样下采样

重采样分为上采样和下采样,区分的依据是重新采样时新采样率与原先采样率的大小的比较。上采样:采样频率高于信号最高频率的2倍,又称为插值/内插/过采样;上采样率 =采样率/比特速率下采样:采样频率低于信号最... 查看详情

聊聊池化层和步长为2的卷积层

...积层来说,个人的理解是这样的,池化层是一种先验的下采样方式,即人为的确定好下采样的规则;而对于步长为2的卷积层来说,其参数是通过学习得到的,采样的规则是不确定的。本文分享自华为云社区《​​对于池化层和... 查看详情

聊聊池化层和步长为2的卷积层(代码片段)

...积层来说,个人的理解是这样的,池化层是一种先验的下采样方式,即人为的确定好下采样的规则;而对于步长为2的卷积层来说,其参数是通过学习得到的,采样的规则是不确定的。本文分享自华为云社区《对于池化层和步长... 查看详情

[paperweekly]cnn采样方法:空间变换网络(stn)与可变形卷积网络(dcn)

...、缩放、剪切、旋转)缺乏不变性。这种缺陷与CNN默认的采样方法(矩阵采样)有很大的关系。所以,为了使网络获得对仿射变换的不变性,通常采用了改变采样方式的做法(如采用pooling方式的采样使网络获得了一定的平移、... 查看详情

全卷积网络fcn(代码片段)

...关注两点全连接层替换成卷积层.用反卷积的方式完成上采样不同layer的输出要做相加.用以增强featuremap的表达能力.反卷积(deconvolutional)关于反卷积(也叫转置卷积)的详细推导,可以参考:<https://blog.csdn.net/LoseInVain/article/details/8109850... 查看详情

pytorch笔记-convolution卷积运算的原理(代码片段)

...a;F.conv_transpose2d、kernel转置+矩阵相乘用途:上采样PyTorchConv2D:torch.nn.Conv2dtorch.nn.functional.conv2dConv2D的参数:in_channels(输入通道),out_channels(输出通道),kernel_size(卷积核)stride=1(步长),padding=0(填充),dilation=1(膨胀)... 查看详情

pytorch笔记-convolution卷积运算的原理(代码片段)

...a;F.conv_transpose2d、kernel转置+矩阵相乘用途:上采样PyTorchConv2D:torch.nn.Conv2dtorch.nn.functional.conv2dConv2D的参数:in_channels(输入通道),out_channels(输出通道),kernel_size(卷积核)stride=1(步长),padding=0(填充),dilation=1(膨胀)... 查看详情

pytorch笔记-convolution卷积运算的原理(代码片段)

Convolution:元素:inputsize、kernelsize、stride、padding、group、dilation(膨胀)计算方法:F.conv2d、input展开+矩阵相乘、kernel展开+矩阵相乘用途:局部建模、下采样卷积与互相关TransposeConvolution:计算方法࿱ 查看详情

卷积可分离卷积转置卷积(反卷积)

...。其默认值通常设置为1。设置大于1的值后对图像进行下采样,这种方式类似池化操作。边界扩充(Padding):定义了网络层处理样本边 查看详情