内容列表

  • Lecture 7 Convolutional Neural Networks
    • 卷积神经网络历史
    • 卷积神经网络具体结构
      • 卷积层
      • 池化层
      • 全连接层
    • 神经网络架构发展
      • LeNet
      • AlexNet
      • ZFNet
      • VGGNet
      • GoogleNet
      • ResNet
      • 其他网络模型
      • 网络架构对比
  • 小结

Lecture 7 Convolutional Neural Networks

本章将开始进入正经的卷积神经网络学习中,一些细节部分前面分析的很多了,这里不会过多赘述,需要进入到网络架构层面学习。

卷积神经网络历史

还是要讲到1959年Hubel与Wiesel关于猫的实验:

当年,他们通过对单神经元对于视觉的感兴趣情况做的实验,结果表明,某一神经元只会对某一简单特征做出反应,例如物体向某一方向的平移,某一种特定边缘,而且大脑中视觉皮质内靠近的细胞代表视野中的附近区域(颜色,方向等):

所以,人类的视觉里如此多变的世界其实都是由很简单的神经元对于视觉信息处理的整合形式,一种网络结构。

而后,Fukushima在1980年使用了这种简单神经元的堆叠结构来组成了现有神经网络的雏形;再由LeCun在1998年使用反向传播方法更新了神经网络进行手写体图像识别;再到2012年的AlexNet几乎没有对LeCun的网络进行什么修改就夺得了ImageNet大赛的冠军。

卷积神经网络最近被用来做了什么事呢?其实卷积神经网络现在可以说到处都是,图像分类,自动驾驶,人脸识别语音语义识别,它可以说是无所不能,而且在2014年的实验中,将猴子在IT皮层对物体的分类与卷积神经网络进行比对,发现二者相似矩阵很大部分是相同的,这是否意味着卷积神经网络很大程度上模仿了大脑的神经结构呢?接下来进入卷积神经网络的学习!

卷积神经网络具体结构

一个简单的卷积神经网络是由各种层按照顺序排列组成,网络中的每个层使用一个可以微分的函数将激活数据从一个层传递到另一个层。卷积神经网络主要由三种类型的层构成:卷积层,池化层和全连接层(全连接层和常规神经网络中的一样)。通过将这些层叠加起来,就可以构建一个完整的卷积神经网络。

卷积层

卷积层(Convolution layer)是很好理解的,将原始图片看作是一个有深度的三位立方体(因为彩色图像是三通道的,这里深度为3),使用一个小一点的立方体滤波器对这个图像进行卷积操作(这个立方体的深度一定等于原图的深度),一次卷积得到一个数字,那么从原图从左至右,从上至下每一个位置卷积一次,就会得到卷积后的结果,最后的结果再加上一个偏执参数,就得到了最后结果图,这个图一般会再经过激活函数,得到这一层卷积层的最终结果:

如下图所示,使用一个 5 ∗ 5 ∗ 3 5*5*3 5∗5∗3滤波器对原始图像 32 ∗ 32 ∗ 3 32*32*3 32∗32∗3进行滤波,得到结果为 28 ∗ 28 ∗ 1 28*28*1 28∗28∗1,也就是一个卷积核(kernel)或者说这个滤波器下的结果,那么我们可以对一张图使用多个滤波器,也就是多个核,一般每个核在同一层的大小都是相同的(也有不同,但是最终结果一般维度相同),例如下图例子中使用了6个滤波器,最终结果堆叠在一起得到了一个 28 ∗ 28 ∗ 6 28*28*6 28∗28∗6的结果:

这里要注意一下,上图中结果相当于卷积层一层所得到的结果,那么下一层怎么操作呢?这里注意上一层得到深度为几层,那么下一层的滤波器也一定要与上层深度一致,如下图这个例子中第二层采用 5 ∗ 5 ∗ 6 5*5*6 5∗5∗6的滤波器:

从下图就能看出滤波器可视化的样子,低级特征是很普通的64个滤波器,有颜色的,由角度边缘的,中级与高级特征就能够明显的看出这是更加杂乱的多维滤波器:

上图是滤波器的可视化结果,经过滤波器的图像在卷积滤波器操作并激活后的可视化为下图所示,最上面是32个滤波器,下面32个分别是对左上角的车灯位置滤波并激活后的结果:

看过了滤波器可视化结果,现在讲一下滤波器的卷积的过程:具体过程就不细说了,就是拿滤波器相当于权重矩阵 W T W^T WT与原图进行卷积,需要说一下的是有关于步长的问题,卷积后图像大小如下图公式所算得:

