Feature Map 上采样方法

一、线性插值

①线性插值

线性插值是针对一维数据的插值方法。它根据一维数据序列中需要插值的点的左右临近两个数据来进行数值估计。当然了它不是求这两个点数据大小的平均值(在中心点的时候就等于平均值)。而是根据到这两个点的距离来分配比重的。

相当于在同一条直线上斜率相等的延伸,如下图:

在这里插入图片描述

先列出等比例公式,然后移项求y,如下图:

在这里插入图片描述

②双线性插值

在这里插入图片描述
如上图所示,我们需要求P点的像素值
我们已知了Q11、Q21、Q12、Q22、P的坐标
Q11、Q21、Q12、Q22的像素值。
所以先用关于X的单线性插值去分别计算R1、R2的像素值:
在这里插入图片描述
在右边的等式中的字母f(Q11)、f(Q12)、f(Q21)、f(Q22)、x1、x2、x都是已知的,求出的f(x,y1)与f(x,y2)即为R1、R2的像素值。
再使用关于y方向的单线性插值计算P点的像素值
得出:
在这里插入图片描述
在右边的等式中的字母y1、y2、y都是已知的,f(x,y1)与f(x,y2)即为上一个式子中求出的R1、R2像素值。

代码如下:

这里我fluid.layers.interpolate方法使用了image_resize方法进行了平替,因为paddle1.8.4以上之后的版本好像删除了interpolate这个方法,我的版本是2.3的

import numpy as np
import paddle.fluid as fluid

def main():
    with fluid.dygraph.guard(fluid.CPUPlace()):
        # data = np.array([[1, 2],
        #                 [3, 4]]).astype(np.float32)
        data = np.array([[1, 2, 3],
                        [4, 5, 6],
                        [7, 8, 9]]).astype("float32")
        print(data)

        data = data[np.newaxis, np.newaxis, :, :]
        data = fluid.dygraph.to_variable(data)
        data = fluid.layers.image_resize(data, out_shape=(6, 6))
        data = data.numpy()
        print(data.squeeze((0,1)))


if __name__ == "__main__":
    main()

运行结果:

在这里插入图片描述
在这里插入图片描述

反池化:

池化操作中最常见的最大池化平均池化,因此最常见的反池化操作有反最大池化和反平均池化,其示意图如下:
在这里插入图片描述

反最大池化需要记录池化时最大值的位置(indices),否则无法进行,反平均池化不需要此过程。如下图是反最大池化

在这里插入图片描述

Transpose Conv(反卷积)

反卷积 = 卷积核翻转180°(先按水平中轴对称翻转,再按垂直中轴对称翻转) + 与output进行padding过后的结果进行卷积

如下图:在这里插入图片描述

代码如下:

import paddle.fluid as fluid
import numpy as np


def main():
    with fluid.dygraph.guard(fluid.CPUPlace()):
        input = np.array([[1, 2],
                          [3, 4]]).astype(np.float32)
        print(input)
        conv_filter = np.array([[1, 2, 3],
                                [4, 5, 6],
                                [7, 8, 9]]).astype(np.float32)
        print(conv_filter)
        input = input[np.newaxis, np.newaxis, :, :]
        conv_filter = conv_filter[np.newaxis, np.newaxis, :, :]
        input = fluid.dygraph.to_variable(input)
        w_init = fluid.initializer.NumpyArrayInitializer(conv_filter)
        param_attr = fluid.ParamAttr(initializer=w_init)
        conv_t = fluid.dygraph.Conv2DTranspose(num_channels=1, num_filters=1, filter_size=3, param_attr=param_attr)

        out = conv_t(input)
        out = out.numpy()
        print(out)


if __name__ == "__main__":
    main()

结果如下:

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

回家种蜜柚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值