池化层或卷积层后的激活函数?
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层,全链接层