可以看到当步长为3时,不能整除,所以,不可以使用结果为非整数的步长。并且一般卷积核都为奇数边长矩阵,最小为 3 ∗ 3 3*3 3∗3。

这里再说一下补边(padding)操作,一般进行补边操作都是为了使原图通过卷积后不改变其大小而作,因为当卷积神经网络层数很多时,原图在每一次卷积都被缩小会使操作无法进行,所以,一般补边操作补的大小与卷积核大小有关:

一般在卷积层都会计算卷积层的参数复杂度,每一层的卷积操作都由卷积核参数与偏置参数组成:

可以在很多卷积神经网络中看到 1 ∗ 1 1*1 1∗1卷积核,其实这个卷积核滤波后将原图大小不改变,只改变其深度,也就是通道数:

以上讲到的都是从滤波器的角度看卷积核,下面从神经元的角度看卷积操作:

可以看到,其实卷积操作就相当于卷积后的 28 ∗ 28 28*28 28∗28个神经元,共享一个参数矩阵,对原图进行卷积操作,再经过激活函数激活,得到 28 ∗ 28 28*28 28∗28的结果。

下图为一张车辆图片经过整个网络最终得到预测分数的结构框图,可以清楚地看出每一层所得到可视化的结果,其中每一层都使用10个滤波器对上一层所有结果滤波:

池化层

通常,在连续的卷积层之间会周期性地插入一个池化层(Pooling layer)。它的作用是逐渐降低数据体的空间尺寸,这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。

池化层可以使用MAX操作,又叫最大池化,对输入数据体的每一个深度切片独立进行操作,改变它的空间尺寸。最常见的形式是汇聚层使用尺寸 2 ∗ 2 2*2 2∗2的滤波器,以步长为2来对每个深度切片进行下采样,将其中75%的激活信息都丢掉。每个MAX操作是从4个数字中取最大值(也就是在深度切片中某个2x2的区域)。深度保持不变。池化层的一些公式:
输入数据体尺寸: W 1 ⋅ H 1 ⋅ D 1 W_1\cdot H_1\cdot D_1 W1​⋅H1​⋅D1​
有两个超参数:空间大小 F F F 与步长 S S S
输出数据体尺寸: W 2 ⋅ H 2 ⋅ D 2 W_2\cdot H_2\cdot D_2 W2​⋅H2​⋅D2​,其中 W 2 = ( W 1 − F ) / S + 1 W_2=(W_1-F)/S+1 W2​=(W1​−F)/S+1、 H 2 = ( H 1 − F ) / S + 1 H_2=(H_1-F)/S+1 H2​=(H1​−F)/S+1、 D 2 = D 1 D_2=D_1 D2​=D1​


卷积层除了最大池化,还有平均池化,就是将每一个最大值滤波器换成平均值滤波器,但是一般来说效果没有最大池化好。

需要注意,当使用池化层后,反向传播时,因为最大池化的函数是 m a x ( x , y ) max(x,y) max(x,y),所以只有最大值的位置是有梯度的,这样在反向传播的时候梯度的路由就很高效。

全连接层

在全连接层(Full Connect layer,简称FC)中,神经元对于前一层中的所有激活数据是全部连接的,这个与常规神经网络中一样。将前面卷积与池化最后得到的结果拍成一列展开,有多少个参数就有多少维,这么多维的数字与全连接层进行点乘,得到的数就为该类得分,一共有多少类,就有多少列全连接层的参数,下图很好的诠释了这一操作:

其实,转换为一列参数是为了与之前讲过的全连接相对应,而这里也可以将全连接层看作是卷积操作,具体如下:比如,一个 K = 4096 K=4096 K=4096的全连接层,输入数据体的尺寸是 7 ∗ 7 ∗ 512 7*7*512 7∗7∗512,这个全连接层可以被等效地看做一个 F = 7 , P = 0 , S = 1 , K = 4096 F=7,P=0,S=1,K=4096 F=7,P=0,S=1,K=4096的卷积层。注意这里是4096个滤波器中每一个滤波器都要对原来深度为512的数据体滤波,可以看出是一个很庞大的操作。因为只有一个单独的深度列覆盖并滑过输入数据体,所以输出将变成 1 ∗ 1 ∗ 4096 1*1*4096 1∗1∗4096,这个结果就和使用初始的那个全连接层一样了,全连接层4096在很多模型中都会被使用。

以下是一个在线训练的网站,里面包含整个模型(虽然模型较为简单),有整个模型在每一步的可视化结果,非常具有参考性:https://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html

