convolutional neural network
图像分类
假定输入图片的大小是固定的 (把所有图片都rescale成大小一样再输入)
把每个类别表示成一个one-hot的vector,这个dimension的长度就决定了模型可以辨识出的种类(复杂度)
怎样把一张图片当作一个模型的输入:把一张图片视为一个三维的tensor(维度大于2的矩阵),一张彩色的图片每一个pixel都是由rgb三色组成,这三个channel代表了三个颜色,长宽就是图片的解析度。把这些代表pixel中颜色强度的数值拉出来成为一个向量,就是network的输入。
![](https://i-blog.csdnimg.cn/blog_migrate/414806f23aed72aba4320077f405a17c.png)
4.这样多的参数会增加模型的弹性,就会有overfitting的风险。考虑图像辨识的特性(不需要识别整张图像,可以通过识别重要的pattern来进行识别),所以不需要每个neuron都把整张图当作输入,只需要把图片的小部分作为输入,识别关键pattern就可以了。
(1)receptive filed
每个neuron只需要关心自己的receptive filed就行。
![](https://i-blog.csdnimg.cn/blog_migrate/1d5f2643baa1eb475d7c7a6372cb14c8.png)
把这 3×3×3 的数值拉直,变成一个长度是 3×3×3 也就是 27 维的向量,再把这 27 维的向量作為这个
Neuron 的输入。
这个 Neuron 会给 27 维的向量的,每一个 Dimension 一个 Weight,所以这个 Neuron 有 3×3×3 27个
Weight。
再加上 Bias 得到的输出,这个输出再送给下一层的 Neuron 当作输入。
在设定上,可以设定不同的neuron守备同一个receptive filed,用于侦测不同的pattern,也可以设定不同的或者重叠的receptive filed。可以设定receptive filed的大小(一般是2*2、3*3、4*4),形状,连续性,但要注意考虑输入的特性。
经典的receptive filed
一般图像辨识会考虑全部的channel,在设定receptive filed的时候只要考虑长宽,不用考虑深度,这个高和宽结合起来叫做kernel size(一般设定为3*3)。一般同一个 Receptive Field,往往会有一组Neuron 去守备它。
不同receptive filed之间是相邻的,一个receptive filed移动一点来创造另一个receptive filed,这个移动距离叫做stride。stride也是一个hyperparameter(一般为1或者2)。
当receptive filed移动超出图像时,就做padding,即补值,有很多补植的方法,比如补零。
![](https://i-blog.csdnimg.cn/blog_migrate/bd719dd2e71d50008cc81f96868d543a.png)
(2)parameter sharing
同样的pattern可能会出现在图片不同的区域,在不同的守备区域都会有守备同一pattern的neuron,但是这样参数量就会太多。
在处理图像时,让不同 的receptive filed的neuron共享参数,即两个neuron的weights完全一样。(但是因为输入不同所以输出不会一样)
就是说每个receptive filed都只有一组参数,这些参数就叫做filter。
![](https://i-blog.csdnimg.cn/blog_migrate/e7b863c04b40770ce9d0749933945683.png)
5.总结
Receptive Field 加上 Parameter Sharing,就是 Convolutional Layer,用到convolutional neuron的network,就是CNN。实际上CNN的model bias是很大的(receptive filed和parameter sharing都限制了模型的弹性),但model bias小,model的flexibility很高的时候(比如fully connected network),就很容易over fitting,实际上CNN是针对图像的特性而设计的,所以虽然它的bias很大,但它在图像上的表现会比较好。
另一种说法
一个Convolutional Layer里面有很多的filter(n*n*channel size),其作用就是到图片里面抓取一个pattern。
假设channel为1。
假设这些filter的参数是已知的(实际上这些tensor里的值是未知的,需要通过gradient decent去learn),把filter放在图片上,进行运算(对应位置相乘相加)、移动(移动距离叫做stride)。
![](https://i-blog.csdnimg.cn/blog_migrate/56102b66f4d3b615fffb0757ec12762f.png)
每一个filter都会给一组数字,这群数字叫做feature map。这个feature map可以看作一个新的图片,它的channel就是filter的数量。
Convolutional Layer可以叠加很多层,在第二层的Convolutional Layer里面也有一群filter,它的输入就是4*4*filter number(以图为例)。第二层的输出也可以得到一个新的feature map。
可以发现network叠的越深,每个filter所能看到的部分在原图像就越大。
![](https://i-blog.csdnimg.cn/blog_migrate/26981a0c2bef7a9009b78a13755ea311.png)
filter扫过一张图片就是convolution。实际上也就是不同的receptive filed,neuron可以共用参数,共用的参数就叫做一个filter。
6.pooling
把一张较大的图片做subsampling(比如把偶数的行和奇数的列拿掉),图片会变成原来的1/4,但不会影响图片的表现。pooling就有一点像一个activation function,因为里面没有参数,知识设定好的一个操作行为。
eg.max pooling
把filter里面的数字分组,然后取其中最大的一个来代表这一组数字。(分组也是自己决定,pooling的方法也可以自己决定)
![](https://i-blog.csdnimg.cn/blog_migrate/12c7022b884c1e6fa7d2844bf21d5f81.png)
一般在convolution之后会搭配pooling(交替使用),pooling就是把图片变小(不改变图片的channel)。
pooling主要是为了减少运算量,实际上还是会伤害performance,如果运算资源足够支撑的话,也可以选择不做pooling。
7.the whole CNN
把pooling output叫做flatten,就是把图像中排成矩阵的东西拉直,再把这个向量丢进fully connected layer里面去做辨识,然后可能还需要一个softmax得到辨识的结果。
![](https://i-blog.csdnimg.cn/blog_migrate/1461ba07f9735ff3a72ee32d9ab02243.png)