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

41
这些链接中的理论表明卷积神经网络的顺序为:卷积层 - 非线性激活函数 - 池化层
  1. 《神经网络与深度学习》(方程(125))
  2. 《深度学习》书籍(第304页,第1段)
  3. LeNet模型中的方程
  4. 这个标题中的来源
但是,在这些网站的最后一次实现中,它说顺序是:卷积层 - 池化层 - 非线性激活函数
  1. network3.py
  2. 源代码,LeNetConvPoolLayer类
我也尝试了一下探索Conv2D操作的语法,但没有激活函数,只是用翻转的内核进行卷积。有人能帮我解释一下为什么会这样吗?
3个回答

64

好的,最大池化和单调递增非线性函数可以交换顺序。这意味着对于任何输入,MaxPool(Relu(x)) = Relu(MaxPool(x))。因此,在这种情况下结果是相同的。因此,技术上说,最好先通过最大池化进行子采样,然后再应用非线性变换(如果它很耗费资源,例如sigmoid)。在实践中,通常是反过来做——这似乎并不会对性能产生太大影响。

至于conv2D,它不会翻转卷积核。它实现了卷积的定义。这是一种线性操作,因此您需要在下一步中自己添加非线性部分,例如theano.tensor.nnet.relu。


啊,没错,结果是一样的(经过今天的实验),我猜可能是因为成本的原因实现了这样。谢谢 :) - malioboro
卷积不是线性操作,这就是为什么如果你去除所有的非线性因素,如Relu、sigmoid等,你仍然会有一个工作网络。卷积操作被实现为相关操作,以满足性能需求,在神经网络中,由于滤波器是自动学习的,最终效果与卷积滤波器相同。此外,在Bp中,考虑到了卷积的性质。因此,它确实是一个卷积操作,发生在非线性情况下。 - Hossein
10
卷积是一种线性操作,以及互相关。在数据和滤波器中都是线性的。 - eickenberg
如果你想添加CONV->relu->conv->relu-POOL,该怎么办呢?我曾经看到过这种结构。 - Feras
1
平均池化怎么样?在 https://github.com/adobe/antialiased-cnns 中,他们使用 Conv->Relu->BlurPool。 - mrgloom

24
许多论文中人们使用“卷积 - 池化 - 非线性”的方法。这并不意味着您不能使用其他顺序并获得合理的结果。在最大池化层和ReLU的情况下,顺序并不重要(两者计算的是相同的内容)。

enter image description here

你可以通过记住ReLU是逐元素操作和非降函数来证明这一点。

enter image description here

几乎所有激活函数(大多数都是非递减的)都会发生类似的事情。但对于一般的池化层(平均池化)却不起作用。
然而,这两个命令产生相同的结果,但是Activation(MaxPool(x))通过执行更少的操作显着地加快了速度。对于大小为k的池化层,它使用k^2倍少的激活函数调用。
不幸的是,对于CNN来说,这种优化是可以忽略不计的,因为大部分时间都用在卷积层上。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接