发布时间:2023-08-27 13:00
思来想去,还是回头写下CNN原理吧,也是自己回顾一下,做个总结。
卷积神经网络主要由卷积层、下采样层、全连接层 3种网络构成。。上述三种网络层排列组合可以构建一个完整的卷积神经网络,下图为一个简单卷积神经网络。
输入层->卷积层->下采样层->卷积层->下采样层->全连接层->输出层
即输入,两个卷积+下采样,再接两个全连接,输出
现在我们来通过解释下上图,稍微深入了解下这个简单的CNN网络结构:
输入图像假设为灰度图Grey,对应图像矩阵表示为(w,h,1),1表示单通道,即没有彩色,如果是从彩色图,就有RGB三个通道,就写成(w,h,3),其中w,h对应输入图像的宽和高。
过程:
1、首先将灰度图Grey作为输入层,然后接一个卷积层,第一次卷积后,得到3个特征图(Feature Map),每一个特征图对应一个卷积核(Convolution Kernel,又称滤波器),卷积核可以决定产生几个特征图,如卷积核为3×3就会产生3个特征图,若为5×5则会产生5个,此时网络模型结构变为(w,h,3),其中3个特征图的矩阵也被称为“特征矩阵”,3代表特征矩阵的深度。接着卷积后,到了下采样层,也称为pooling层,下采样层对输入的3个特征图(特征矩阵)进行下采样,长宽减半,得到更小的特征矩阵(w/2,h/2,3)。
2、接着到第二个卷积层,此时卷积核为5×5,所以卷积产生5个特征图,第二次下采样后得到更小的特征图(w/4,h/4,5),不断卷积和下采样过程就是在提取图像高维特征的过程。
3、接着两个全连接层,第一个全连接层与上一层的5个特征图的每个神经元(每个像素)进行全连接,下一个全连接层与上一个全连接层进行全连接,最后一层是输出层,对全连接后的特征向量进行计算,得到分类评分值,然后作为结果输出。
举个例子:假如输入的图像是32*32的灰色猫图像,用来识别猫狗概率,看看它宽、高、通道三个的变化
输入层:(32,32,1)
—>卷积层(卷积核3×3):(32,32,3)
—>下采样层:(16,16,3)
—>卷积层(卷积核5×5):(16,16,5)
—>下采样层:(8,8,5) 即得到(8,8,5)大小的特征向量,一共8×8×5=320神经元
—>全连接层,全连接层
—>输出层(假设激活函数为softmax):假设图像分类选项为(猫、狗),而softmax得出的是概率,则输出得到[0.7,0.3],选择概率最大的,则图像预测是猫
总结: 卷积改变深度,下采样改变宽高
上述卷积核为3×3,常常代码中表示为kernel=3
Padding操作
卷积操作时会遇到在图像边界造成图像信息丢失的问题,Padding操作则是为了解决边界卷积问题问题而提出的。
可分为Same Padding、Valid Padding和自定义Padding3种方法,常用前两种。
Same Padding(padding = “same”)是根据卷积核的大小,对输入图像矩阵进行边界补充(一般填充0),使得卷积后得到的特征矩阵与输入矩阵大小一致,Same Padding方法设置padding参数为1,一般无特殊声明,都默认用Same Padding。Vaild Padding实际上不需要进行Padding操作,Vaild Padding方法设置padding参数为0,使得输出特征矩阵比输入矩阵要小。
自定义Padding生成的特征图要根据公式得出,如下:
input为输入矩阵,padding为边界填充数量,kernel为卷积核大小,stride为步长大小(卷积核移动大小)
图解如下:
矩阵卷积操作
矩阵操作能在计算机中快速且方便的移植到GPU中,极大的减少卷积运算的时间。实际环境中可以通过两步来完成卷积操作:
(1)Im2col算法(Image to column)将输入图像和卷积核转换成规定的矩阵,这个Im2col中间的2表示,输入图像和卷积核这两个对象,最后都要转成矩阵形式,进行矩阵运算
(2)GEMM算法(General Martrix Martrix Multiply—一般矩阵乘法):将转换后的矩阵相乘
首先来讲下Im2col算法,如图
(1)假设输入图像为C×H×W,C为深度,H,W为高和宽,卷积核大小为K*K,卷积核以步长(stride)为1,从左上角开始原图进行特征转换,一直走到右下角,将整幅图转换完毕,每次转换都会得到一个特征向量:C×K×K(卷积核大小为K×K,共C个,不同颜色标出),走完后得到(H×W)个特征向量,组成特征矩阵(H×W)×(C×K×K),该图像转换的特征矩阵记为Feature Matrix。
(2)下面卷积矩阵的操作理解就相对简单了,就是有Cout个C×K×K大小的卷积核,一个卷积核转换出一个C×K×K的特征向量,所以这些特征向量,组成特征矩阵为Cout×(C×K×K)大小,将其称为过滤矩阵(Filter Matrix),因为卷积核又称滤波器。
可见图像核卷积核最终都是要转成矩阵的,因为最终需要矩阵运算
GEMM算法(一般矩阵乘法)
该算法就是将卷积核产生的过滤矩阵 × 输入图像产生的特征矩阵的转置,得到Cout×(H×W)的输出特征矩阵feature map
1、局部感知
2、权值共享
3、下采样技术
大致讲解下则三个核心思想:
局部感知:每一个神经元节点不再与下一层的所有神经元结点相连接(不再是全连接的方式),只与下一层的部分神经元进行连接,即连与自己相关的,不再全连。
权值共享:一组连接可以共享一个权重参数,或者多组连接共享一个卷积核,不再是每条连接都有自己的权重,即如果多个连接对应的权重相同,就只要连接同一个权重,而不是每个连接都要一个相同的权重。
下采样pooling:通过pooling技术对输入的数据进行下采样压缩操作,减少输出结点。
常用pooling方法有两种:最大池化(Max Pooling)与均值池化(Mean Pooling),图解如下
总结:CNN通过局部感知和权值共享,保留了像素间的关联信息,有联系的才连接,而不是全连接,大大减少了所需参数的数量。通过pooling技术,进一步缩减网络参数数量,提高模型的鲁棒性。上面三项技术,主要就是为了减少运算时参数的数量,缩减图像尺寸(pooling),减少计算量,提升计算速度。
讲解完毕,需要代码实践的可以看看卷积神经网络中最经典的模型LeNet5模型,该模型是第一个成熟的卷积神经网络模型,主要用于手写体识别,拿来练练手。
LetNet5模型手写体识别链接:https://blog.csdn.net/weixin_39615182/article/details/109637561