Pytorch 转置卷积

Pytorch 转置卷积环境使用Kaggle里免费建立的Notebook教程使用李沐老师的动手学深度学习网站和视频讲解小技巧:当遇到函数看不懂的时候可以按查看函数详解。卷积不会增大输入的高和宽,通常要么不变,要么减半。而转置卷积则可以用来增大输入高宽。假设忽略通道,步幅为1且填充为0。输入张量形状为nh×nwn_h\timesn_wnh​×nw​,卷积核形状为kh×kwk_h\timesk_wkh​×kw​。共产生nhnwn_hn_wnh​nw​个中间结果。每个中间结果都是一个(nh+k

大家好,又见面了,我是你们的朋友全栈君。

Pytorch 转置卷积

0. 环境介绍

环境使用 Kaggle 里免费建立的 Notebook

教程使用李沐老师的 动手学深度学习 网站和 视频讲解

小技巧:当遇到函数看不懂的时候可以按 Shift+Tab 查看函数详解。

1. 转置卷积(transposed convolution)

卷积不会增大输入的高和宽,通常要么不变,要么减半。而转置卷积则可以用来增大输入高宽。
在这里插入图片描述
假设忽略通道,步幅为 1 且填充为 0。输入张量形状为 n h × n w n_h \times n_w nh×nw,卷积核形状为 k h × k w k_h \times k_w kh×kw。共产生 n h n w n_hn_w nhnw 个中间结果。每个中间结果都是一个 ( n h + k h − 1 ) × ( n w + k w − 1 ) (n_h+k_h-1)\times(n_w+k_w-1) (nh+kh1)×(nw+kw1) 的张量(初始化为 0)。计算中间张量的方法:输入张量中的每个元素乘以卷积核,得到 k h × k w k_h \times k_w kh×kw 的张量替换中间张量的一部分。
每个中间张量被替换部分的位置与输入张量中元素的位置相对应。 最后,所有中间结果相加以获得最终结果。

中间张量计算公式如下
Y [ i : i + h , j : j + w ] + = X [ i , j ] ∗ K Y[i: i + h, j: j + w] += X[i, j] * K Y[i:i+h,j:j+w]+=X[i,j]K

1.1 为什么称之 “转置” ?

对于卷积 Y = X ★ W Y = X ★ W Y=XW ★ ★ 表示卷积操作)

  • 可以对 W W W 构造一个 V V V,使得卷积等价于矩阵乘法 Y ′ = V X ′ Y^{\prime} = VX^{\prime} Y=VX
  • 这里 Y ′ 和 X ′ Y^{\prime} 和 X^{\prime} YX Y , X Y, X Y,X 对应的向量版本。

转置卷积则等价于 Y ′ = V T X ′ Y^{\prime} = V^TX^{\prime} Y=VTX
如果卷积将输入从 ( h , w ) (h, w) (h,w) 变成了 ( h ′ , w ′ ) (h^{\prime}, w^{\prime}) (h,w)

  • 同样超参数的转置卷积则从 ( h ′ , w ′ ) (h^{\prime}, w^{\prime}) (h,w) 变成了 ( h , w ) (h, w) (h,w)

2. 转置卷积实现

2.1 转置卷积

!pip install -U d2l
import torch
from torch import nn
from d2l import torch as d2l
def trans_conv(X, K):
    h, w = K.shape
    Y = torch.zeros((X.shape[0] + h - 1, X.shape[1] + w - 1))
    for i in range(X.shape[0]):
        for j in range(X.shape[1]):
            Y[i: i + h, j: j + w] += X[i, j] * K
    return Y
X = torch.tensor([[0.0, 1.0], 
				  [2.0, 3.0]])
K = torch.tensor([[0.0, 1.0], 
                  [2.0, 3.0]])
trans_conv(X, K)

在这里插入图片描述

2.2 API 实现

