转置卷积Transposed Convolution

我们为卷积神经网络引入的层,包括卷积层和池层,通常会减小输入的宽度和高度,或者保持不变。然而,语义分割和生成对抗网络等应用程序需要预测每个像素的值,因此需要增加输入宽度和高度。转置卷积,也称为分步卷积或反卷积,就是为了达到这一目的。

from mxnet import np, npx, init

from mxnet.gluon import nn

from d2l import mxnet as d2l

npx.set_np()

  1. Basic 2D Transposed Convolution

让我们考虑一个基本情况,输入和输出通道都是1,填充为0,步长为1。图1说明了如何用2×2输入矩阵计算2×2内核的。

Fig. 1. Transposed convolution layer with a 2×22×2 kernel.

可以通过给出矩阵核来实现这个运算
K和矩阵输入X。

def trans_conv(X, K):

h, w = K.shapeY = np.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[i, j] = (X[i: i + h, j: j + w] * K).sum()计算结果,它通过内核汇总输入值。而转置卷积则通过核来传输输入值,从而得到更大的输出。

X = np.array([[0, 1], [2, 3]])

K = np.array([[0, 1], [2, 3]])

trans_conv(X, K)

array([[ 0., 0., 1.],

   [ 0., 4.,  6.],[ 4., 12., 9.]])

或者我们可以用nn.Conv2D转置得到同样的结果。作为nn.Conv2D,输入和核都应该是四维张量。

X, K = X.reshape(1, 1, 2, 2), K.reshape(1, 1, 2, 2)

tconv = nn.Conv2DTranspose(1, kernel_size=2)

tconv.initialize(init.Constant(K))

tconv(X)

