目录
摘要
Abstract
一、什么是CNN
二、Image Classification
三、Observation 1
一、Simplification 1
四、Observation 2
五、Benefit of Convolutional Layer
六、Convolutional Layer
七、Multiple Convolutional Layers
八、Comparison of Two Stories
九、Observation 3
十、Pooling-Max Pooling
总结
卷积神经网络(CNN)是一种馈前神经网络,其采用卷积、池化和全连接等结构,在图像分类、目标检测、语义分割等视觉任务上有着广泛应用。CNN主要由卷积层、池化层和全连接层组成。卷积层使用卷积核对输入进行卷积运算,可以自动学习输入的空间特征。池化层对卷积层输出进行下采样,用于降维和提取主要特征。全连接层用于分类或回归任务。
Convolutional neural networks (CNN) are feedforward neural networks that use convolution, pooling, and fully connected layers. CNN have been widely applied in computer vision tasks such as image classification, object detection, and semantic segmentation.CNN mainly consist of convolutional layers, pooling layers, and fully connected layers. Convolutional layers use convolutional kernels to perform convolution operations on the inputs, which can automatically learn the spatial features of the inputs. Pooling layers perform downsampling on the outputs of convolutional layers, which are used to reduce dimensions and extract the main features. Fully connected layers are used for classification or regression tasks.
CNN全称是卷积神经网络(Convolutional Neural Network),是一种馈前神经网络,其架构包含卷积层、池化层和全连接层。常用于图像分类、自然语言处理等领域
CNN主要包含以下几种层:
1. 卷积层(Convolutional layer):使用卷积核对输入进行卷积操作,提取输入的纹理特征。卷积层通过局部连接和权值共享减少了参数数量。
2. 池化层(Pooling layer):对卷积层的输出进行降维,提取主要特征。常用的池化方式有最大值池化、平均池化等。
3. 全连接层(Fully connected layer):对高维输入进行分类或者回归。
4. 激活函数层(Activation function layer):引入非线性,一般在各层的输出上引入,如ReLU、Sigmoid等。
5. 规范化层(Normalization layer):对激活值进行规范化,如批规范化(Batch Normalization)等。
输入一张图片,经过一系列的model,得到输出一个矢量y,然后再把y丢入softmax函数,得到,然后计算与真实值之间的Cross entropy(交叉熵),然后得出输入的图片是什么物种。其中矢量y可以有成千上万个dimension,一个dimension代表一个物种。
那么如何把一张图片作为输入交给model来处理呢?一种简单暴力的方法,就是把图像拉直,假定所有的图片都是100*100大小的,然后维度是一个3维的tensor。tensor是一种用于描述线性关系的量,可以看成是一个多维数组。3个channels分别为RGB。
如果把这100*100*3个数据都作为输入的话,每一个输入经过一个neuron都会有一个weight,那么它就会有3*个未知参数,有这么多未知参数,那它的弹性肯定是很大的,但是这也就导致了会有很大的可能性发生overfitting,那么我们一定要用Fully Connected Network吗,有没有其他优化方式代替这种全连接呢?
我们真的需要观察整个图像吗?其实我们并不需要用整个图像来作为我们model的输入,我们可以选择一些pattern来作为输入,其实人们也是通过观察一些关键点的方式来确定图片中的动物是何物种的,这样的话neuron就不需要整个图片的信息,只需要这些关键点的信息即可。而这些pattern也比整个图像会小很多。
把这些pattern作为输入的话,我们可以用下图中的方式,将图片中的信息输入给model,每一个receptive field都是3*3*3,那么输入就是3*3*3个数据,就只会有3*3*3个weights,这样就会大大降低model的弹性,降低它的复杂度。
现在有以下几个问题需要回答:
1、不同的neurons可以使用不同大小的receptive field吗?
答案是肯定的,我们的receptive field可以是3*3*3的,也可以是5*5*3的,这是由我们自己来定义的。
2、不同的channels能有重叠吗?
答案是肯定的,我们的输入也会有在不同的receptive field中的重叠部分。
3、receptive field可以是长方体吗?
答案也是肯定的,不同形状也是由我们自己来定义的。
那么一种typical setting就是下面这种形式:每一个receptive field都有一组neurons,我们需要把receptive field覆盖整个图像,那我们需要怎么做呢?我们可以定义一个stride,不如说把stride定义为2,则第一块receptive field向右移动2个位置,就会得到第二个receptive field,其中第一个receptive field和第二个receptive field中也会有重叠部分,如果再向右移动两个单位,会出现缺数据的情况,这时候我们只需要补数据就可以,具体补什么数据,也是由自己来决定。
同样的pattern可能会出现在图像中的不同位置,虽然receptive field会覆盖整个图像,这种问题也能得到解决,但是如果把相同的pattern经过不同的model计算,这样是否也可以进行简化呢?
解决办法就是,我们可以把不同位置的receptive field经由相同的model来计算,也就是做到参数共享,这样虽然我们的model一样,但是由于我们的receptive field并不完全一样,所以得到的结果也不一定是相同的,所以这种方法是可行的。
一种Typical Setting是这样的:每一个receptive field都有一组neurons,每一个receptive field的neurons都有一组相同的未知参数,这组参数叫做filter。
Fully Connected Layer会有很大的弹性,加入Receptive field和Parameter Sharing后就得到 Convolutional Layer, Convolutional Layer会有很大的model bias,但是在图像分类领域中,这并不是一件坏事。
Convolutional Layer是指它里面有一组filter,filter的作用是去到图片里面抓取某一个pattern,pattern的大小要在filter的范围内。如果是色彩丰富的图片的话,那它的channel就是3,如果是黑白图片的话,那它的channel就是1,也就是一个2维矩阵。假定现在的图片是黑白的。
如果stride设为1,假定Filter 1中的数据都是经过gradient计算好的,是我们现在已知的,那么用每一个3*3的矩阵去跟Filter 1中对应的数据相乘并相加,得到以下数据。
然后对每一个Filter做同样的操作,有多少组Filter,就会得到一个多少群的数据,我们把其成为Feature Map。
Convolution是可以叠很多层的,也有一堆的filter。如果filter的大小一直设3*3,是不会影响network看大范围的pattern。
Neuron是把图片分为很多个Receptive field,然后不同的Rceptive field可以共用一组参数。而Filter是要考虑整个图片,与不同的矩阵做内积。
我们对图片做subsampling是不会改变图像中的object的。
如果我们把得到的数据取Max Pooling,比如说把数据分为2*2的矩阵,那么我们只会取每一个模块的最大值,这样,我们就会简化数据量。
如果把Convolutional Layers加上Pooling的话,就能得到以下结果。但是Pooling并不是一定需要使用的,随着我们计算能力的增强,一般情况下都是不用Pooling,而且在某些特定情况下,也不会去使用Pooling,比如说在五子棋中,如果使用Pooling的话,肯定会影响结果的准确率,所以是否使用Pooling还是要看具体情况。
本周,我主要对CNN的基本内容进行了学习,我发现CNN在图像识别领域应用是十分广泛的,下周我将会学习spatial transform layer,并学习一些代码内容。