Convnet介绍(1)

最近准备开始进军deep learning这个深坑了!最开始还是要从卷积神经网络看起。最近刚刚翻到一篇讲解convnet非常好的文章,决定在此翻译下来。供参考学习。

(附原版文章地址链接:http://cs231n.github.io/convolutional-networks/#pool)

卷积神经网络(CNNs/ConvNets)

    卷积神经网络与传统的神经网络非常类似:他们是由一系列可以被训练的神经元组成(可训练的部分为权重(weight)与偏置(bias))。每一个神经元接收一些输入,然后通过点乘和一些非线性变换(如:reLu,sigmoid函数,tanh等等)。整个网络可以模拟出一个可微分的打分函数:以原始的图像像素为输入,以各个类别的分数为输出。CNN在最后一层通常也有损失函数(loss function)(比如SVM/softmax),这点跟传统的神经网络非常像。
    那么CNN跟传统神经网络有什么区别?本文的CNN假设输入为图像,这样就可以从图像的角度来改进网络,使得整个网络实现起来更加有效,同时减少了训练参数的数目。

一、整体介绍

    回忆:传统的神经网络。传统的神经网络输入一个向量,通过隐藏层对这个向量做若干次变换,最后输出结果。每一个隐藏层是由一系列的神经元构成,每一个神经元与上一层的神经元 全部链接,同一层的神经元之间不相互连接。最后一层为输出层,对于分类问题来说,输出层输出各个类别的分数。
    传统神经网络对于大型图像来说并不适用。举个例子来说,在CIFAR-10的数据集中,图像的大小为32*32*3,所以对于第一层隐藏层的一个神经元来说,它有32*32*3=3072个参数。这个数字看起来不大,这是因为图像非常的小。如果图像的大小为200*200*3,那么一个神经元需要训练的参数为200*200*3+1=120001个。这仅仅是一个神经元,如果算上其他的神经元,需要训练的参数数量将是一个天文数字!很明显,这种全连接的形式非常费时,而且如此大量的参数会导致过拟合的问题。
    
     神经元的3D结构:CNN利用了输入为图像的这个因素,它没有把图像拉成一个向量,而是直接拿来用。具体的说,CNN的输入有三个维度:图像的长宽高,高实际就是图像的颜色通道个数,对于灰度图像,高为1,彩色图像高为3,多光谱图像高为谱段数。比如,输入图像大小为32*32*3,那么CNN的输入也为32*32*3.另外CNN的输出也是一个3维的向量,比如一个10类的输出,CNN的输出就为1*1*10.下边为一个示意图:
Convnet介绍(1)_第1张图片

二:CNN用到的层

    如上边的示意图看出,CNN实际上就是层的序列,每一层使用一个可微分的函数将一个多维矩阵变换成另外一个多维矩阵。常用的层有三种:卷积层,池化层(pooling)和全连接层。我们将这些东西有规则的组合到一起,就组成了一个卷积神经网络。
    下边我们举一个例子:一个具有[输入-卷积层-relu-池化层-全连接层].更进一步的:
    输入:[32*32*3]的矩阵。
    卷积层:卷积层计算与输入层局部连接区域的神经元,计算与这些神经元对应的权重的内积。如果我们用12个滤波器的话,输出就是[32*32*12].
    RELU层:是一个逐点计算的激活函数,形式为 max(0,x)。输出仍然为[32*32*12]。
    池化层:池化层会在空间维度下采样(长和宽的维度),输出为[16*16*12]。
    全连接层:输出为各个类别的分数,输出为[1*1*10]。下图为一个例子:
Convnet介绍(1)_第2张图片
下边将详细说明每一个具体的层:

一。卷积层

    当处理维度很高的输入时(比如图片),将每个神经元全连接是不现实的。作为替代,我们将每个神经元只与输入层的局部区域连接。下边举几个例子:
例子1:假设输入的数据为32*32*3的,如果滤波器是5*5*3的,那么每个卷积层的每个神经元也有5*5*3个参数和1个偏置参数。注意滤波器的高必须为3,因为这是输入数据的高。
例子2:假设输入的数据为16*16*20,滤波器为3*3*20的,那么滤波器则一共有3*3*20个参数加一个偏置参数。注意滤波器的高必须为20.
     以上是讨论的卷积层的输入,下边讨论卷积层的输出。卷积层的输出由三个参数决定:深度,每次滤波器移动的步长和输入数据的边界补0数。
    深度就是滤波器的个数。有多少个滤波器,输出的高就为多少。比如有12个滤波器,输出就是x*y*12.
    滤波器每次移动的步长也是一个重要参数。如果步长为1,我们每次只将滤波器移动一个像素。如果是2或者3,我们每次移动2个或3个像素。
   输入数据边界补0可以让我们控制输出数据的大小。
   假设输入的数据大小为W长,滤波器的大小为F长,每次移动S个步长,添加了P行0.那么输出的长度就为(W-F+2P)/S+1。



你可能感兴趣的:(学习笔记)