最近一直觉得对于卷积神经网络的整个流程不太清楚,所以又重新学习一遍后在这里做一个总结,让自己条理更清楚点。主要是看了李宏毅的课程以及邱锡鹏的《神经网络于深度学习》后结合来写的。emmm,里面的一些概念可能没有特别完整的说明,多为文字叙说,大家可以去看书。
总体框架:
我们知道CNN主要运用于图像处理方面,所以其实CNN最主要的任务就是要将一个三维图像拉伸成一个一维向量,方便进行分类识别。整体黑箱图应如下:
演变过程:
前面学习知道最开始是使用前馈全连接网络来进行训练的。但是因为全连接会导致参数非常多,不仅计算量大,同时还容易导致过拟合(overfitting),这时候就想到要降低一点模型的弹性,采用一部分一部分(pattern)的看,这时候就出现了卷积核(kernel),卷积核里面的值就是我们的权重(weight)。而卷积核的运用实际上我们就可以将其看作是一个滤波器(filter)。通过卷积核在图像上遍历过后,我们就可以得到该输入图像的一个特征图(feature map),里面最大值对应的原图像的部分,其实就是我们要找的目标所在。
后续发展过程中,发现尽管使用了卷积层,但还是存在参数过多的问题。这时候根据图像本身的特性(我们对图像进行一个按比例的缩小,不影响我们对整个图像的识别,只是清晰度低了点,类比超清和标清hhh~),提出了池化层(Pooling Layer)。池化层主要作用就是按一定比例缩小输入图像(也可以理解为在采样)。池化操作就是比如将所有的偶数像素拿掉,得到的图像就变为了原来图像的1/4。在上述的卷积(convolution)操作之后,可以再对其进行一个池化操作,降图像进一步缩小,但是channel不变。所以一般会几个卷积层后加一个池化层。但是会导致图像细节的丢失,它最开始出来还是为了减少计算量。如果算力足够可以不用。目前的前沿模型上其实也不咋用池化层了,毕竟还是会损失一定的精度。相关内容——“邱,P119”
步骤:
整个卷积神经网络模型的步骤应该是:(以LeNet为例)
1.输入图像经过crop/wrap操作(剪切合并操作)后,将不同大小的图像统一为指定格式图像后输入。
2.经过卷积操作,得到特征图。
3.经过池化层,缩小特征图。
4.进入全连接层,通过全连接层输出成一维向量。(现在慢慢的不再用全连接层,全部使用卷积层了,比如用一个1x1的卷积核对应的卷积层来取代全连接层,有兴趣可以去看看相关论文)
5.Softmax进行分类(这一步我还没搞懂hhh)
遇到问题:
对于参数学习过程:
其实卷积操作的参数学习过程跟前面学习的是一样的。我们的weight就是卷积核里面的值,并且卷积层在输出时,也会有一个传入激活函数的过程,在这之前就会加上偏置b。而参数学习就是求偏导,卷积操作中的求偏导还是利用反向传播来求,具体见书P120。
结语:
太难了太难了,求大佬带带我!如有侵权,立即删除!