• 动手学深度学习_转置卷积


    卷积是一种下采样操作,可以减少输入图像的空间维度(高和宽)。

    转置卷积(transposed convolution),可以看作是卷积的逆,是一种上采样操作,增大特征图的空间维度(高和宽)。注意这里卷积的逆只针对图像大小,图像中的值发生改变。

    卷积

    一个最简单例子演示转置卷积如何工作:设步幅为 1 且没有填充。 假设我们有一个 n_{h} \times n_{w} 的输入张量和一个 k_{h} \times k_{w} 的卷积核。 以步幅为 1 滑动卷积核窗口,每行 n_{w} 次,每列 n_{h} 次,共产生 n_{h}n_{w} 个中间结果。 每个中间结果都是一个 (n_{h}+k_{h} -1) \times (n_{w}+k_{w} -1) 的张量,初始化为 0 。 为了计算每个中间张量,输入张量中的每个元素都要乘以卷积核,从而使所得的k_{h} \times k_{w} 张量替换中间张量的一部分。最后,所有中间结果相加以获得最终结果。

    逐步实现: 

    1. def trans_conv(X, K):
    2. h, w = K.shape
    3. Y = torch.zeros((X.shape[0] + h - 1, X.shape[1] + w - 1))
    4. for i in range(X.shape[0]):
    5. for j in range(X.shape[1]):
    6. Y[i: i + h, j: j + w] += X[i, j] * K
    7. return Y

     简单实现:

    nn.ConvTranspose2d(1, 1, kernel_size=2, bias=False)

    填充

    在转置卷积中也可以添加padding操作,但是这里的padding不是向以前的卷积中的可以放大输入。可以理解缩小输入。

    举例:转置卷积的 padding 设置为 1 时,转置卷积的输出中将删除第一和最后的行与列。

    正常的是 input -> padding -> conv -> output 。

    转置卷积就是 input -> deconv -> depadding -> output 。过程完全逆运行。

    步幅

    看懂前面简单的转置卷积,那步长也没什么难点。

    nn.ConvTranspose2d(1, 1, kernel_size=2, stride=2, bias=False)

    通道 

    通道更简单,使用方法完完全一致

    1. conv = nn.Conv2d(10, 20, kernel_size=5, padding=2, stride=3)
    2. tconv = nn.ConvTranspose2d(20, 10, kernel_size=5, padding=2, stride=3)

    总结:

    卷积的变换:n_{output} = \left \lfloor (n - k+2p+s)/s \right \rfloor

    转置卷积:n_{output}= sn+k-2p-s

    当 k = 2p + s 时,卷积是成倍减小,转置卷积是成倍增加(高和宽)

  • 相关阅读:
    vue3通过ref获取子组件defineExpose的数据和方法
    MySQL数据库同时查询更新同一张表的方法
    汽车与交通运输行业智能车辆体验 | 达索系统百世慧®
    【编程题】【Scratch四级】2019.12 随机选T恤
    若依-匿名注解@Anonymous解析
    安卓定时任务单例
    NeurIPS 2022 | 基于实例等价性的知识图谱补全
    mysql_命令行启动_win10
    Android Radio实战——打开Tuner(十八)
    BDD - SpecFlow ExternalData Plugin 导入外部测试数据
  • 原文地址:https://blog.csdn.net/like_jmo/article/details/126235126