概述
首先卷积神经网络(CNNs)是由一层或多层卷积层然后再连接一个或多层全连接层组成。通常情况下,卷积层后会跟着一个池化层/下采样层。当然也有很多人将卷积操作与池化操作组合起来看做是一个卷积层,如下图。
CNNs能够很好的处理二维数据(比如说图片),我们前面已经说过了,使用卷积层而不是全连接层能够使训练更加容易而且整个网络的参数也会减少。
卷积层的正向传播
假设当前层为卷积层,前一层输入的数据为
M×N
。使用一个
m×n
的核
w
,来进行卷积操作,那么卷积层的输出为
更形象的操作如下图
再经非线性变换后得到: ylij=fl−1(zlij) 。这里的非线性变换就是detector stage。
池化层的正向传播
假设池化层的输入为
M×N
,将
m×n
看做是一个池,其中
m≦M∧M%m=0
,同样对于
N,n
也有同样的要求。那么输出为
Mm×Nn
。
池化操作有很多类型,比如Max-pooling, mean-pooling。 通常情况下,可以将池化操作看做是非重叠的卷积操作,这样可以调用第三方的库进行加速优化,减少工作量。
举个例子,Max-pooling:
有些应用,可能会在之后再添加一个非线性变换,这种情况比较少见。
池化层的反向传播
池化层的下一层可能是全连接层也可能是卷积层,对于全连接层来说,与之前讨论的一样。假设当前池化层为第
l
层,则它的 error term为
//todo 下一层卷积层时的敏感误差项
卷积层的反向传播
卷积层的下一层一般为池化层,卷积层到池化层其实只做了一个池化操作。假设卷积层一共有
k
个 feature maps。卷积层每一个feature maps做一个池化操作,得到
如果想求第
j
个feature map的误差敏感项
上面这个是池化操作后没有经过非线性变换的误差敏感项的求法,但是如果添加一个非线性变换的话,可能会更复杂一些,可以参考Jake Bouvrie的笔记。