卷积神经网络其实和普通的神经网络的区别在于它的输入不再是一维的向量了,而是一个三维的向量,为什么是三维的呢?这是因为图片有三个通道R,G,B。那么输出是什么呢?输出可以认为是一维的向量,比如说那图片分类举例,分为K类的话,输出就是K维的向量。
卷积神经网络的基本结构如下:
如上图所示,第一层为输入,第二层为卷积层,卷积层就是用来做上一节所说的卷积操作那件事。第三层为非线性变换层,和普通的神经网络的激活函数没什么区别。第四层为池化层,它的作用是降低卷积层输出的尺寸,因为卷积层输出的数据相对来说消耗的计算资源比较大,我想把它降维,另外一方面我有很多的参数相对来说是比较冗余的,在图像的邻域来说。最后一层为输出层,也叫全连接层,应该和普通的神经网路没什么区别吧。
第一个部分:
看上图,比如说只有200*200的单通道图像,隐藏层有40K个神经元的话,那么输入层和隐藏层之间的权重参数有多少个呢?可以算出有200*200*40000个参数,这是多么大的参数啊,达到了billion的级别。
再看上边这张图,假设这40K个每个神经元只与图片中一小部分区域进行链接,比如说10*10的区域进行连接,这10*10的区域可能是上图中人物领带的区域,与这部分区域进行卷积后所得到的结果比较大,那么这时候需要的参数是多少呢?答案是10*10*40K个参数,4个million个参数
上述中所说每个神经元只关注图像中的一部分区域,但是这些神经元(即特征算子)应具有一定的鲁棒性,什么是鲁棒性呢?比如拿识别图像中毛发的神经元来说,它不能仅仅只能识别出上图中人物的右半边的头发,也应该能识别出人物的左半边头发,胡子,眉毛等毛发。这个神经元可以拿了别的部位的很多参数,进而可以识别出毛发等特征。这叫做参数共享。同样的拿100个特征算子(即神经元)来讲,他们可能是人物的眼睛,鼻子,头发,耳朵,肩部,领带····的特征,那么我们拿这100个特征算子作为神经元的话,参数有多少个呢?100*10*10个参数。这10K个参数比以上两个参数要少很多。这100个神经元也拿了别的部位的参数,来进行共享,替代了那40K个神经元。这是卷积层的特性吧(这里好像没弄懂。。。)
针对上图中的问题,答案应该是多少个呢?问的是如果卷积模板的尺寸为5*5大小的,那么第一个卷积层的参数应该有多少个?答案是75个,为什么呢?拿单通道的图像来说,用5*5的卷积模板来说,单通道就有25个参数,那么三通道的图像呢?显然会有25*3个参数,这三个通道中每个卷积模板的参数肯定是不相同的,因为RGB三个通道的灰度就不相同,肯定不能用三个参数相同的卷积模板。所以第一个卷积层有75个参数。
上述问题是输入卷积层的尺寸为16*16*20,我们卷积模板的尺寸为3*3,有10个这样的特征图(或叫神经元),那么在这个卷积层里的参数有多少个?答案是3*3*20*10个。好像可以理解为下图吧。
第二个部分:
上图来说,7*7的输入,卷积模板的大小为3*3,卷积每次滑动的步长为1,那输出的尺寸是多少呢?为5*5.
那滑动步长为2呢/。输出为3*3大小。如果步长为三,好像不能做这件事,不能滑动。那这里有个公式如下图:
针对上图输入,输出的体积为多少呢?答案为(32-5)/1 +1 =28, 所以输出的大小为28*28*5,因为1个卷积模板输出的大小为28*28,那这里5个这样的神经元,所以要再乘上5。卷积模板的个数其实就是这一层的输出通道的个数,也称为厚度。动态计算图可参如下:
那么在上述28*28*5个神经元中,有多少个参数呢?5*5*3*5个参数,其中一个神经元是5*5*3,有5个这样的神经元,所以还要乘上5.