网站首页 > 精选文章 正文
Scalers点评:机器学习小组是成长会的内部小组,这是成长会机器学习小组第14周学习笔记。也是深度学习第3次的复盘笔记。
往期日志和相关链接:
本周学习情况:
本周(20160523—20160529)的学习内容包含理论学习和实践学习两个部分。理论学习部分主要涉及《Deep Learning》中9.1到9.3的一些基本概念,包括卷积操作、池化操作等。理论部分的复盘主持人是[S688]Ericliu。实践学习部分主要涉及Caffe框架的一些基本概念。理论部分的复盘主持人是[S223]宝二爷。
理论部分内容:
1.卷积运算
卷积运算是通过两个函数f和g,生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠部分的面积。
我们经常会用卷积操作去处理一个多坐标数据,比如我们用一个2维的图片作为输入,同样用2维的核K
卷积的可计算性,我们可以等效的写成:
卷积运算的交换律的出现,是由于我们可以翻转核函数和输入值。很多深度学习库,都实现了互相关的函数(对应元素相乘)。它和卷积是一样的,不过没有翻转核函数
下图是一个具体的卷积的示例,
图1,非核翻转2D卷积的一个例子。在这种情况下,我们限制输出的位置,其中核数据完全位于图像内,在某些情况下,被称为有效卷积。我们用正方形上的箭头指示左上角输入矩阵数据的元素通过施加右上角输入矩阵的区域的核数据,进行一个互相关计算。
2.使用卷积的动机
卷积充分利用3个重要观点来改善深度学习系统:稀疏连接,参数共享和等效表示。此外,卷积提供了一种方法,来处理可变长的输入数据。传统的神经网络使用每一个参数矩阵和输入矩阵相乘,算出输出值,这意味着每个输出单元和输入单元都相互作用。
卷积网络是稀疏连接的,这个是通过一个比输入小的核来实现的。比如,当处理图像时,这个输入图片,有成千或百万像素,但我们可以检测到一些小的有用的特征,比如核占据的几十或上百的像素的一些边缘。这意味着我们只需要保存更少的参数,这样可以降低模型所需内存,改善它的统计效率。如果存在一个m维的输入数据,和n维的输出数据,那么矩阵相乘需要m×n个参数,算法需要一个O(m×n)复杂度。如果我们限制输出层的链接个数为k,那么仅仅需要O(k×n)复杂度。对于稀疏连接的图片展示,可以参考图2。
图2,稀疏连接,从图片的下面部分可知:我们高亮了输入单元x3,也高亮了受输入单元x3影响的输出单元,只有3个输出单元受它影响。(图底部)当s是由矩阵相乘得到,那么连接性不再是稀疏的,所有的输出单元都受到它的影响。
参数共享是指在模型中的多个函数共享相同的参数。在传统的神经网络里,在计算输出层时候,权重矩阵的每一个元素都会被计算一次,然后就不再使用。至于参数共享的代名词,也可以说,网络连接权重,因为既然权值可以应用到一个输入单元上,那么就可以应用到任何地方。在卷积神经网络,核中的每个元素都被应用到输入数据的每个元素中(除或许有些边界像素,这取决于边界的设计决策)。通过卷积运算使用的参数的共享意味着我们不是在每一个位置上都学习一组独立的参数,而是我们只学一组参数。这不会影响前向反馈算法-它仍然是O(k×n)存储空间,但是它进一步减少了模型的存储需求。因为k通常是远远小于m几个数量级。
图3,权值共享:黑色箭头表示用某个特定的参数来连接2个不同模型。(上面)黑色箭头表示在卷积神经模型里我们使用3个核元素中的中间那个元素。由于权重共享这个参数被所有的输入单元使用。(下面)单个那个黑色箭头表明权值矩阵的中间那个元素在一个全连接的网络模型中被使用。这个模型里参数没有被共享只是被使用了一次。
3.池化
一个卷积网络由3个特定的阶段组成。在第一个阶段,这个层并行处理几个卷积来产生一组线性激活函数。在第二阶段,每一个线性激活都是运行一个非线性激活函数(ReLu),这个阶段有时候也叫边缘检测阶段。在第三阶段,我们用池化来修正输出。
池化操作的结果是一个输出值邻近的一个概括统计值。比如,最大池化是一种统计数据里最大值一种处理。其他一些池化还包括均值池化,L2正则池化,基于中心像素距离的加权均值池化。
在所有的场合,池化都有助于使得输入数据的发生小变换,而模型的表示的不变形。对于图片的偏移旋转的不可变性意味着,如果我们对输入数据进行少量变换,对于池化后的输出值是不变的。图4是一个池化如何产生作用的例子。本地变换的不可变性是非常有用的一个特性,当我关注与某个特征是否出现,而不是关心它具体的位置。比如,当决定一张图是不是有人脸,我们并不需要知道眼睛的精确像素的位置,我只需知道在脸的左右各有一个眼睛就行了。在其他一些场景,保持一些特征的位置是比较重要的。比如我们想要发现在一个特定的方位有一个由2个边构成的角,我们需要很好保存这个角的位置。
图4. 最大池化的不可变性。(图片顶部)输出的是卷积层中间层,底部一行是非线性的。顶部表明了最大池化的输出,这个最大池化是步长1像素,区域为3像素的。(图片底部)同样结构的网络,输入数据向右移动了一个像素,底部那层每一个值都发生了变换,但是顶部那层的值只有一半发生了变化。因为最大池化只对相邻区域的最大值敏感,而不是具体位置。
因为池化反映了整个相邻区域的概括信息,所以用少量的池化单元来替代检测单元是可能的,我们可以通过池化K个像素的区域,获得1个像素值,如图5所示,这可以改善神经网络的计算效率,因为下一层的计算减少了K倍。当下一层的参数数量是函数的输入大小是,网络改善了统计的效率,从而降低了存储参数的内存消耗。
图5,池化下采样。我们使用最大池化,池化的宽度为3,步长为2,。这通过忽略两个元素降低了模型表达的大小,降低了下一层分析和计算的负担。
实践部分内容:
本周的实践部分我们主要对Caffe这种深度框架的基本结构进行了学习,现总结如下:
1.Blobs, Layers, and Nets
基本概念:
caffe:定义了自底向上,从输入数据到loss的架构
blobs(数据块):标准数组统一的存储接口
layers(层):模型和计算的基础
nets(网络):层的集合与连接
图6,Caffe基本组成模块
Blob: 存储与通信
Blob是caffe中的一种数据包装器,它是一个N维数组,具有CPU与GPU同步,隐藏操作,按需分配,高效利用存储器等特性。Blob是一种4D结构,总的大小可以表示为:
N x channel K x height H x width W
图像的数量number: N
图像的通道数channel: K
图像的高度height: H
图像的宽度width: W
(n, k, h, w) 的物理存储地址= ((n K + k) H + h) * W + w.(从0开始)
Blob存储的数据分为两类:data,diff,
前者指的是我们在网络间正常交流的数据,如图像像素数据之类的
后者指的是Back propagation进行学习时,运算得到的梯度数据。
constDtype cpu_data const; //不可改变数据值Dtype mutable_cpu_data; //可以改变数据值
Layers: 数据处理单元
Layers来实现了对Blob中数据的具体操作或处理,其具有以下形式:
图7,一个卷积层的基本结构
Nets: 网络基本结构
Nets定义了整个神经网络的的基本结构,其具有以下具体形式:
图8,一个利用softmax对数据进行分类的网络结构
2.Forward / Backward
前向操作(Forward)和反向操作(Backward)是神经网络的两种基本操作,其中前者正向产生预测值,后者则是通过实际值和预测值之间的差别来对网络的参数进行调整。
图9,网络的前向操作与反向操作的示意图。
每一次计算时,Net::Forward和Net::Backward 方法会调用Layer::Forward和Layer::Backward方法;每一个Layer都有forward{cpu,gpu}和backward{cpu,gpu}方法。
3.Solver
Solver的流程:
设计好需要优化的对象,以及用于学习的训练网络和用于评估的测试网络。(通过调用另外一个配置文件prototxt来进行)
通过forward和backward迭代的进行优化来跟新参数。
定期的评价测试网络。(可设定多少次训练后,进行一次测试)
在每一次的迭代过程中,solver做了这几步工作:
调用forward算法来计算最终的输出值,以及对应的loss
调用backward算法来计算每层的梯度
根据选用的slover方法,利用梯度进行参数更新,可以选择的方法有随机梯度下降法、自适应梯度下降法、鲁棒性学习率方法等。
记录并保存每次迭代的学习率、快照,以及对应的状态。
Solver中一些基本的函数
Solver::Presolve // 初始化
Solver::ComputeUpdateValue//计算Wij的梯度存储在blog::diff中,用Blob::Update完成最后的updateSolver::Snapshot //保存参数
Solver::SnapshotSolverState //保存自身状态Solver::Restore //resume,从某点重新开始
ScalersTalkID:scalerstalk
本微信公众号作者Scalers,游走在口译世界的IT从业者。微信公众号ScalersTalk,微博@Scalers,网站ScalersTalk.com,口译100小时训练计划群C 456036104
成长会是由Scalers发起的面向成长、实践行动,且凝聚了来自全球各地各行各业从业者的社群。有意入会者请和Scalers直接联系,我和其他会员会和你直接交流关于成长行动等各方面的经验教训。2016年成长会持续招募中,参见做能说会写的持续行动者:ScalersTalk成长会2016年会员计划介绍(2016.3更新)
猜你喜欢
- 2025-05-25 人工智能-深度学习-神经网络结构MLP,CNN,RNN,LSTM
- 2025-05-25 图像识别与卷积神经网络
- 2025-05-25 神经网络基础篇四
- 2025-05-25 YOLO-TLA:一种基于 YOLOv5 的高效轻量级小目标检测模型
- 2025-05-25 码农必须了解的5种神经网络架构
- 2025-05-25 深度学习基础知识题库大全
- 2025-05-25 智能图像识别初探系列(三)
- 2025-05-25 汇总|实时性语义分割算法
- 2025-05-25 彻底了解卷积神经网络CNN(二)
- 2025-05-25 深度学习图像分割:网络结构设计一览
- 最近发表
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)