首页 > 编程知识 正文

修改transpose里的数组,卷积的逆过程

时间:2023-05-03 23:48:14 阅读:131288 作者:3464

参考: http://www.Sina.com//(vincentdumoulin,Francesco Visin ) ([ https://arxiv.org/ABS/1603.07285 ]

中文: https://占线局域网. zhi Hu.com/p/48501100

1概念转置卷积是指用卷积矩阵的转置矩阵进行卷积。

“反卷积”(Deconvolution )也称为“解卷积”(Deconvolution ),因为反卷积可以将与卷积输出形状相同的矩阵转换为与卷积输入相同的矩阵,也就是说,可以对其进行反运算。 但是,仅靠恢复形状是无法恢复数据的。 因此,一般不建议称为反卷积。

分数卷积(fractionally-stridedconvolution )常常减少图像size (如/2、/4),而反卷积增加图像size (如/0.5、/0.25 )

由于上面的性质,反转卷积经常被用于实现上采样功能,并且还可以用于反向传播的误差梯度返回。

为了清楚卷积,我们先看看卷积。

2卷积2.1二维运算图标

以s=1,p=0为例。

2.2在代数表示中,为了不敲击文字,将输入和kernel缩小如下。

卷积可以表示为:

将二维输入展开为一维向量(im2col操作),写入矩阵形式:

以此方式,二维卷积可视为其中权重窗在一维向量上滑动的窗。 也可以看作系数为0的全连接。

2.3权重矩阵定义权重矩阵如下。

卷积运算可以写如下。

请注意,这个公式不能反算。 也就是说:

不成立

和,众所周知是求之不得的。 因为四个方程,解不出九个未知数。 这也是反卷积不适合被称为反卷积或反卷积的原因。

那么,什么情况下能求得? 举例说明

如果恢复,等式的左侧需要以下内容:

有:

此时,c是正交矩阵,也就是n阶方阵。 输入与输出具有相同的维度。 必须使用11conv或pad=same。

也就是说,进行了不同坐标系的等长变换。

一般不满足正交,且正交卷积的含义也不清楚。 留待讨论。

2.4卷积公式

右边的第一项表示能走几个位置,第二项表示原来的一个位置。

3转置卷积3.1与卷积的关系示例如下。

从上图本身来看,不知道是卷积还是反卷积,但这两个运算的图像是相同的。 图示只能说有上采样作用,可能是倒排卷积。

如上图所示,

1 )如果进行卷积,则i=2、k=3、s=1、p=2、o=4。

2 )如果采用倒排卷积,则i'=2,k=3,s‘=1,p'=2,对应的直接卷积p=k-1-p'=0,o'=4。 也就是说,将倒排卷积视为原始输入4、输出2的卷积的逆运算。

“反卷积”(transpose convolution )与其“直接卷积”(direct convolution )之间的关系如下:

i'=o

o'=i

k'=k

s'=1,始终为1

p'=k-1-p,即p=k-1-p '

以下,从不同的侧面理解转置卷积和导出式。

3.2导出1 :卷积公式的逆变换这是最快导出的方法。 以下是能被整除的情况。

卷积公式如下。

卷积公式如下。

也就是说,只要调换卷积的输入输出即可。

3.3推导2 :倒排卷积也是一种卷积,如下图所示。

卷积的参数被定义为i=5、k=3、s=2、p=0以及o=2

卷积的参数被定义为I’=2、k=3、s’=1、p’=2以及o=5

习惯上把输出整理成的形式,p ',s '是辅助理解的,在编程中不出现。

用卷积公式计算,如下所示。

输入、s表示在每行中插入零,以将其扩展为s行,从左开始指示总共可以扩展多少行;输入1表示最后不能插入0的行

padding :p '的定义不变,保持单侧边界互补零的个数。

所以输出是:

关于p '的意思

p '不是设置的,而是直接根据卷积的参数k、p计算出来的。 而且,如果p '是负数的话还是有意义的。

p '记录了翻转输入(蓝色)边界与原始图(绿色)的有效边界(未填充之前的边界)之间的位置关系。 如下所示。

