目录
反卷积:反卷积可以理解为卷积操作的逆运算,反卷积并不能复原成原图像,因为卷积操作会造成值的损失,它仅仅是将卷积过程中的步骤反向变换一次,因此它还可以被称为转置卷积。
反卷积公式:
如果有空洞:
那么,反卷积是怎么操作的呢?
首先我们看一看正常卷积是怎么计算的。
假设输入为4*4,kernel_size为3*3,padding为0,stride为1
我们都知道卷积的操作就是卷积核在特征图上进行滑动计算(如下图),这个过程是相乘再求和的,那在底层代码中4*4的特征图是怎么和3*3的卷积核进行相乘操作的呢?
先看结论:
图像:
卷积核:
输出:
再看过程:
假设图像尺寸为2*2,卷积核为3*3, padding = 0, stride = 1
反卷积(转置卷积)在底层是怎么计算的呢?其实也是相同的原理
先看结论:
图像:
卷积核:
输出:
再看过程:
由上得出,两个操作的卷积核在形状上是转置的关系(权值不相同),故对图像进行卷积操作,再进行转置卷积,两个图像是不相等的。故该操作是不可逆的。
反池化顾名思义就是池化的逆操作。
对于最大池化的反池化操作:在进行最大池化时,网络会记录最大值的索引位置,如下图max-pooling操作中黄色窗口中(左图)的0.8为最大值,网络会记住该值得索引位置,如右边的4×4网格中的标记所示,这样在进行反池化时,就可以将值放到对应的最大值索引的位置,其余位置补0,如下图uppooling操作黄色窗口(右图)中将1.3放到了之前记录的最大索引的位置,其余位置补0。

如最大池化代码中的return_indices就表示是否保存最大值的索引,以备反池化的时候使用:

反最大池化代码,indices为保存的最大值索引位置

对于平均池化的反池化操作:无需像最大池化那样记录最大值得索引,在反池化时,只需将每个值填入相应的窗口即可。如下图所示:

然后就是插值法,插值的方式有很多种,本文介绍最近邻插值和双线性插值。
最简单的一种插值方法,不需要计算,在待求像素的四邻像素中,将距离待求像素最近的邻像素灰度赋给待求像素。(缺点:输出的图像会有锯齿状)
设i+u,j+v(i,j为正整数,u,v为大于零小于1的小数,下同)为待求像素坐标,则待求像素灰度的值f(i+u,j+v)
公式如下:src为原来的坐标,dst为待求的坐标
如图:图像由原来的3×3变为4×4大小的图像
srcWidth为3;dstWidth为4
以待求图的第一个点(0,0)为例:
srcX = (0*(3/4),0*(3/4))=(0,0)= 234
得出的(0,0)就为原图坐标,则待求点的值就用求出的相对应原图位置的值来代替
以待求图的(3,0)点为例:
srcX = ((3*(3/4),(0*(3/4))=(3*0.75,0)=(2.25)=(2,0)=89
采用四舍五入的方法求最近坐标

①单线性插值


我们根据一个例子来看一下具体是怎么计算的。
将2*2的图片扩大为4*4的图片:

计算①到⑫的值
公式:
,或者上面两个公式都可,计算y的值
注:xi为坐标,yi为xi相对应的值
①:x = 2, x0 = 1, x1 = 4, y0 = 4, y1 = 6

②:x = 3, x0 = 1, x1 = 4, y0 = 4, y1 = 6

③:x = 2, x0 = 1, x1 = 4, y0 = 4, y1 = 10

④:x = 3, x0 = 1, x1 = 4, y0 = 4, y1 = 10

⑤:x = 2, x0 = 1, x1 = 4, y0 = 6, y1 = 8

②双线性插值
双线性插值又叫一阶插值法,它要经过三次插值才能获得最终结果,是对最近邻插值法的一种改进,先对两水平方向进行一阶线性插值,然后再在垂直方向进行一阶线性插值。

参考