label的维数决定了预测的种类的数量
一张图片怎么输入计算机中?一个图片的每个点都是由rgb(包括三个不同数值的颜色形成的),所以我们可以将所有数值提取出排列形成矩阵,作为计算机的输入
(扩展:tensor可以理解为维度大于二的矩阵)
设置更多的参数可以增加模型的弹性和能力,但是也更容易造成overfitting 的风险
overfitting的产生条件我们后续会继续介绍
下面我们从不同的视角来构建图片输入方法
视角一:我们在进行输入pattern时有时不需要输入所有的图像,只需要输入小部分的pattern就可以输入网络进行判断
我们可以将所有的输入划分为多个Receptive field,然后分别输入各自的函数
Receptive field的划分方法是不固定的,也可以重叠
Receptive field相关参数的设置方法:
kernel size一般都设置为3*3,如果设置为7*7就有点大了,stride是移动的步长,一般设置小于kernel size的长度,防止有pattern在两个field的交界处,padding是指移动超出范围的空白区域
视角二:同样的pattern可能出现在不同的图片区域
如下图所示,上下两个是不同的neuron,侦测的范围不同,但是做的事情其实是一样的
解决方法:共享参数,两个neuron使用相同的weight,但是输入是不同的,但是两个划分区域一样的neuron是不能共享参数的
我们把两组共用参数的neuron其中共同的参数称为filter1,filter2等等
简化方法总结:fully connected layer的复杂度是最高的,划分receptive field区域降低了复杂度,然后使用共享参数形成convolutional layer进一步降低
fully connected layer适用于各种训练情形,但是convolutional layer可以针对图像训练产生更好的效果,如果用于除了影像之外的训练,要考虑一下训练对象是否有和影像一样的特性,即使model bias大一点也无所谓
Convolutional Layer的另一个解释版本
可以将convolution看作由大量的filter组成的,每一个filter用来定位pattern,channel的模式是由图片的格式决定的,如果是彩色的就是三种rgb,如果是黑白的就是两种
那么我们是怎么通过filter来定位图像的形状的呢?列如已有一个对角线均为1的filter1,然后和黑白矩阵图像相乘,每次移动一个单位继续相乘,从左上角移动到左下角,这样我们就可以看到乘积结果为的说明图片中的该部分3*3矩阵的对角线全为一,这个filter就可以用来侦测对角线为直线的情况
同理,我们还可以设计其他的filter来侦测其他情况,例如filter就可以来探测中间第二列直线的情况
由此可推出有64个filter就会产生有64个channel的新的image,同时,如果有多层的convolution,因为filter的高度就是要处理的影像的维度,列入第一层是只有黑白的一维度影像,而现在要把第一层的convolution输出作为输入,那么新的filter的层数就要变成第一层输出的64维
那这样的处理方式会不会导致处理区域一直是3*3太小了?
不会,当我们处理第二层的concolution的右上角3*3矩阵时,它实际对应的是初始矩阵中的5*5矩阵,所以范围是越来越大的
所以只要network够深,就不要害怕侦测不到比较大的pattern
其实我们的第一种解释和第二种解释说的是同一个事情,filter中的元素就是我们第一种解释方法中共用 的参数
我们说的第一个解释当中,有一个是在不同的receptive fields中使用相同的参数,其实就是第二种解释当中的每个filter都扫过这个图片
总结:
视角三:将一张大的复杂的图片进行简化和缩小,不会改变内部的结构——由此引出Pooling结构
首先介绍Max Pooling
它是指,在filter1和filter和矩阵相乘后形成4*4矩阵,划分为四个小区域,每个区域选择数值最大的那个
这样达到缩小图片的效果
但是这样对细节有点伤害,现在不怎么使用了,因为计算能力足够了
Flatten是指把矩阵中的所有东西拉直
应用:用CNN下围棋
下围棋是一个分类问题,输入棋盘情况,输出下一个位置,这个问题CNN的效果比Fully-connected更好
影像和下围棋的共同之处在于:1,一些重要的pattern只占一小部分 2有同样的pattern出现在期盼上的不同区域,但是下围棋的结构当中并没有使用pooling
CNN并不能处理图像放大缩小或者旋转的问题