左图:

原图i=4,k=3,s=1 and p=

0                                     

转置i' = 2, k' = k, s' = 1 and p' = 2

 

左图:原图的最大有效边界,就是比转置输入外扩k-1。这是p=0的情况。

右图:当原图有padding时,例如p=1,则说明原图的有效边界在k-1基础上内移p,即内移到了转置输入边界的k-1-1位置,即p'=k-1-p。如果边界仍然按照k-1计算,则转置输出的边界对应到了原图的padding位置,这个位置是不需要计算的,右图的红色线。

p逐渐增大,有效边界继续内移。甚至当p=100,内移100,此时p'成了负值。表示转置输入边沿都是原图pad的0的卷积结果。

需要注意的是,p'是在转置输入图上移动。

 

其他padding举例:

 

 

3.4推导3:矩阵运算

为了少些字符,同样将输入和kernel写小示意,如下:

代数表示

这里不用im2col展开了,那样很低效。直接使用转置矩阵就可以了。

计算如下:

转置权重矩阵

转置矩阵如下:

由于是卷积运算,所以要先旋转180度再相乘。

公式

满足整除关系时:

通用公式:

 

3.5小结

比如上采样32倍,一般使用设置kernel_size和stride都是32就可以了:

nn.ConvTranspose2d(in_channels, out_channels, kernel_size=32, stride=32)

此时输出是:

o=s(i-1)+k=32(i-1)+32=32*i

因此正好是32倍。

这个kernel_size没有必要和原图对应,因为有时也不一定真的是在下采样后进行上采样,而是只想做个上采样而已,因此也没有原图这个说法。

上采样32倍,也可以设置kernel_size=64,stride=32:

nn.ConvTranspose2d(in_channels, out_channels, kernel_size=64, stride=32)

此时输出是:

o=s(i-1)+k=32(i-1)+64=32*i+32

此时上采样32倍后多了32,因此需要左右各crop掉16。

根据p'=k-1-p,增大k等效于增大了p',因此输出多了补的零,crop是可解释的。

 

4代码 nn.Conv2d


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

nn.Conv2d的功能是:对由多个输入平面组成的输入信号进行二维卷积。输入信号的形式为 ,

(1)参数说明:
N:表示batch size(批处理参数)

:表示channel个数

H,W:分别表示特征图的高和宽。

stride(步长):步长,默认为1,可以设为1个int型数或者一个(int, int)型的tuple。

kernel_size:卷积核的宽度和长度,单个整数或由两个整数构成的list/tuple。如为单个整数,则表示在各个空间维度的相同长度。

padding(补0):控制zero-padding的数目,padding是在卷积之前补0。

dilation(扩张):控制kernel点(卷积核点)的间距;  可以在此github地址查看:Dilated convolution animations

groups(卷积核个数):通常来说,卷积个数唯一,但是对某些情况,可以设置范围在1 —— in_channels中数目的卷积核:

(2)图像尺寸:
经过一次卷积之后,生成的图的大小:(original_size - (kernal_size - 1)) / stride

 

nn.ConvTranspose2d


nn.ConvTranspose2d的功能是进行反卷积操作

(1)输入格式:
nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0,  output_padding=0, groups=1, bias=True, dilation=1)

(2)参数的含义:
in_channels(int) – 输入信号的通道数
out_channels(int) – 卷积产生的通道数
kerner_size(int or tuple) - 卷积核的大小
stride(int or tuple,optional) - 卷积步长,即要将输入扩大的倍数。
padding(int or tuple, optional) - 直接卷积的输入的每一条边补充0的层数,有魅力的巨人都增加2*padding
output_padding(int or tuple, optional) - 输出边补充0的层数,有魅力的巨人都增加padding
groups(int, optional) – 从输入通道到输出通道的阻塞连接数
bias(bool, optional) - 如果bias=True,添加偏置
dilation(int or tuple, optional) – 卷积核元素之间的间距

 

 

 

 

 

 

 

 

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。