目录

1.反卷积

(1)正常卷积

(2)反卷积

2.反池化

3.插值法 

(1)最近邻插值

 (2)线性插值


1.反卷积

反卷积:反卷积可以理解为卷积操作的逆运算,反卷积并不能复原成原图像,因为卷积操作会造成值的损失,它仅仅是将卷积过程中的步骤反向变换一次,因此它还可以被称为转置卷积

反卷积公式:

如果有空洞:

那么,反卷积是怎么操作的呢?

首先我们看一看正常卷积是怎么计算的。

(1)正常卷积

假设输入为4*4,kernel_size为3*3,padding为0,stride为1

我们都知道卷积的操作就是卷积核在特征图上进行滑动计算(如下图),这个过程是相乘再求和的,那在底层代码中4*4的特征图是怎么和3*3的卷积核进行相乘操作的呢

 

先看结论:

图像:        卷积核:        输出:

再看过程:

  • 针对单张特征图,输入4*4的尺寸会被展平(flatten)成16*1的序列,16为输入特征图的像素个数,1为图片的个数,即单张图片。
  • 将3*3的卷积核进行补0操作,变成与输入大小相同的4*4的矩阵,再展平为1*16,已知输出为2*2大小,故卷积核为4*16的矩阵。其中4为输出特征图的像素数量,16为输入特征图的像素数量。
  • 将4*16的卷积核与16*1的特征图进行矩阵相乘操作,就得到了输出的4*1的序列,再进行reshape操作, 得到最终的2*2的特征图。

(2)反卷积

假设图像尺寸为2*2,卷积核为3*3, padding = 0, stride = 1

反卷积(转置卷积)在底层是怎么计算的呢?其实也是相同的原理

 

先看结论:

图像:        卷积核:        输出:

再看过程:

  • 将输入2*2图片拉成一个一维向量4*1
  • 卷积核由3*3变为2*2,进行剔除操作,16为输出图像的像素值数量,4为输入的特征图像素数量
  • 将卷积核乘图像得到一个16个像素值的一维向量16*1,再进行reshape操作,转为4*4的特征图

由上得出,两个操作的卷积核在形状上是转置的关系(权值不相同),故对图像进行卷积操作,再进行转置卷积,两个图像是不相等的。故该操作是不可逆的。

2.反池化

反池化顾名思义就是池化的逆操作

对于最大池化的反池化操作:在进行最大池化时,网络会记录最大值的索引位置,如下图max-pooling操作中黄色窗口中(左图)的0.8为最大值,网络会记住该值得索引位置,如右边的4×4网格中的标记所示,这样在进行反池化时,就可以将值放到对应的最大值索引的位置,其余位置补0,如下图uppooling操作黄色窗口(右图)中将1.3放到了之前记录的最大索引的位置,其余位置补0。

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

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

 

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

3.插值法 

然后就是插值法,插值的方式有很多种,本文介绍最近邻插值和双线性插值。

  • 计算效果:最近邻插值算法 < 双线性插值 
  • 计算速度:最近邻插值算法 > 双线性插值

(1)最近邻插值

        最简单的一种插值方法,不需要计算,在待求像素的四邻像素中,将距离待求像素最近的邻像素灰度赋给待求像素。(缺点:输出的图像会有锯齿状)

        设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*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

②双线性插值

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

 

参考

上采样方法综述:线性插值,转置卷积,上池化