神经网络架构发展

现如今,各种各样的网络架构被设计出来,本节就讲一讲比较知名的Net结构。

LeNet

每次都要提一句的LeNet,当初作为邮政手写体识别,首次将神经网络与反向传播结合,看下途中具体的结构没有什么难点,卷积1-池化1-卷积2-池化2-全连接1-全连接2-输出,其中,卷积2的位置并不是全局连接,而是每个滤波器分别连接前项6个图片中的某个,在下方具体给出:

卷积2位置滤波器模板:


这个结构几乎只在这里出现过,印象里没有其他网络会这么卷积了。

AlexNet

AlexNet卷积神经网络在计算机视觉领域中受到欢迎,它由Alex Krizhevsky,Ilya Sutskever和Geoff Hinton实现。AlexNet在2012年的ImageNet ILSVRC 竞赛中夺冠,性能远远超出第二名(16%的top5错误率,第二名是26%的top5错误率)。这个网络的结构和LeNet非常类似,但是更深更大,并且使用了层叠的卷积层来获取特征(之前通常是只用一个卷积层并且在其后马上跟着一个汇聚层):

这里要注意,第一层图片大小应该是 227 ∗ 227 ∗ 3 227*227*3 227∗227∗3,而不是图片模型中的 224 ∗ 224 ∗ 3 224*224*3 224∗224∗3,上图左边为每一层结构与输出结果,注意第一层卷积结构,图片中模型显示的是2个48维滤波器,但是实际上我们在做的时候,直接将其混合为一个96维滤波器,因为当时还没有GPU,承受不了那么大的计算极限;剩下的可以看右边的细节总结,这里归纳一下:

  1. 首次使用ReLU激活函数
  2. 使用均衡化层,但是因为作用不大,之后没有在被使用过
  3. 使用了大量的数据扩充
  4. 使用随机失活dropout方法,并设置为0.5
  5. 将batch设置为128,使用SGD+Momentum且momentum=0.9的方法进行梯度下降
  6. 使用学习率下降的方法,当准确率走平时下降10倍
  7. 使用L2正则化权重操作
  8. 初次使用卷积-卷积的方法,将错误率下降了一些

可以看出,AlexNet其实对卷积神经网络已经使用了我们之前学过的大多数知识,并且达到了很好的效果,算是深度学习的开端!

ZFNet

Matthew Zeiler和Rob Fergus发明的网络在ILSVRC 2013比赛中夺冠,它被称为 ZFNet(Zeiler & Fergus Net的简称)。它通过修改结构中的超参数来实现对AlexNet的改良,具体说来就是增加了中间卷积层的尺寸,让第一层的步长和滤波器尺寸更小,能够采到更多的原图信息,就是这些改动让它在错误率上降低了5%,可以看出卷积层的重要性。

VGGNet

ILSVRC 2014的第二名是Karen Simonyan和 Andrew Zisserman实现的卷积神经网络,现在称其为VGGNet。它主要的贡献是展示出网络的深度是算法优良性能的关键部分。他们最好的网络包含了16个卷积/全连接层。网络的结构非常一致,从头到尾全部使用的是3x3的卷积和2x2的汇聚。他们的预训练模型是可以在网络上获得并在Caffe中使用的。VGGNet不好的一点是它耗费更多计算资源,并且使用了更多的参数,导致更多的内存占用(200M)。其中绝大多数的参数都是来自于第一个全连接层。后来发现这些全连接层即使被去除,对于性能也没有什么影响,这样就显著降低了参数数量,并且后来使用平均法可以大大降低参数数量,大致意思就是在第一个全连接层中将上层的 7 ∗ 7 ∗ 512 7*7*512 7∗7∗512结果层中每一个 7 ∗ 7 7*7 7∗7结构取平均值,得到 1 ∗ 1 ∗ 512 1*1*512 1∗1∗512个参数,大大降低参数数量:

其实还有一个要点,就是ZFNet中第一层的 7 ∗ 7 7*7 7∗7卷积核完全可以用3个 3 ∗ 3 3*3 3∗3卷积核来代替,不止效果相同,并且 7 ∗ 7 7*7 7∗7卷积核有49个参数,而3个 3 ∗ 3 3*3 3∗3卷积核才只有27个参数。

GoogleNet

ILSVRC 2014的胜利者是谷歌的Szeged等实现的卷积神经网络。它主要的贡献就是实现了一个奠基模块,它能够显著地减少网络中参数的数量(AlexNet中有60M,该网络中只有4M)。还有,这个论文中没有使用卷积神经网络顶部使用全连接层,而是使用了一个平均汇聚,把大量不是很重要的参数都去除掉了。GooLeNet还有几种改进的版本,最新的一个是Inception-v4。