X, K = X.reshape(1, 1, 2, 2), K.reshape(1, 1, 2, 2)
# 前两个参数代表输入通道数, 输出通道数
tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, bias=False)
tconv.weight.data = K
tconv(X)

在这里插入图片描述

2.3 填充,步幅和多通道

与常规卷积不同,在转置卷积中,填充被应用于的输出(常规卷积将填充应用于输入)。 例如,当将高和宽两侧的填充数指定为1时,转置卷积的输出中将删除第一和最后的行与列。

tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, padding=1, bias=False)
tconv.weight.data = K
tconv(X)

在这里插入图片描述

在转置卷积中,步幅被指定为中间结果(输出),而不是输入。

tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, stride=2, bias=False)
tconv.weight.data = K
tconv(X)

在这里插入图片描述

在这里插入图片描述

输入 X X X 的形状,经过卷积后,再经过转置卷积后的形状与原形状相同:

X = torch.rand(size=(1, 10, 16, 16))
conv = nn.Conv2d(10, 20, kernel_size=5, padding=2, stride=3)
tconv = nn.ConvTranspose2d(20, 10, kernel_size=5, padding=2, stride=3)
tconv(conv(X)).shape == X.shape

在这里插入图片描述

2.4 与矩阵变换的联系

X = torch.arange(9.0).reshape(3, 3)
K = torch.tensor([[1.0, 2.0], 
	              [3.0, 4.0]])
Y = d2l.corr2d(X, K)
Y

在这里插入图片描述

将卷积核 K K K 重写为包含大量 0 0 0 的稀疏权重矩阵 W W W 4 × 9 4 \times 9 4×9):

def kernel2matrix(K):
    k, W = torch.zeros(5), torch.zeros((4, 9))
    k[:2], k[3:5] = K[0, :], K[1, :]
    W[0, :5], W[1, 1:6], W[2, 3:8], W[3, 4:] = k, k, k, k
    return W

W = kernel2matrix(K)
W

在这里插入图片描述

Y == torch.matmul(W, X.reshape(-1)).reshape(2, 2)

在这里插入图片描述

Z = trans_conv(Y, K)
Z == torch.matmul(W.T, Y.reshape(-1)).reshape(3, 3)

在这里插入图片描述

3. 再谈转置卷积

转置卷积是一种卷积

  • 它将输入和核进行了重新排列
  • 同卷积一般是做下采样(将高和宽变得更小),而转置卷积通常用作上采样(输出高宽变大)
  • 如果卷积将输入从 ( h , w ) (h, w) (h,w) 变成了 ( h ′ , w ′ ) (h^{\prime}, w^{\prime}) (h,w),同样超参数下转置卷积将 ( h ′ , w ′ ) (h^{\prime}, w^{\prime}) (h,w) 变成 ( h , w ) (h, w) (h,w)

注:
下采样:由输入图片得到特征图
上采样:由特征图得到预测图

3.1 重新排列输入和核

