池化层或卷积层后的激活函数?

Posted

技术标签:

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

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

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

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

    network3.py The sourcecode, LeNetConvPoolLayer class

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

【问题讨论】:

【参考方案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】:

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

【讨论】:

以上是关于池化层或卷积层后的激活函数?的主要内容,如果未能解决你的问题,请参考以下文章

狠补基础-数学+算法角度讲解卷积层,激活函数,池化层,Dropout层,BN层,全链接层

手写数字识别python代码 卷积层,池化层,正向传播(relu:激活函数)

学习笔记TF014:卷积层激活函数池化层归一化层高级层

卷积神经网络的 卷积层、激活层、池化层、全连接层

为什么卷积神经网络不是全连接,卷积,池化,激活,损失函数

『TensorFlow』读书笔记_简单卷积神经网络