这些链接的理论表明,卷积网络的顺序是:Convolutional Layer - Non-linear Activation - Pooling Layer
。
但是,在这些网站的最后一次实施中,它说订单是:Convolutional Layer - Pooling Layer - Non-linear Activation
我也尝试过探索Conv2D操作语法,但是没有激活函数,它只是与翻转内核的卷积。有人可以帮我解释为什么会这样吗?
好吧,max-pooling和monotonely增加的非线性通勤。这意味着任何输入的MaxPool(Relu(x))= Relu(MaxPool(x))。因此在这种情况下结果是一样的。因此,最好先通过max-pooling进行子采样,然后应用非线性(如果成本很高,例如sigmoid)。
至于conv2D,它不会翻转内核。它完全实现了卷积的定义。这是一个线性操作,因此您必须在下一步中自己添加非线性,例如theano.tensor.nnet.relu
。
在许多论文中,人们使用conv -> pooling -> non-linearity
。这并不意味着您不能使用其他订单并获得合理的结果。在max-pooling layer和ReLU的情况下,顺序无关紧要(两者都计算相同的东西):
您可以通过记住ReLU是元素操作和非递减函数来证明这种情况
几乎每个激活函数都会发生同样的事情(大多数都是非递减函数)。但是对于一般的池化层(平均池)不起作用。
尽管如此,两个订单产生相同的结果,Activation(MaxPool(x))
通过减少操作量来显着提高速度。对于大小为k
的池化层,它使用k^2
次数减少对激活函数的调用。
遗憾的是,这种优化对CNN来说可以忽略不计,因为大部分时间用于卷积层。