1.整体结构
CNN和之前介绍的神经网络一样,可以像乐高积木一样通过组装层来构建。如果不清楚的可以见上一篇博客。利用numpy实现三层神经网络不过CNN中新出现了卷积层(Convolution层)和池化层(Pooling层)。这两个新名字下篇博客中会介绍,这里先介绍下如何组装层以构建CNN。
之前介绍的神经网络中,相邻层的所以神经元之间都有连接,这称为全连接层。另外,用Affine层实现了全卷积层。如果使用这个Affine层,一个5层的全连接层的神经网络就可以通过下图所示的网络结构来实现。
如图所示,全连接的神经网络中,Affine层后面跟着激活层ReLU层(或者Sigmoid层)。这里堆叠了4层“Affine-ReLU”组合,然后第五层是Affine层,最后由Softmax层输出最终结果。
不了解Softmax的可以看看让人头大的激活函数:输出层的激活函数softmax
而CNN是什么样的结构呢?
如上图,CNN中新增了Convolution层和Pooling层。CNN的层的连接顺序是“Convenient-ReLU-(Pooling)”(Pooling层有时会被省略)。这里可以理解为之前的“Affine-ReLU”连接被替换成了“Convenient-ReLU-(Pooling)”连接。另外在最后输出层中使用“Affine-Softmax”组合也是比较常见的。
2.卷积层
CNN中出现了一些特有的术语,比如填充、步幅等。此外,各层中传递的数据是有形状的数据(如,三维数据),这与之前的全连接层网络不同,所以我在刚开始接触时很难理解,接下来我会详细的讲解CNN中使用的卷积层的结构。
2.1全连接层存在的问题
之前介绍的全连接的神经网络中使用了全连接层(Affine层)。在全连接层中,相邻层的神经元全部连接在一起,输出数量可以随意。
但是全连接层就存在数据的形状被忽略了。举个例子:输入数据时图像时,图像通常是高,长,通道方向上的三维形状。但是,向全连接层输入时,需要将三维数据拉平为一维数据。图像是三维形状,这个形状中应该含有重要的空间信息。比如,在空间上临近的像素为相似的值、RGB的各个通道之间分别有密切的关联性、相距较远的像素之间没有什么关联等,三维形状中可能隐藏有值得提取的本质模式。但是,因为全连接层会忽视形状,将全部的输入数据作为相同的神经元(同一维度的神经元)处理,所以无法利用与形状相关的信息。
而卷积层可以保持形状不变。当输入数据是图像时,卷积层会以三维数据的形式接受输入数据,并同样以三维数据的形式输出至下一层。所以在CNN中,可以正确理解图像等具有形状的数据。
2.2卷积运算
相信看了这个图就会明白卷积运算吧。卷积运算以一定间隔滑动滤波器的窗口并应用。这里所说的窗口是指上图中3X3的部分。将各个位置上滤波器的元素和输入的相应元素相乘,然后在求和。然后将这个结果保存到输出的对应位置。将这个过程在所有位置都进行一边,就可以得到卷积运算的输出。
2.3填充
在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0),这称为填充(padding),是卷积运算中经常会用到的处理。比如下图,对大小为(4,4)的输入数据应用了幅度为1的填充。“幅度为1的填充”是指用幅度为1像素的0填充周围。
通过填充,大小为4X4的输入数据变成了6X6的形状。然后,应用大小为3X3的滤波器,生成了大小为4X4的输出数据。这个例子中将填充数设成为了1,不够填充的值也可以为其他任意整数。
2.4步幅
上文中举例卷积运算时默认步幅为1,如果将步幅设置为2
结果就成了这样。