【问题标题】:Activation function after pooling layer or convolutional layer?池化层或卷积层后的激活函数?
【发布时间】:2016-06-03 06:38:11
【问题描述】:

这些链接的理论表明卷积网络的顺序是:Convolutional Layer - Non-linear Activation - Pooling Layer

  1. Neural networks and deep learning (equation (125)
  2. Deep learning book (page 304, 1st paragraph)
  3. Lenet (the equation)
  4. The source in this headline

但是,在这些网站的最后一次实施中,它说顺序是:Convolutional Layer - Pooling Layer - Non-linear Activation

  1. network3.py
  2. The sourcecode, LeNetConvPoolLayer class

我也尝试过探索 Conv2D 操作语法,但没有激活函数,它只是与翻转内核的卷积。有人可以帮我解释为什么会这样吗?

【问题讨论】:

    标签: neural-network theano convolution


    【解决方案1】:

    嗯,最大池和单调递增的非线性通勤。这意味着对于任何输入,MaxPool(Relu(x)) = Relu(MaxPool(x))。所以在那种情况下结果是一样的。所以技术上最好先通过最大池化进行二次采样,然后再应用非线性(如果代价高昂,例如 sigmoid)。在实践中,它通常以相反的方式完成 - 它似乎在性能上没有太大变化。

    至于 conv2D,它翻转内核。它完全实现了卷积的定义。这是一个线性操作,因此您必须在下一步中自己添加非线性,例如theano.tensor.nnet.relu.

    【讨论】:

    • 啊对了,结果是一样的(经过今天的实验),猜测可能是因为成本原因才这样实现的。谢谢:)
    • 卷积不是线性运算,这就是为什么如果你去掉所有的非线性,比如 Relu、sigmoid 等,你仍然会有一个工作网络。卷积操作被实现为性能议程的相关操作,并且在神经网络中,由于过滤器是自动学习的,因此最终效果与卷积过滤器相同。除了在 Bp 中,还考虑了卷积性质。因此,它确实是一个卷积操作,正在发生,因此是一个非线性操作。
    • 卷积线性运算,互相关也是。在数据和过滤器中都是线性的。
    • 如果你想添加 CONV->relu->conv->relu-POOL 怎么办。我见过一些这样的结构。
    • 平均池化怎么样?在github.com/adobe/antialiased-cnns 他们使用Conv->Relu->BlurPool
    【解决方案2】:

    在许多论文中,人们使用conv -> pooling -> non-linearity。这并不意味着您不能使用其他订单并获得合理的结果。在最大池化层和 ReLU 的情况下,顺序无关紧要(两者计算相同):

    你可以通过记住 ReLU 是一个元素操作和非递减函数来证明这一点

    几乎每个激活函数都会发生同样的事情(其中大多数是非递减的)。但不适用于一般池化层(平均池化)。


    尽管如此,两个命令产生相同的结果,Activation(MaxPool(x)) 通过减少操作量来显着加快速度。对于大小为k 的池化层,它使用k^2 次激活函数调用。

    遗憾的是,这种优化对于 CNN 来说可以忽略不计,因为大部分时间都用于卷积层。

    【讨论】:

      【解决方案3】:

      最大池化是一个基于样本的离散化过程。目标是对输入表示(图像、隐藏层输出矩阵等)进行下采样,降低其维度并允许对包含在分箱的子区域中的特征进行假设

      【讨论】:

        猜你喜欢
        • 2022-01-05
        • 2018-07-26
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        • 2019-01-30
        • 2017-12-03
        • 2015-05-07
        • 2017-04-02
        相关资源
        最近更新 更多