精华内容
下载资源
问答
  • 一个简单的例子,我们给一个等待这被卷积的矩阵 [123456789]\begin{bmatrix} 1 & 2 & 3\\ 4& 5 & 6\\ 7 & 8 & 9\\ \end{bmatrix}⎣⎡​147​258​369​⎦⎤​ 再给一个简单的卷积核为 ...

    1、卷积运算和代码示例

    一个简单的例子,我们给一个等待这被卷积的矩阵
    [123456789]\begin{bmatrix} 1 & 2 & 3\\ 4& 5 & 6\\ 7 & 8 & 9\\ \end{bmatrix}
    再给一个简单的卷积核为
    [1111]\begin{bmatrix} 1 & 1\\ 1& 1\\ \end{bmatrix}
    不设置padding,并且stride=1,我们可以简单的计算得到
    [12162428]\begin{bmatrix} 12 & 16\\ 24& 28\\ \end{bmatrix}

    在torch中就是如此计算的

    model = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=2,stride=1,padding=0)
    x = torch.tensor([[[1,2,3],[4,5,6],[7,8,9]]]).unsqueeze(0)
    model.weight.data = torch.tensor([[[[1,1],[1,1]]]])
    model.bias.data = torch.zeros(1)
    
    model(x)
    

    结果可以看见为

    tensor([[[[12, 16],
              [24, 28]]]], grad_fn=<ThnnConv2DBackward>)
    

    2、反卷积运算和代码示例

    假设我们对[12162428]\begin{bmatrix} 12 & 16\\ 24& 28\\ \end{bmatrix}
    进行反卷积,padding=0,stride=1,卷积核为
    [111111111]\begin{bmatrix} 1 & 1 & 1\\ 1& 1 & 1\\ 1& 1 & 1\\ \end{bmatrix}
    这等价于对(见下面解释)
    [0000000000000012160000242800000000000000](1)\begin{bmatrix} 0 &0 &0 & 0 &0 &0 \\ 0 &0 &0 & 0 &0 &0 \\ 0 &0 &12 & 16 &0 &0\\ 0 &0 & 24& 28 &0 &0\\ 0 &0 &0 & 0 &0 &0 \\ 0 &0 &0 & 0 &0 &0 \\ \end{bmatrix}\tag{1}进行卷积操作。结果应该为
    [12282816368080443680804424525228]\begin{bmatrix} 12 & 28 & 28 & 16\\ 36& 80 & 80 &44\\ 36& 80 & 80 &44\\ 24& 52 & 52 &28\\ \end{bmatrix}

    看下pytorch计算结果

    model = nn.ConvTranspose2d(in_channels=1, out_channels=1, kernel_size=3,stride=1,padding=0)
    x = torch.tensor([[[12,16],[24,28]]], dtype=torch.float32).unsqueeze(0)
    model.weight.data = torch.tensor([[[[1,1,1],[1,1,1],[1,1,1]]]], dtype=torch.float32)
    model.bias.data = torch.zeros(1)
    
    print(model(x))
    

    结果为

    tensor([[[[12., 28., 28., 16.],
              [36., 80., 80., 44.],
              [36., 80., 80., 44.],
              [24., 52., 52., 28.]]]], grad_fn=<SlowConvTranspose2DBackward>)
    

    提一下计算方式
    {i+2pks+1=oi+2pks+1=o\begin{cases} \frac{i +2p -k}{s} + 1=o \\ \frac{i' +2p' -k}{s} + 1=o' \end{cases}
    第一行是4->2的卷积过程,第二行是6->4的卷积过程。

    反卷积是2->4的的过程

    所以这里,有i=o,o=ii=o',o=i'。我们的输入x 就是第一行的o, 也就是第二行的ii',为2

    通过消去i,oi,o',我们可以得到p=kp1=301=2p'=k-p-1=3-0-1=2

    所以才有的矩阵(1)

    展开全文
  • 转置卷积、又称反卷积其实是卷积的逆过程。卷积的过程通常会减小特征图的的大小,而转置卷积往往增大特征图的大小,一直以来对转置卷积的过程都不是很理解,最近认真学习了一下,在此分享。 卷积 卷积操作,输入是...

    转置卷积、又称反卷积其实是卷积的逆过程。卷积的过程通常会减小特征图的的大小,而转置卷积往往增大特征图的大小,一直以来对转置卷积的过程都不是很理解,最近认真学习了一下,在此分享。

    卷积

    卷积操作,输入是一个特征图i,参数padding(p), stride(s),kernel_size(k),输出是卷积后得到的特征图o,输出的特征图大小

    o=\left \lfloor \frac{i+2p-k}{s} \right \rfloor +1

    转置卷积

    转置卷积是卷积的逆过程。在做的转置卷积的时候,我们同样会给转置卷积几个参数,如输入特征图i,p,k,s,分别对应padding,kernel_size,stride。

    第一如何理解转置卷积是卷积的逆过程?假设卷积的输入为x,输出为y,而转置卷积作为卷积的逆过程,也就是说转置卷积的输入为y,输出为x。即

    x \overset{Conv}{\rightarrow}y,y\overset{transConv}{\rightarrow}x

    因此,给定转置卷积参数和输出a,我们相当于找到完成这样的过程

    a \overset{transConv}{\rightarrow}b,同时b \overset{Conv}{\rightarrow}a

    故我们知道卷积的输入大小和输出大小的关系,因此我们可以计算出b的大小:

    a=\left \lfloor \frac{b+2p-k}{s} \right \rfloor +1\,\,\,\,\,\,\,\,\,\,\,\, (1)

    假设a=2,s=1,k=1,p=0,此时

    2=\left \lfloor \frac{b+2*0-1}{1} \right \rfloor +1\Rightarrow b=3

    因此可以推断出转置卷积的输出的大小是3,因此过程就是对大小为2的进行转置卷积,得到大小为3的特征图。因此转置卷积是逆卷积这句话体现在转置卷积核卷积是互逆的。

    第二、转置卷积也是卷积。当s=1时,根据转置卷积自身参数的信息计算出一组参数p^{'},s^{'},k^{'},利用这组参数对转置卷积的输入进行卷积,得到输出。

    k^{'}=k,s^{'}=s,p^{'}=k-p-1

    然后以这组参数为卷积的参数,对转置卷积的输入进行卷积得到转置卷积的输出。

    第三、转置卷积有时候也叫分数步长的卷积。当转置卷积的s>1时,对应的卷积的s<1,因此也称为分数步长的卷积。

    s>1时,根据转置卷积自身参数的信息计算出一组参数p^{'},s^{'},k^{'}

    k^{'}=k,s^{'}=1,p^{'}=k-p-1

    此时不能直接利用这组参数对转置卷积的输入进行卷积,而是要对输入进行处理,主要分为两步:

    1. 在输入的每两个像素之间增加s-1个0
    2. 在输入的底边和右边加入(c+2*p-k)mod\,\, s,其中c就是根据第一步中计算出来的转置卷积输出的大小。

    假设转置卷积的输入i=3,k=3,s=2,p=1,计算转置卷积的输出:

    3=\left \lfloor \frac{c+2*1-3}{2} \right \rfloor +1\Rightarrow c=5,6

    此时c有两种情况,当c=5时,(c+2*p-k)mod\,\, s=(5+2*1-3)mod \,\, 2=0,s-1=1,因此对3 \times 3的输入特诊图进行0填充,按第一步填充得到:

    第二步中(c+2*p-k)mod\,\, s=(5+2*1-3)mod \,\, 2=0,故无需填充。

    安照k^{'}=k,s^{'}=1,p^{'}=k-p-1,计算出每个参数得到:k^{'}=3,s^{'}=1,p^{'}=3-1-1=1

    此时p^{'}=1,再对特征图进行填充:

    然后按照k^{'}=3,s^{'}=1进行卷积得到结果

    当c=6时,(c+2*p-k)mod\,\, s=(6+2*1-3)mod \,\, 2=1,s-1=1,因此对3 \times 3的输入特诊图进行0填充,按第一步填充得到:

    第二步中(c+2*p-k)mod\,\, s=(6+2*1-3)mod \,\, 2=1,因此再在特诊图下面和右边填充一层

    同样计算出参数k^{'}=3,s^{'}=1,p^{'}=3-1-1=1,对特征图进行填充:

    然后再卷积得到输出:

    Pytorch中,

    import torch.nn as nn
    
    nn.ConvTranspose2d(in_channels=, out_channels=, kernel_size=, stride=, padding=, output_padding=)

    PyTorch给出的官方文档: 

    根据输入输出大小的计算公式,output_padding参数的设置就可以直接影响输出的大小,而上述部分计算转置卷积的输出的大小的时候,因为有向下取整操作,所以卷积输出的大小是不确定的。因此output_padding的设置正好可以除去这种不确定性。

    比如在上面的例子中设置output_padding=0,对应第一种情况c=5,下面用代码验证,先设置output_padding=0

    import torch.nn as nn
    import torch
    
    class TC(nn.Module):
        def __init__(self):
            super(TC, self).__init__()
            self.tc = nn.ConvTranspose2d(in_channels=3, out_channels=3, 
    kernel_size=3, stride=2, padding=1,output_padding=0)
    
        def forward(self, x):
            return self.tc(x)
    
    
    x = torch.zeros((1, 3, 3, 3))
    print(x.shape)
    tc = TC()
    print(tc(x).shape)

    输出:

    修改output_padding=1,此时输出:

    当然,设置的output_padding值不可以大于等于s(stride),因为除了每个像素之间的填充以外,在特征图的下面和右边的填充是根据(c+2*p-k)mod\,\, s来计算的,是对s取余,output_padding值也正是设置的这一项,所以output_padding值不可以超过s。

    参考文献https://github.com/vdumoulin/conv_arithmetic

    展开全文
  • 卷积: class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, groups=1...反卷积: class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, o

    卷积:

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

    蓝色为输入,蓝色上的阴影为卷积核(kernel),绿色为输出,蓝色边缘的白色框为padding
    在这里插入图片描述
    反卷积:

    class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, bias=True)
    

    卷积和反卷积函数中的in_channels与out_channels以及kernel_size的含义相同。

    需要注意的是padding和stride和conv2d不同,padding不是蓝色的留白,是kernel像图像中心移动的单位。如下当padding=0时,卷积核刚好和输入边缘相交一个单位。因此pandding可以理解为卷积核向中心移动的步数。 同时stride也不再是kernel移动的步数,变为输入单元彼此散开的步数。
    即:
    padding=0时,卷积核的起始位置和输入层相交一个像素,当padding=1时,卷积核的起始位置和输入层相交2个像素,依此类推;
    stride=1时,输入层元素之间没有间隔,当stride=2时,输入层元素之间间隔为1,stride=3时,输入层元素之间间隔为2,以此类推。

    示意图如下图所示:

    padding=0,kernel_size=3,stride=1
    output_padding是对反卷积后的特征图进行边缘填补0.
    output_padding=0表示不进行填补,output_padding=1表示进行填补一圈0,等于2表示进行填补2圈0.
    在这里插入图片描述

    padding=2,kernel_size=4,stride=1
    在这里插入图片描述
    padding=2,kernel_size=3,stride=1
    在这里插入图片描述
    padding=0,kernel_size=3,stride=2
    在这里插入图片描述
    padding=1,kernel_size=3,stride=2
    在这里插入图片描述
    欢迎留言讨论~ ^ _ ^

    展开全文
  • https://pytorch.org/docs/master/generated/torch.nn.ConvTranspose2d.html#torch.nn.ConvTranspose2d in_channels(int) – Number of channels in the input image out_channels(int) – Number of ...

    https://pytorch.org/docs/master/generated/torch.nn.ConvTranspose2d.html#torch.nn.ConvTranspose2d

    • in_channels (int) – Number of channels in the input image

    • out_channels (int) – Number of channels produced by the convolution

    • kernel_size (int or tuple) – Size of the convolving kernel

    • stride (int or tupleoptional) – Stride of the convolution. Default: 1

    • padding (int or tupleoptional) – dilation * (kernel_size - 1) - padding zero-padding will be added to both sides of each dimension in the input. Default: 0

    • output_padding (int or tupleoptional) – Additional size added to one side of each dimension in the output shape. Default: 0

    • groups (intoptional) – Number of blocked connections from input channels to output channels. Default: 1

    • bias (booloptional) – If True, adds a learnable bias to the output. Default: True

    • dilation (int or tupleoptional) – Spacing between kernel elements. Default: 1

     

    Hout​=(Hin​−1)×stride[0]−2×padding[0]+dilation[0]×(kernel_size[0]−1)+output_padding[0]+1

    Wout​=(Win​−1)×stride[1]−2×padding[1]+dilation[1]×(kernel_size[1]−1)+output_padding[1]+1

    
    m = nn.ConvTranspose2d(16, 33, 3, stride=2)
    input = torch.randn(20, 16, 50, 100)
    output = m(input)
    print(output.shape)

    结果为:

    torch.Size([16, 33, 3, 3])
    torch.Size([20, 33, 101, 201])

    这里我想说一下,与卷积里的weight尺寸是有点出入的(out_chanels, in_channels/groups, kerel_size[0], kerel_size[1])

    而转置卷积中的weight输出尺寸是(in_channels, out_chanels/groups,  kerel_size[0],  kerel_size[1])

    
    m = nn.ConvTranspose2d(16, 32, 3, stride=2, groups=4)
    
    input = torch.randn(20, 16, 50, 100)
    print(m.weight.data.size()) # [16, 8, 3, 3]
    output = m(input)
    print(output.shape) # [20, 32, 101, 201]

    看官方给的例子,可以指定转置卷积的尺寸

    # exact output size can be also specified as an argument
    input = torch.randn(1, 16, 12, 12)
    downsample = nn.Conv2d(16, 16, 3, stride=2, padding=1)
    h = downsample(input)
    print(h.size()) #([1, 16, 6, 6])
    upsample = nn.ConvTranspose2d(16, 16, 3, stride=2, padding=1)
    output = upsample(h, output_size=input.size())
    print(output.size()) # [1, 16, 12, 12]
    output = upsample(h)
    print(output.size()) # [1, 16, 11, 11]

     

    展开全文
  • 转置卷积/反卷积

    2019-03-27 16:04:31
    pytorch中反卷积的函数为: class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1) 参数的含义如下: ...
  • 关于转置卷积(反卷积)的理解

    万次阅读 多人点赞 2018-04-25 23:32:57
    本文地址:... 什么是转置卷积(反卷积)? 转置卷积(Transposed Convolution)又称为反卷积(Deconvolution)。在PyTorch中可以使用torch.nn.ConvTranspose2d()来调用,在Caffe中也有对应的层deco...
  • 深入了解 反卷积

    2019-06-29 14:56:48
    本来想写个叫做 深入理解反卷积,后来一想这不就跟写了“精通C++”一样嘛,就写个了解得了。 首先来看看mxnet和pytorch中的卷积和反卷积是怎么用的: torch.nn.Conv2d(in_channels, out_channels, kernel_size, ...
  • 转置卷积(反卷积)

    2018-12-28 14:29:51
    借鉴于此个博客,写的非常好:... 转置卷积(Transposed Convolution)也叫做反卷积(Deconvolution) Pytorch中可以使用torch.nn.ConvTranspose2d()来调用,caffe中对应的转置卷积层为deconv_layer 作用:...
  • pythorch的反卷积运算

    2019-10-15 12:40:11
    上篇讲了tensorflow 的反卷积操作,本篇对pytorch 的反卷积操作进行讲解: 两者存在着很大的区别 : torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, ...
  • torch.nn.ConvTranspose2d()函数文档中看到的,这个是height的,weight和这个类似 latex公式: H_{out} = (H_{in} - 1) \times \text{stride}[0] - 2 \times \text{padding}[0] + \text{dilation}[0] \times (\...
  • pytorch 反卷积

    2019-05-30 11:35:35
    import torch from torch import nn from torch.nn import init from torch.autograd import Variable import torchvision dconv = nn.ConvTranspose2d(in_channels=1, out_channels= 1, kern...
  • pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下: class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, groups=1, bias=True) class torch.nn.ConvTranspose...问题2: 反卷积
  • PyTorch 反卷积运算(一)

    2021-01-05 01:30:45
    反卷积是一种特殊的正向卷积操作, 通过补零的方式扩大输入图像的尺寸, 接着翻转卷积核, 和普通卷积一样进行正向卷积, 由于前期补充了大量的零, 即便进行了卷积运算, 输出图像的尺寸依然比输入图像大, 这样就达到了...
  • 反卷积(Transposed Convolution) 反池化(Unpooling) pytorch 上采样: https://pytorch.org/docs/stable/_modules/torch/nn/modules/upsampling.html 双线性插值 (bilinear) import torch.nn as nn nn....
  • 转载自: https://zhuanlan.zhihu.com/p/39240159 pytorch中反卷积的函数为: class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, ...
  • 反卷积代码 import numpy as np import torch def zy_deconv(img, in_channels, out_channels, kernels,bias, stride=1, padding=0,output_padding=0): #得到参数 N, C, H, W = img.shape kc,kc_in,kh, kw = ...
  • torch.nn.Conv2d def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros'): Parameters in_channels (int) – Number of ...
  • ConvTranspose2d(反卷积操作)

    千次阅读 2019-07-07 16:11:13
    nn.ConvTranspose2d(反卷积操作) 1,公式: **class torch.nn.ConvTranspose2d(in_channels,out_channels,kernel_size,stride=1,padding=0,output_padding=0, groups=1,bias=Tru...
  • PyTorch 反卷积运算(二)

    2021-02-19 15:53:43
    如果反卷积操作中步长大于1, 那么不仅需要在四周补零, 每行元素和每列元素之间均需要补零 示例-2: 步长为 2 输入数据 1*1*3*3(Batch 和 Channel 均为 1) In [1]: import torch In [2]: torch.manual_seed(5); In ...
  • 卷积的详细解释ConvTranspose2d(fractionally-strided convolutions) https://www.cnblogs.com/wanghui-garcia/p/10791328.html pytorch官方手册:...
  • Pytorch卷积和反卷积的计算公式。

    千次阅读 2019-09-06 18:54:49
    1.torch.nn.Conv2d class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True) 如果输入大小为W * W,那么输出大小:(W− kernel_size+ 2*padding)...
  • class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True) 二维卷积层, 输入的尺度是(N, C_in,H,W),输出尺度(N,C_out,H_out,W_out)的计算方式: ...
  • [PyTorch]PyTorch中反卷积的用法

    千次阅读 2018-12-12 23:56:00
    [PyTorch]PyTorch中反卷积的用法 文章来源:https://www.jianshu.com/p/01577e86e506 pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下: class torch.nn.Conv2d(in_channels, out_channels, ...
  • PyTorch中反卷积的用法

    千次阅读 2019-05-29 22:03:49
    pytorch中的 2D 卷积层 和 2D 卷积层 函数分别如下: class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, groups=1, bias=True) class torch.nn.ConvTranspose2d(in_channels,...
  • def fuse_conv_and_bn(conv, bn):...with torch.no_grad(): # init fusedconv = torch.nn.Conv2d(conv.in_channels, conv.out_channels, kernel_size=conv.kernel_size, stride=conv.stride, padding=conv.padding, gro
  • class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0,output_padding=0, groups=1, bias=True, dilation=1) 参数的含义如下: in_channels(int) – 输入信号的通道数 ...
  • 最近在写毕业设计,突然想起来之前面试某公司的时候,让...注1:其实很多同学,包括我,在写这篇博客之前对这些东西都只是了解了一个大概,比如转置卷积理论上是那样计算的,但是实际到代码中比如torch中的transposeCon
  • 转置卷积(transposed convolution)是一种上采样技术,操作过程是卷积的反过程,也被称作反卷积(deconvolution),但它的操作结果不是卷积的逆。它也可以通过卷积操作来实现,只是需要将卷积核旋转180度。它主要...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

torch反卷积