当填充为 0 0 0,步幅为 1 1 1

  • 将输入填充 k − 1 k-1 k1 k k k 是核窗口)
  • 将核矩阵上下、左右翻转
  • 然后做正常卷积(填充 0 0 0, 步幅 1 1 1

( p , s ) = ( 0 , 1 ) (p,s) = (0, 1) (ps)=(0,1)
在这里插入图片描述

当填充为 p p p,步幅为 1 1 1

  • 将输入填充 k − p − 1 k-p-1 kp1 k k k 是核窗口)
  • 将核矩阵上下、左右翻转
  • 然后做正常卷积(填充 0 0 0、步幅 1 1 1

( p , s ) = ( 1 , 1 ) (p,s) = (1, 1) (ps)=(1,1)
在这里插入图片描述

当填充为 p p p,步幅为 s s s

  • 在行和列之间插入 s − 1 s-1 s1 行和列
  • 将输入填充 k − p − 1 k-p-1 kp1 k k k 是核窗口)
  • 将核矩阵上下、左右翻转
  • 然后做正常卷积(填充 0 0 0、步幅 1 1 1

( p , s ) = ( 0 , 2 ) (p,s) = (0, 2) (ps)=(0,2)
在这里插入图片描述

3.2 形状换算

输入高(宽)为 n n n,核 k k k,填充 p p p,步幅 s s s
转置卷积: n ′ = s n + k − 2 p − s n^{\prime} = sn + k -2p – s n=sn+k2ps

  • 卷积: n ′ = ⌊ ( n − k − 2 p + s ) / s ⌋ → n ≥ s n ′ + k − 2 p − s n^{\prime} = \lfloor(n-k-2p+s)/s\rfloor \to n \ge sn^{\prime} +k -2p -s n=(nk2p+s)/snsn+k2ps

如果让高宽成倍增加,那么 k = 2 p + s k=2p+s k=2p+s

3.3 转置卷积与反卷积的关系

数学上的反卷积(deconvolution)是指卷积的逆运算

  • 如果 Y = c o n v ( X , K ) Y=conv(X, K) Y=conv(X,K),那么 X = d e c o n v ( Y , K ) X = deconv(Y, K) X=deconv(Y,K)

反卷积很少用在深度学习中

  • 我们说的反卷积神经网络指的是用了转置卷积的神经网络
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151945.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python缩进错误「建议收藏」

    Python报错TabError:inconsistentuseoftabsandspacesinindentation平台Geany错误原因python的缩进符为四位空格,修改方法:Python报错:IndentationError:unindentdoesnotmatchanyouterindentationlevel依旧是缩进出现问题如图:缩进时四个空格一个不能少!!!…

    2022年4月7日
    59
  • 创客基地oDrive第一课 入门配置

    创客基地oDrive第一课入门配置第1部分硬件准备oDriveV3.6-56V主板 1块12V2.0A电源适配器 1个microUSB线 1条oDriveV3.6主板相关硬件资料可从Q群(732557609)下载。欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器,可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与

    2022年4月13日
    260
  • UE4导入高度图

    UE4导入高度图UE4导入高度图查找高度图使用ps编辑图片打开虚幻引擎的地形编辑器查找高度图可以从百度直接搜索使用ps编辑图片下载下来之后图片是jpg格式的,虚幻引擎不能直接用需要使用ps编辑一下选择图像->勾选灰度和16位通道,注意:如果不勾选灰度,图片有颜色的话,ue生成地形可能出现为题;还有ue只支持16位通道,不要选择其他通道点击文件和储存为,之后出现一个弹窗,填写自己图片的名字,注意图片的格式只能是png和raw,其他格式ue不支持打开虚幻引擎的地形编辑器1.ue4.25的地形在模式

    2022年5月26日
    49
  • navicat15.0永久激活码最新【中文破解版】

    (navicat15.0永久激活码最新)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlECCD1ZV74P-eyJsaWNlbnNlSWQi…

    2022年3月31日
    129
  • Hadoop之hdfs体系结构

    Hadoop之hdfs体系结构4.HDFS的体系结构4.1体系结构解析HDFS采用的是hostname01/slaves这种主从的结构模型来管理数据,这种结构模型主要由四个部分组成,分别是Client(客户端)、Namenode(名称节点)、Datanode(数据节点)和SecondaryNameNode。真正的一个HDFS集群包括一个Namenode和若干数目的Datanode。Namenode是一个中心服务器,…

    2022年5月28日
    33
  • VMM分类_nmm组合

    VMM分类_nmm组合VMM可以分为:完全虚拟化(基于硬件)、宿主虚拟化、混合虚拟化 (1).完全虚拟化VMM虚拟的是现实存在的平台,在客户及操作系统看来,虚拟的平台和现实的平台是一样的,客户机操作系统察觉不到市运行在一个虚拟平台上X86架构的完全虚拟化,经历了两个阶段:软件辅助的完全虚拟化Ringcompression   VMM运行在Ring0,客户及操作系统运行在V

    2022年9月22日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号