深度学习 20、CNN

你挡我一时,挡不了我一世

发布日期: 2019-06-11 11:42:43 浏览量: 1200
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

前文链接:https://write-bug.com/article/2575.html

卷积神经网络CNN

上节我们介绍了DNN的基本网络结构和演示,其网络结构为:

DNN BP神经网络实行全连接特性,参数权值过多,需求大量样本,计算困难,所以CNN利用局部连接、权值共享来实现减少权值的尝试,即局部感知野和权值共享。擅长图像分类问题,识别二维图形,现在也可以用于文本处理。

CNN的隐藏层分为卷积层conv、和池化层pool,一般CNN结构(LeNet)依次为:

INPUT->[[CONV -> RELU]N -> POOL?]M -> [FC -> RELU]*K->FC
经典LeNet-5结构:最早用于数字识别的CNN

卷积层Convolitions:

用卷积层实现对图片局部的特征提取,窗口模式卷积核形式提取特征,映射到高维平面。

两个关键性操作:

  • 局部关联:每个神经元看为一个滤波器filter

  • 窗口滑动:filter对局部数据计算

局部感受野:

1000 * 1000 图像 1000 * 1000神经元
全连接: 1000 * 1000 * 1000 * 1000 = 10^12 个参数

局部感受野:每个神经元只需要知道10 * 10区域,训练参数降到100M

权值共享:

所有神经元用同一套权重值,100M降到100,这样得到一个feature map。100种权重值100个map,一共需要训练100*100 = 10k参数

卷积的计算:

窗口滑动,我们可以想象一个窗口(卷积核feature_map),设置固定的feature_size,里面是固定的权值,这个窗口在同一张图片上从左到右从上到下游走,每次固定步长,从而得到更小size的矩阵。

这里有两个神经元的卷积层,步长stride设置为2,边缘灰色部分为填充值zero-padding,防止窗口移到边缘时不够滑动遍历所有像素,而这里的神经元个数就是卷积层深度depth。

在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。

  • 需要估算的权重个数减少: AlexNet 1亿 => 3.5w

  • 一组固定的权重和不同窗口内数据做内积: 卷积
    卷积理解:后面输出结果的前提是依赖前面相应权值积累,比如连续吃三天药身体才好,那么这三天的相关性是不同的权值

激活函数
把卷积层输出结果做非线性映射。

CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱,图像如下。

激励层的实践经验:

  • 不要用sigmoid!不要用sigmoid!不要用sigmoid!
  • 首先试RELU,因为快,但要小心点
  • 如果2失效,请用Leaky ReLU或者Maxout
  • 某些情况下tanh倒是有不错的结果,但是很少

池化层pooling:对特征进一步缩放

池化层夹在连续的卷积层中间,用于压缩数据和参数的量,减小过拟合,压缩图像。

特点:

  • 特征不变性:图像缩小还可以认出大概

  • 特征降维:去除冗余信息,防止过拟合

池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。

这里就说一下Max pooling,其实思想非常简单。

对于每个2*2的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个2*2窗口中最大的数是6,那么输出矩阵的第一个元素就是6,如此类推。

平移不变性

旋转不变性

缩放不变性

全连接层FC

和BP神经网络一样,两层之间互相全连接,即把压缩后的维度打平为一组向量,再通过dnn的方法进行分类处理。

Droupout

正则化方法,CNN中解决过拟合问题,同时通用与其他网络。

随机在全连接层,剪掉一些神经元,防止过拟合。

卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。

CNN一个非常重要的特点就是头重脚轻(越往输入权值越小,越往输出权值越多),呈现出一个倒三角的形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。

卷积神经网络CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

卷积神经网络之训练算法:

  • 同一般机器学习算法,先定义Loss function,衡量和实际结果之间差距

  • 找到最小化损失函数的W和b, CNN中用的算法是SGD(随机梯度下降)

卷积神经网络之优缺:

  • 优点

    • 共享卷积核,对高维数据处理无压力
    • 无需手动选取特征,训练好权重,即得特征分类效果好
  • 缺点

    • 需要调参,需要大样本量,训练最好要GPU
    • 物理含义不明确(也就说,我们并不知道没个卷积层到底提取到的是什么特征,而且神经网络本身就是一种难以解释的“黑箱模型”)

卷积神经网络之典型CNN:

  • LeNet,这是最早用于数字识别的CNN

  • AlexNet, 2012 ILSVRC比赛远超第2名的CNN,比LeNet更深,用多层小卷积层叠加替换单大卷积层。

  • ZF Net, 2013 ILSVRC比赛冠军

  • GoogLeNet, 2014 ILSVRC比赛冠军

  • VGGNet, 2014 ILSVRC比赛中的模型,图像识别略差于GoogLeNet,但是在很多图像转化学习问题(比如object detection)上效果奇好

    pytorch网络结构:

  1. class Net(nn.Module):
  2. def __init__(self):
  3. super(Net, self).__init__()
  4. self.conv1 = nn.Conv2d(1, 20, 5, 1)
  5. self.conv2 = nn.Conv2d(20, 50, 5, 1)
  6. self.fc1 = nn.Linear(4*4*50, 500)
  7. self.fc2 = nn.Linear(500, 10)
  8. def forward(self, x):
  9. print("x size: ", x.size())
  10. x = F.relu(self.conv1(x))
  11. print("conv1 size: ", x.size())
  12. x = F.max_pool2d(x, 2, 2)
  13. print("pool size: ", x.size())
  14. x = F.relu(self.conv2(x))
  15. print("conv2 size: ", x.size())
  16. x = F.max_pool2d(x, 2, 2)
  17. print("pool size: ", x.size())
  18. x = x.view(-1, 4*4*50)
  19. print("view size: ", x.size())
  20. x = F.relu(self.fc1(x))
  21. print("fc1 size: ", x.size())
  22. x = self.fc2(x)
  23. print("fc2 size: ", x.size())
  24. sys.exit()
  25. return F.log_softmax(x, dim=1)
上传的附件
最近文章
eject