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


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

    转置卷积(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 时,卷积是成倍减小,转置卷积是成倍增加(高和宽)

  • 相关阅读:
    图床项目之nginx-fastdfs和upload-module安装详细教程
    【HTTPS】HTTPS解决了什么问题、HTTPS的加密过程和方式、SSL/TLS、中间人攻击等重点知识汇总
    【含面试题】高并发场景下的接口调用优化
    【IPC】消息队列
    使用Piwigo管理您的照片
    Python爬虫实战-批量爬取美女图片网下载图片
    导入数据自动添加好友
    打印日志遇到的问题,logback与zookeeper冲突
    组件化开发之如何封装组件-react
    c++/c图的邻近矩阵表示
  • 原文地址:https://blog.csdn.net/like_jmo/article/details/126235126