它用了22层结构,不使用全连接层,大大降低了参数数量,并且提高了准确率。

这里着重讲一下GoogleNet中重要改进:inception模型:

上图可以看出,它将输入通过不同大小的卷积核,但是都输出同样大小结果,只有通道数不同,而可以看到最后将通道整合所达到的参数数量有854M,这样的参数似乎有些太多了,如何减少并且达到我们要的效果呢?这里使用了bottleneck结构来缓解参数过多问题,其实bottleneck相当于卷积层讲到的 1 ∗ 1 1*1 1∗1卷积核,只改变通道数,就能大大降低参数数量:

经过上图的计算,可以看到,bottleneck结构将输入图像的256个通道缩小到64通道,而后面的参数基于这个操作减少了很多层滤波器,效果很棒!

其实在之后的GoogleNet改进中,将 5 ∗ 5 5*5 5∗5卷积核改成两个 3 ∗ 3 3*3 3∗3卷积核,将 3 ∗ 3 3*3 3∗3卷积核改成两个 1 ∗ 3 1*3 1∗3卷积核都对参数下降起到了很大的帮助。

ResNet

残差网络(Residual Network)是ILSVRC2015的胜利者,由何恺明等实现。它使用了特殊的跳跃链接,大量使用了批量归一化(batch normalization)。这个结构同样在最后没有使用全连接层。

我们先探讨一下为什么在传统网络层数越深,训练与测试损失会如此呈现:

可以看到训练损失与测试损失都是层数深的较高,这里不是过拟合的问题,而是层数越深,算出来的结果就与原图越远,导致一直在学习很抽象的东西。这里ResNet使用残差块来解决这个问题,这样会使传统网络能够层数越来越深也不用担心效果会越来越差了:

上图可以看出通过最后的 H ( x ) = F ( x ) + x H(x) = F(x) + x H(x)=F(x)+x中 F ( x ) F(x) F(x)为经过卷积操作后的结果, x x x为将上一层结果直接加入到这个结果中,相当于将上一层结果直接影响这一层,单独这样看不出来有如何
变化,可是放入反向传播中,当每次都有一部分 x x x直接来自于上层,并且最后传给输入图像时,直接由输入图像特征影响权重更新,达到增加层数而不影响损失的效果(这里每一个残差块一般都用大于2个卷积层),而增加层数又可以提升模型效果,所以,ResNet一般层数很多,达到152层。

可以看一下ResNet的整体结构:

其中当特征图尺寸减半时,残差模块内会对原图进行下采样操作,来匹配缩小后的特征图,而原图进行尺寸减半操作使用的是 3 ∗ 3 3*3 3∗3卷积,步长为2,并且注意下图内残差网络中每层衰减使用的是单独补边操作,也就是只长宽只增加1:

可以看到,当ResNet大于50层时,一般会在每个残差块内加入bottleneck来减小计算参数。

下面说一下ResNet内的一些细节:

  1. 在每一个卷积层后都会跟着一个BN层
  2. 权重初始化操作使用Xavier方法
  3. 梯度下降法使用SGD+Momentum且momentum=0.9
  4. 学习率略微调高了一些,从0.1开始衰减,此处因为BN层的加入
  5. batch设置为256
  6. 使用L2正则化权重操作
  7. 不使用dropout,因为BN层的加入

其他网络模型

之前看了很多模型,RCNN、fast-RCNN、faster-CNN、DenseNet、DPN、以后有时间将这些模型优缺点都讲一下!

网络架构对比

下面这张图片可以看出各个模型准确率与模型复杂度的对比:

在右面的坐标轴内越靠近左上角说明模型越好,可以看出Inception-v3与ResNet-50效果很不错。

小结

  1. 对整个卷积神经网络展开逐层分解,探究每一层的作用,了解卷积层、池化层与全连接层的操作方式。
  2. 讲述神经网络架构发展情况,从最初的LeNet到变革性的AlexNet还有最近的一些net,了解其中不同层的作用。

资料来源:

  1. 斯坦福CS231n李飞飞计算机视觉视频课程:https://study.163.com/course/courseMain.htm?courseId=1003223001
  2. CS231n官方笔记授权翻译总集篇:https://zhuanlan.zhihu.com/p/21930884
  3. CS231n官方PPT:http://vision.stanford.edu/teaching/cs231n/syllabus.html
  4. 残差网络论文:https://arxiv.org/pdf/1512.03385.pdf