array([[[[ 0., 0., 1.],

     [ 0., 4.,  6.],[ 4., 12., 9.])
  1. Padding, Strides, and Channels

在卷积中,我们将填充元素应用于输入,而在转置卷积中将它们应用于输出。A 1×1 padding意味着我们首先正常计算输出,然后删除第一行/最后一列。

tconv = nn.Conv2DTranspose(1, kernel_size=2, padding=1)

tconv.initialize(init.Constant(K))

tconv(X)

array([[4.])

同样,在输出中也应用了这个策略。

tconv = nn.Conv2DTranspose(1, kernel_size=2, strides=2)

tconv.initialize(init.Constant(K))

tconv(X)

array([0., 0., 0., 1.],

     [0., 0., 2., 3.],[0., 2., 0., 3.],[4., 6., 6., 9.])

X = np.random.uniform(size=(1, 10, 16, 16))

conv = nn.Conv2D(20, kernel_size=5, padding=2, strides=3)

tconv = nn.Conv2DTranspose(10, kernel_size=5, padding=2, strides=3)

conv.initialize()

tconv.initialize()

tconv(conv(X)).shape == X.shape

True

  1. Analogy to Matrix Transposition

转置卷积因矩阵转置而得名。实际上,卷积运算也可以通过矩阵乘法来实现。在下面的示例中,我们定义了一个3×3× input XX with a 2×22×2 kernel K,然后使用corr2d计算卷积输出。

X = np.arange(9).reshape(3, 3)

K = np.array([[0, 1], [2, 3]])

Y = d2l.corr2d(X, K)

Y

array([[19., 25.], [37., 43.]])

Next, we rewrite convolution kernel KK as a matrix WW. Its shape will be (4,9)(4,9), where the ithith row present applying the kernel to the input to generate the ithith output element.

def kernel2matrix(K):

k, W = np.zeros(5), np.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, kreturn W

W = kernel2matrix(K)

W

array([[0., 1., 0., 2., 3., 0., 0., 0., 0.],

   [0., 0., 1., 0., 2., 3., 0., 0., 0.],[0., 0., 0., 0., 1., 0., 2., 3., 0.],[0., 0., 0., 0., 0., 1., 0., 2., 3.]])

然后通过适当的整理,用矩阵乘法实现卷积算子。

Y == np.dot(W, X.reshape(-1)).reshape(2, 2)

array([[ True, True],

   [ True, True]])

We can implement transposed convolution as a matrix multiplication as well by reusing kernel2matrix. To reuse the generated WW, we construct a 2×22×2 input, so the corresponding weight matrix will
have a shape (9,4)(9,4), which is W⊤W⊤. Let us verify the results.

X = np.array([0, 1], [2, 3])

Y = trans_conv(X, K)

Y == np.dot(W.T, X.reshape(-1)).reshape(3, 3)

array([[ True, True, True],

   [ True, True,  True],[ True, True,  True]])
  1. Summary

· Compared to convolutions that reduce inputs through kernels, transposed convolutions broadcast inputs.

· If a convolution layer reduces the input width and height by nwnw and hhhh time, respectively. Then a transposed convolution layer with the same kernel sizes, padding and strides will increase the input width and height by nwnw and nhnh, respectively.

· We can implement convolution operations by the matrix multiplication, the corresponding transposed convolutions can be done by transposed matrix multiplication.

转置卷积Transposed Convolution相关推荐

  1. tensorflow一维卷积输入_深度学习中的反卷积(Transposed Convolution)

    反卷积(Transposed Convolution)是一种图像上采样(UpSample)的方法,在DCGAN中用它来将随机采样的值转换为一张完整的图像. DCGAN生成手写数字.图片来源[5] Tr ...

  2. 转置卷积transpose convolution

    参考: A guide to convolution arithmetic for deep learning.(Vincent Dumoulin, Francesco Visin).[https:/ ...

  3. 反卷积(Transposed Convolution, Fractionally Strided Convolution or Deconvolution)

    反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其 ...

  4. 【机器学习】详解 转置卷积 (Transpose Convolution)

    目录 一.转置卷积的背景 二.转置卷积的应用 三.转置卷积的区别 四.转置卷积的推导 五.转置卷积的输出 5.1 stride = 1 5.2 stride > 1 ☆ 六.小结 一.转置卷积的 ...

  5. Deconvolution 反卷积 Transposed Convolution 转置卷积 Fractionally Strided Convolution

    看DCGAN时,看到了deconvolution,概念总混淆,记录一下 首先明确以下这几个概念: Transposed convolutional layers (also known as frac ...

  6. 一文搞懂转置卷积(反卷积)

    ↑ 点击蓝字 关注极市平台 作者丨土豆@知乎 来源丨https://zhuanlan.zhihu.com/p/158933003 极市导读 转置卷积在一些文献中也被称为反卷积,人们如果希望网络学习到上 ...

  7. PyTorch 入坑八:卷积与转置卷积

    卷积 操作 略 输入输出尺寸变化 略 PyTorch实现 nn.Conv2d(in_channels,out_channels,kernel_size,stride=1.padding=0,dilat ...

  8. DL之CNN:卷积神经网络算法简介之卷积矩阵、转置卷积(反卷积Transpose)、膨胀卷积(扩张卷积Dilated/带孔卷积atrous)之详细攻略

    DL之CNN:卷积神经网络算法简介之卷积矩阵.转置卷积(反卷积Transpose).膨胀卷积(扩张卷积Dilated/带孔卷积atrous)之详细攻略 目录 卷积矩阵的简介 卷积.转置卷积--Tran ...

  9. 反卷积(Transposed conv deconv)实现原理(通俗易懂)

    什么是卷积 卷积就是把卷积核放在输入上进行滑窗,将当前卷积核覆盖范围内的输入与卷积核相乘,值进行累加,得到当前位置的输出,其本质在于融合多个像素值的信息输出一个像素值,本质上是下采样的,所以输出的大小 ...

最新文章

  1. C++中public protected private关键字
  2. Product Distribution chain id F4 value help的实现
  3. 认识Mahout下的云计算机器学习
  4. ReentrantLock的使用场景
  5. matlab2012 powerlib,matlab没有powerlib2
  6. AJAX 大数据量处理
  7. mysql安装设置mysql字符集utf8及修改密码
  8. asp + Access 常见的数据库访问失败问题 Microsoft JET Database Engine 错误 '80004005' 解决办法...
  9. 二叉树的存储方式以及递归和非递归的三种遍历方式
  10. Vue安装 devTool 时报错的解决办法
  11. CF55D Beautiful numbers
  12. OpenCasCade——给定B样条曲线上的一点,求出过该点的切向量或法向量
  13. iOS面试 swift篇
  14. 中文数字转阿拉伯数字
  15. 第一个包不是SYN包?用科来数据包分析软件排除一次故障。
  16. 网站云服务器 网络拓扑,云服务器网络结构拓扑图
  17. 你的善良必须有点锋芒
  18. 桌面Ubuntu卡死解决方案
  19. 海量智库第5期|Vastbase G100核心技术介绍之「SQL by pass技术」
  20. 区块链技术开发构建大数据征信闭环

热门文章

  1. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)
  2. Linux shell 学习笔记(10)— 处理用户输入(命令行读取参数、读取用户输入、超时处理)
  3. Java使用itext生成Pdf
  4. LeetCode简单题之数组异或操作
  5. LeetCode简单题之通过翻转子数组使两个数组相等
  6. TensorFlow+TVM优化NMT神经机器翻译
  7. Android进程间通信的方式
  8. 深度学习:梯度下降算法改进
  9. Cocos 全局变量的使用
  10. 感受hook里useEffect的执行顺序,hook倒计时