什么是反卷积层?

数据挖掘 神经网络 卷积网络 卷积
2021-10-04 19:13:52

我最近阅读了 Jonathan Long、Evan Shelhamer、Trevor Darrell 的全卷积网络语义分割我不明白“反卷积层”是做什么的/它们是如何工作的。

相关部分是

3.3. 上采样是向后跨步卷积

将粗略输出连接到密集像素的另一种方法是插值。例如,简单的双线性插值通过仅取决于输入和输出单元格的相对位置的线性映射从最近的四个输入计算每个输出 $y_{ij}$。
从某种意义上说,使用因子 $f$ 进行上采样是小数输入步幅为 1/f 的卷积。只要 $f$ 是整数,一种自然的上采样方式就是反向卷积(有时称为反卷积),输出步幅为 $f$。这样的操作实现起来很简单,因为它只是简单地反转卷积的前向和后向传递。
因此,通过像素损失的反向传播,在网络中执行上采样以进行端到端学习。
请注意,此类层中的反卷积滤波器不需要固定(例如,双线性上采样),但可以学习。一堆反卷积层和激活函数甚至可以学习非线性上采样。
在我们的实验中,我们发现网络内上采样对于学习密集预测是快速有效的。我们最好的分割架构使用这些层来学习上采样以在第 4.2 节中进行精确预测。

我不认为我真的了解卷积层是如何训练的。

我想我已经理解的是,内核大小为 $k$ 的卷积层学习大小为 $k \times k$ 的过滤器。具有内核大小 $k$、步幅 $s \in \mathbb{N}$ 和 $n$ 个过滤器的卷积层的输出维度为 $\frac{\text{Input dim}}{s^2} \cdot n$。但是,我不知道卷积层的学习是如何工作的。(如果有帮助的话,我了解 MLP 是如何通过梯度下降来学习的)。

因此,如果我对卷积层的理解是正确的,我不知道如何将其反转。

有人可以帮我理解反卷积层吗?

4个回答

反卷积层是一个非常不幸的名字,应该被称为转置卷积层

从视觉上看,对于步幅为 1 且没有填充的转置卷积,我们只需用零(白色条目)填充原始输入(蓝色条目)(图 1)。

图1

在步幅二和填充的情况下,转置卷积将如下所示(图 2):

图 2

伟大的可视化的所有学分都归于

您可以在此处找到更多关于卷积算术的可视化

我认为获得卷积背后真正基本层次直觉的一种方法是在输入图像上滑动 K 个过滤器,您可以将其视为 K 个模板,并产生 K 个激活 - 每个都代表与特定模板的匹配程度. 与之相反的操作是采用 K 个激活并将它们扩展为卷积操作的原像。因此,逆运算的直观解释是,粗略地,给定模板(过滤器)和激活(每个模板的匹配程度)的图像重建,因此在基本的直观层面上,我们希望通过模板的掩码来放大每个激活并将它们相加。

理解 deconv 的另一种方法是检查 Caffe 中的反卷积层实现,请参阅以下相关代码位:

DeconvolutionLayer<Dtype>::Forward_gpu
ConvolutionLayer<Dtype>::Backward_gpu
CuDNNConvolutionLayer<Dtype>::Backward_gpu
BaseConvolutionLayer<Dtype>::backward_cpu_gemm

您可以看到它在 Caffe 中的实现与常规前向卷积层的反向传播完全相同(在我比较了 cuDNN 卷积层中反向传播的实现与使用 GEMM 实现的 ConvolutionLayer::Backward_gpu 之后,这一点更加明显)。因此,如果您研究如何为常规卷积完成反向传播,您将了解在机械计算级别上会发生什么。这种计算的工作方式与本简介第一段中描述的直觉相匹配。

但是,我不知道卷积层的学习是如何工作的。(如果有帮助的话,我了解 MLP 是如何通过梯度下降来学习的)。

要在第一个问题中回答您的另一个问题,MLP 反向传播(全连接层)和卷积网络之间有两个主要区别:

1) 权重的影响是局部的,所以首先要弄清楚如何做反向传播,比如说一个 3x3 滤波器与输入图像的一个小 3x3 区域卷积,映射到结果图像中的一个点。

2)卷积滤波器的权重被共享以实现空间不变性。这在实践中意味着,在前向传递中,具有相同权重的相同 3x3 过滤器被拖过具有相同权重的整个图像以进行前向计算以产生输出图像(对于该特定过滤器)。这对反向传播意味着什么,源图像中每个点的反向传播梯度在我们在前向传播期间拖动该过滤器的整个范围内求和。请注意,损失 wrt x、w 和偏差也有不同的梯度,因为 dLoss/dx 需要反向传播,而 dLoss/dw 是我们更新权重的方式。w 和偏差是计算 DAG 中的独立输入(没有先前的输入),因此无需对它们进行反向传播。

(my notation here assumes that convolution is y = x*w+b where '*' is the convolution operation)

逐步数学解释转置卷积如何使用 3x3 滤波器和 2 步长进行 2x 上采样:

在此处输入图像描述

验证数学的最简单的 TensorFlow 代码段:

import tensorflow as tf
import numpy as np

def test_conv2d_transpose():
    # input batch shape = (1, 2, 2, 1) -> (batch_size, height, width, channels) - 2x2x1 image in batch of 1
    x = tf.constant(np.array([[
        [[1], [2]], 
        [[3], [4]]
    ]]), tf.float32)

    # shape = (3, 3, 1, 1) -> (height, width, input_channels, output_channels) - 3x3x1 filter
    f = tf.constant(np.array([
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]]
    ]), tf.float32)

    conv = tf.nn.conv2d_transpose(x, f, output_shape=(1, 4, 4, 1), strides=[1, 2, 2, 1], padding='SAME')

    with tf.Session() as session:
        result = session.run(conv)

    assert (np.array([[
        [[1.0], [1.0],  [3.0], [2.0]],
        [[1.0], [1.0],  [3.0], [2.0]],
        [[4.0], [4.0], [10.0], [6.0]],
        [[3.0], [3.0],  [7.0], [4.0]]]]) == result).all()

斯坦福 CS 课程 CS231n 附带的笔记Andrej Karpathy 撰写的用于视觉识别的卷积神经网络在解释卷积神经网络方面做得非常出色。

阅读本文应该让您大致了解:

  • 反卷积网络 Matthew D. Zeiler、Dilip Krishnan、Graham W. Taylor 和 Rob Fergus 纽约大学 Courant 研究所计算机科学系

这些幻灯片非常适合反卷积网络。