[深度学习基础] 斯坦福CS231n李飞飞计算机视觉Lecture 7笔记相关推荐

  1. [深度学习基础] 斯坦福CS231n李飞飞计算机视觉Lecture 1笔记

    前言:目前做深度学习也有一段时间了,系统的知识也学了很多,但是大多数都是自己在网上所获得的零散的知识,最近看了李飞飞的斯坦福网上公开课,觉得可以好好的巩固一下基础,对每个Lecture做一下笔记,De ...

  2. [深度学习基础] 斯坦福CS231n李飞飞计算机视觉Lecture 5笔记

    内容列表 Lecture 5 Training Neural Networks,Part I 神经网络的历史 训练神经网络 激活函数 数据预处理 权重初始化 批量归一化 检查学习过程 超参数优化 小结 ...

  3. 斯坦福CS231n李飞飞计算机视觉之线性分类上

    线性分类器简介 线性评分函数 阐明线性分类器 译者注:上篇翻译截止处 损失函数 多类SVM Softmax分类器 SVM和Softmax的比较 基于Web的可交互线性分类器原型 小结 线性分类 上一篇 ...

  4. 斯坦福大学李飞飞团队图像分类课程笔记

    斯坦福大学李飞飞团队图像分类课程笔记 Stanford image classification course notes 这是斯坦福CS231n课程图像分类基础知识. 目标:这一节先介绍图像分类基本 ...

  5. 深度学习基础——简单了解meta learning(来自李宏毅课程笔记)

    知乎同名账号同步发布 目录 一.初步了解 二.和ML的差异 三.应用了解 一.初步了解 我们以分类问题为例,以前,学习的目的是学习一个二元分类器 f ∗ f^* f∗:现在,学习的目的是学习一个学习算 ...

  6. CS231N斯坦福李飞飞-计算机视觉-损失函数和优化

    CS231N斯坦福李飞飞-计算机视觉-损失函数和优化

  7. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(十九):卷积神经网络笔记(下)

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

  8. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记

    最近开了一个新坑--[CS231n]斯坦福大学李飞飞视觉识别课程,准备认真学习并记录自己的学习历程. 文章目录 [CS231n]斯坦福大学李飞飞视觉识别课程笔记 课程笔记 学习安排 Week 1 We ...

  9. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(四):图像分类笔记(上)

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

最新文章

  1. php作为文本进行处理,PHP处理文本和爬虫技巧
  2. 记录理解程度、一篇至少读3遍,吴恩达建议这样读论文
  3. GitHub热门:程序员的架构师封神之路
  4. SAP历史库存MB5B的详解
  5. debian mysql开机启动_自动启动debian和lighttpd+mysql
  6. php excel导入mysql_PHP将Excel内容导入mysql数据库
  7. 编写一个程序,实现将存放在AX和DX中的32位数据循环右移二进制数的4位。(DX存放高字节内容,AX存放低字节内容)
  8. String Statistics(2008年珠海市ACM程序设计竞赛)
  9. 图论 —— 网络流 —— 最大流 —— Dinic 算法
  10. 【BZOJ2342】双倍回文,manacher+并查集优化
  11. linux系统开机图片修改,linux开机logo 和 android开机logo 的修改
  12. windows android系统,手机装windows系统详细方法
  13. 国密gmtls协议-双证书体系的服务端和客户端通信代码
  14. MySQL数据库实验(六):创建学生信息管理系统
  15. 人力资源管理-人际交往中的6个心理效应
  16. 简单点击图片弹出video视频弹窗功能
  17. iftop流量实时查看
  18. CSU2020期中测试模拟题1 问题 B: 小帅要缴税
  19. 什么是ssr,seo
  20. ssl证书默认端口是什么,ssl证书证书的作用

热门文章

  1. Signal ()函数用法和总结
  2. React18警告:ReactDOM.render is no longer supported in React 18. Use createRoot instead. Until youswitc
  3. 【调剂】中国航天系统科学与工程研究院2023年硕士研究生招生调剂开始啦!
  4. 微信小程序快速入门+四个实战小程序(一)——入门准备
  5. 使用GROOVY脚本语言发送get和post请求
  6. Moveit编程——moveit 编程技巧笔记——圆弧轨迹规划+修改轨迹
  7. rtmp拉流转http-flv输出
  8. POJ-3016 K-Monotonic
  9. 基础-符号表(一)-数据结构和算法(Java)
  10. rail铁轨 洛谷 测试数据_你见过什么生成 OI 比赛测试数据的工具?