收藏 分享(赏)

Caffe官方教程中译本.pdf

上传人:精品资料 文档编号:10529894 上传时间:2019-11-26 格式:PDF 页数:57 大小:1.32MB
下载 相关 举报
Caffe官方教程中译本.pdf_第1页
第1页 / 共57页
Caffe官方教程中译本.pdf_第2页
第2页 / 共57页
Caffe官方教程中译本.pdf_第3页
第3页 / 共57页
Caffe官方教程中译本.pdf_第4页
第4页 / 共57页
Caffe官方教程中译本.pdf_第5页
第5页 / 共57页
点击查看更多>>
资源描述

1、 CaffeCN 深度 学习 社区 志愿 者 集体 翻译 http:/ | QQ group: 431141753 | CaffeCN 深度学习 社区 Caffe 官方教程 中译本 社区预览版 V1.0 CaffeCN 深度 学习社区 | http:/ 1 目 录 前言 . 4 第一章 Blobs, Layers, and Nets: Caffe 模型解析 5 1.1 Blob 的存储与交换 . 5 1.1.1 实现细 节 . 6 1.2 Layer 的计算和连接 7 1.3 Net 的定义和操作 8 1.3.1 模型格式 . 11 第二章 Forward and Backward(前传 /反

2、传) 13 2.1 前传 13 2.2 反传 14 2.3 Caffe 中前传和反传的实现 14 第三章 Loss 16 3.1 Loss weights 16 第四章 Solver . 18 4.1 Solver 简介 . 18 4.2 Methods 18 4.2.1 SGD . 19 4.2.2 AdaDelta . 21 4.2.3 AdaGrad 21 4.2.4 Adam 21 4.2.5 NAG 22 4.2.6 RMSprop . 23 第五章 Layer Cataloge . 24 5.1 视觉层 Vision Layers . 24 5.1.1 卷积 Convolution

3、 . 24 5.1.2 池化 Pooling . 26 5.1.3 局部响应值归一化 Local Response Normalization (LRN) 27 5.1.4 im2col . 28 5.2 损失层 Loss Layers 28 5.2.1 Softmax 损失 . 28 5.2.2 平方和 /欧式损失 Sum-of-Squares / Euclidean . 28 5.2.3 Hinge / Margin 损失 29 5.2.3 交叉熵损失 Sigmoid Cross-Entropy 30 5.2.4 信息熵损失 Infogain 30 5.2.5 准确率 Accuracy a

4、nd Top-k . 30 5.3 激活层 Activation / Neuron Layers . 30 5.3.1 ReLU / Rectified-Linear and Leaky-ReLU 30 5.3.2. Sigmoid 31 5.3.3 TanH / Hyperbolic Tangent . 32 5.3.4 Absolute Value . 32 CaffeCN 深度 学习社区 | http:/ 2 5.3.5 Power . 33 5.3.5 BNLL 33 5.4 数据层 Data Layers . 34 5.4.1 数据库 Database 34 5.4.2 内存数据 I

5、n-Memory 35 5.4.3 HDF5 Input . 35 5.4.4 HDF5 Output 35 5.4.5 图像数据 Images . 35 5.4.6 窗口 Windows 36 5.4.7 Dummy . 36 5.5 普通层 Common Layers 36 5.5.1 内积全连接 Inner Product. 36 5.5.2 分裂 Splitting . 38 5.5.3 摊平 Flattening 38 5.5.4 变形 Reshape . 38 5.5.5 连结 Concatenation . 39 5.5.6 切片 Slicing 40 5.5.7 逐个元素操作

6、Elementwise Operations . 41 5.5.8 Argmax . 41 5.5.9 Softmax 41 5.5.10 Mean-Variance Normalization . 41 第六章 Interfaces . 43 6.1 Command Line 43 6.1.2 训练 43 6.1.2 测试 . 44 6.1.3 Benchmarking 44 6.1.4 诊断 . 44 6.1.5 并行模式 . 45 6.2 Python . 45 6.3 MATLAB . 46 6.3.1 编译 MatCaffe 46 6.3.2 使用 MatCaffe 47 第七章 数

7、据 . 54 7.1 数据:输入与输出 54 7.2 格式 56 7.3 部署输入 56 CaffeCN 深度 学习社区 | http:/ 3 致谢 : CaffeCN 社区 谨 此 向 Caffe 官方 社区 致敬! 向 所有参加了 此次 文档翻译 工作 的志愿者 1 致以诚挚 的 感谢 ! CaffeCN 社区 2016.02.01 1 翻译和校对人员包括 : 巴君 、 戴嘉伦、 龚国平、 李文杰 、 刘畅、 刘昕 、 刘 艳飞、 马杰超 、 任伟、 诗亚婷 、 孙琳钧、 它它 、 王斌 、 王洪振、 王蒙蒙、吴尚轩、辛淼 、杨轶斐、 占鸿渐、张欣 、 赵行 、 郑昌艳 。 CaffeCN

8、 深度 学习社区 | http:/ 4 前言 Caffe 是一个深度学习框架 。 本 教程 讲述 了 Caffe 的设计 哲学 、 架构和使用方法。 这 是 一份关于 Caffe 的实践指引 和 介绍, 但 文中 并不 包含 关于深度学习 的前沿、 进展 和 历史 等 方面的 内容。 尽管 我们 会 在 必要的地方给出 一些辅助 解释 , 但 如果 读者 具 有关于机器学习和神经网络 方面 的背景知识, 将 十分 有助于 理解 本文的内容 。 设计 哲学 简言之 , Caffe 的 酝酿 考虑了 以下 几个 方面的 内容 : 表示 :模型和优化 以纯文本 的 模式 定义 ,而不是 以 代码 模

9、式 ; 速度 : 对于 学术 领域和工业领域, 运算 速度 对于最先进 的模型和 海量 数据是 至关重要 的 ; 模块化 :新的任务和 配置要求 框架 具有 灵活 性 和 扩展性; 开放性 : 科研 和应用过程需要 公共 的 代码 、 可 参考 的 模型和 可 再现性; 社区 : 通 过 共同讨论 和 以 BSD-2 协议 共同开发 这个 项目, 学术 研究 、 起步阶段的 原型 和工业应用 可以共享 各自的 力量 。 这些 准则 指引 了 整个 项目。 教程内容 Nets, Layers, and Blobs: Caffe 模型解析 ; Forward and Backward: 层 状模型

10、 的基本 计算 ; Loss: 由 loss 定义 待学习 的任务 ; Solver: solver 协调模型的优化 ; Layer Catalogue: “层 ”是 模型和 计算的基本单元 , Caffe 提供 的 结构 中 包含了构建先进模型 所需的各种 层 ; Interface: Caffe 的 命令行 , Python,和 MATLAB 版 接口 ; Data: 如何为 模型添加 caffe 式的 输入 数据 。 CaffeCN 深度 学习社区 | http:/ 5 第一章 Blobs, Layers, and Nets: Caffe 模型 解析 深度神经网络是一种模块化的模型,它由

11、一系列作用 在 数据块之上 的内部连接层 组合而成。 Caffe 基于自己的模型架构,通过逐层定义( layer-by-layer)的方式定义一个网络( Nets) 。网络从数据输入层到损失层自下而上 地 定义 整个模型 。 Caffe 使用 blobs 结构 来存储、交换和处理网络中 正向和反向迭代 时的数据和导数信息 : blob 是 Caffe 的标准数组结构,它提供了一个统一的内存接口。 Layer 是 Caffe 模型和计算的基本单元, Net 是一系列 layers 和其连接的集合。 Blob 详细描述了信息是如何在 layer 和 net 中存储和交换的。 Solving(求解方

12、法)单独配置,以解耦模型的建立与优化 的 过程 。 下面将详细介绍这些组成部分。 1.1 Blob 的存储与交换 Blob 是 Caffe 中处理和传递实际数据的数据封装包 , 并且在 CPU 与 GPU 之间具有同步处理能力。从数学意义上说, blob 是按 C 风格连续存储的 N 维数组。 Caffe 基于 blobs 存储和交换数据。为了便于优化, blobs 提供 统一的内存接口来存储某种类型的数据,例如批量图像数据、模型参数以及 用来 进行 优化的导数。 Blobs 可根据 CPU 主机到 GPU 设备的同步需要,屏蔽 CPU/GPU 混和运算在计算上的开销。主机和设备上的内存按需求

13、分配( lazily),以提高内存的使用效率。 对于批量图像数据来说, blob 常规的维数为图像数量 N *通道数 K *图像高度 H *图像宽度 W。 Blob 按行为主 ( row-major) 进行存储,所以一个 4 维 blob 中,坐标为 (n, k, h, w)的值 的 物理位置为( n * K + k) * H + h) * W + w,这也使得最后面 /最右边的维度更新最快。 Number/N 是每个批次处理的数据量。批量处理信息有利于提高设备处理和交换的数据 的 吞吐 率。 在 ImageNet 上 每 个训练 批量 为 256 张图像,则 N=256。 Channel/K

14、 是特征维度,例如对 RGB 图像来说, K=3. 虽然 Caffe 的图像应用例子中很多 blobs 都是 4 维坐标,但是对于非图像应用任务, blobs也完全可以照常使用。例如,如果你仅仅需要类似于传统多层感知机那样的全连接网络,使用 2 维的 blobs(形式为 (N, D)),之后再调用 InnerProductLayer(全连接层,随后我们将讲解)即可。 参数 Blob 的维度是根据层的类型和配置而变化的。一个卷积层中若有 96 个空间维度为CaffeCN 深度 学习社区 | http:/ 6 11 x 11、输入为 3 通道 的滤波器,那么其 blob 维度是 96 x 3 x

15、11 x 11。对于一个输入是 1024维 (输入 通道数) ,输出是 1000 维 (输出 通道数) 的内积层 /全连接层, 参数 blob 维度是 1000 x 1024。 对于一些特定数据,自己设计输入工具或者数据层 是很有必要的。但是无论怎样,一旦你的数据准备完毕,各种层模块将会帮你完成剩下的工作。 1.1.1 实现细节 对于 blob 中的数据,我们关心的是 values(值)和 gradients(梯度),所以一个 blob单元存储了两块数据 data 和 diff。前者是我们在网络中传送的普通数据,后者是通过网络计算得到的梯度。 而且,由于数据既可存储在 CPU 上,也可存储在

16、GPU 上,因而有两种数据访问方式:静态方式,不改变数值;动态方式,改变数值。 const Dtype* cpu_data() const; Dtype* mutable_cpu_data(); ( gpu 和 diff 的操作与之类似) 之所以这么设计是 因为 blob 使用 了一个 SyncedMem 类来同步 CPU 和 GPU 上的 数 值,以隐藏同步的细节和最小化 传送 数据 。一个 经验 准则 是 ,如果不想改变数值,就一直使用常量调用,而且 绝不要在自定义类中存储指针。 每次 操作 blob 时 , 调用 相应 的 函数来获取 它的 指针,因为 SyncedMem 需要 用 这种

17、方式来 确定何时需要复制数据。 实际上,使用 GPU 时, Caffe 中 CPU 代码先从磁盘中加载数据到 blob,同时请求分配一个 GPU 设备核 ( device kernel) 以使用 GPU 进行计算,再将计算好的 blob 数据送入下一层,这样既实现了高效运算,又忽略了底层细节。 只要 所有 layers 均有 GPU 实现,这种情况下所有的中间数据和梯度都会保留在 GPU 上。 这里有一个示例,用以确定 blob 何时会复制数据: / 假定数据在 CPU 上进行初始化,我们有一个 blob const Dtype* foo; Dtype* bar; foo = blob.gpu

18、_data(); / 数据从 CPU 复制到 GPU CaffeCN 深度 学习社区 | http:/ 7 foo = blob.cpu_data(); / 没有数据复制,两者都有最新的内容 bar = blob.mutable_gpu_data(); / 没有数据复制 / . 一些操作 . bar = blob.mutable_gpu_data(); / 仍在 GPU,没有数据复制 foo = blob.cpu_data(); / 由于 GPU 修改了数值,数据从 GPU 复制到 CPU foo = blob.gpu_data(); /没有数据复制,两者都有最新的内容 bar = blob.

19、mutable_cpu_data(); / 依旧没有数据复制 bar = blob.mutable_gpu_data(); /数据从 CPU 复制到 GPU bar = blob.mutable_cpu_data(); /数据从 GPU 复制到 CPU 1.2 Layer 的计算和连接 Layer 是 Caffe 模型的本质内容和执行计算的基本单元。 Layer 可以进行很多运算,如:convolve(卷积)、 pool( 池化 )、 inner product(内积), rectified-linear 和 sigmoid 等非线性运算,元素级的数据变换, normalize( 归一 化)、

20、 load data(数据加载)、 softmax 和 hinge等 losses(损失计算)。可在 Caffe 的 layer catalogue( 层目录 ) 中查看所有操作,其囊括了绝大部分目前最前沿的深度学习任务所需要的层类型。 一个 layer 通过 bottom(底部)连接 层 接收数据,通过 top(顶部)连接层 输出数据 。 每一个 layer 都定义了 3 种重要的运算: setup(初始化设置), forward(前向传播),backward(反向传播)。 Setup: 在模型初始化时 重置 layers 及其相互之间的连接 ; Forward: 从 bottom 层 中接

21、收数据,进行计算后将输出送入到 top 层 中 ; Backward: 给定相对于 top 层输出的梯度,计算其相对于输入的梯度,并传递到 bottomCaffeCN 深度 学习社区 | http:/ 8 层。一个有参数的 layer 需要计算相对于各个参数的梯度值并 存储 在内部 。 特别地, Forward 和 Backward 函数分别有 CPU 和 GPU 两种实现方式。如果没有实现 GPU版本 ,那么 layer 将转向作为备用选项的 CPU 方式。尽管这样会增加额外的数据传送成本(输入数据由 GPU 上复制到 CPU,之后输出数据从 CPU 又复制回到 GPU),但是对于做一些快速

22、实验这样操作还是很方便的。 总的来说, Layer 承担了网络的两个核心操作: forward pass(前向传播) 接收输入并计算输出; backward pass(反向传播) 接收 关于 输出的梯度,计算 相对于 参数和输入的梯度并反向传播给在它前面的层。由此组成了每个 layer 的前向和反向通道。 由于 Caffe 网络的组合性和其代码的模块化,自定义 layer 是很容易的。只要定义好 layer的 setup(初始化设置)、 forward(前向通道)和 backward(反向 通道 ),就可将 layer 纳入到网络中。 1.3 Net 的定义和操作 通过合成和自动 微分 ,网络

23、同时定义了一个函数和其对应的梯度。通过合成各层的输出来计算这个函数 ,来执行给定的任务,并通过合成各层的后向传播过程来计算来自损失 函数的梯度,从而学习任务。 Caffe 模型 是端到端的机器学习引擎。 准确的说, Net 是由一系列层组成的有向无环( DAG)计算图, Caffe 保留了计算图中所有的中间值以确保前向和反向迭代的准确性。一个典型的 Net 开始于 data layer 从磁盘中加载数据,终止于 loss layer 计算如分类和重构这些任务的目标函数。 Net 由一系列层和它们之间的相互连接构成,用的是一种文本建模语言。一个简单的逻辑回归分类器的定义如下: CaffeCN 深

24、度 学习社区 | http:/ 9 name: “LogReg“ layer name: “mnist“ type: “Data“ top: “data“ top: “label“ data_param source: “input_leveldb“ batch_size: 64 layer name: “ip“ type: “InnerProduct“ bottom: “data“ top: “ip“ inner_product_param num_output: 2 layer name: “loss“ type: “SoftmaxWithLoss“ bottom: “ip“ bottom

25、: “label“ top: “loss“ CaffeCN 深度 学习社区 | http:/ 10 Net:Init()进行模型的初始化。初始化主要实现两个操作:创建 blobs 和 layers 以搭建整个网络 DAG 图(向一些 C+极客声明 : 我们将一直持有 blobs 和 layers 的所有权),以及调用 layers 的 SetUp()函数。初始化时也会做另一些记录,例如确认整个网络结构的正确与否等。 另外 ,初始化期间, Net 会打印其初始化日志 到 INFO 信息 中 。 I0902 22:52:17.931977 2079114000 net.cpp:39 Initial

26、izing net from parameters: name: “LogReg“ .model prototxt printout. # construct the network layer-by-layer I0902 22:52:17.932152 2079114000 net.cpp:67 Creating Layer mnist I0902 22:52:17.932165 2079114000 net.cpp:356 mnist - data I0902 22:52:17.932188 2079114000 net.cpp:356 mnist - label I0902 22:52

27、:17.932200 2079114000 net.cpp:96 Setting up mnist I0902 22:52:17.935807 2079114000 data_layer.cpp:135 Opening leveldb input_leveldb I0902 22:52:17.937155 2079114000 data_layer.cpp:195 output data size: 64,1,28,28 I0902 22:52:17.938570 2079114000 net.cpp:103 Top shape: 64 1 28 28 (50176) I0902 22:52:

28、17.938593 2079114000 net.cpp:103 Top shape: 64 (64) I0902 22:52:17.938611 2079114000 net.cpp:67 Creating Layer ip I0902 22:52:17.938617 2079114000 net.cpp:394 ip ip I0902 22:52:17.939196 2079114000 net.cpp:96 Setting up ip I0902 22:52:17.940289 2079114000 net.cpp:103 Top shape: 64 2 (128) I0902 22:5

29、2:17.941270 2079114000 net.cpp:67 Creating Layer loss I0902 22:52:17.941305 2079114000 net.cpp:394 loss loss # set up the loss and configure the backward pass I0902 22:52:17.941328 2079114000 net.cpp:96 Setting up loss CaffeCN 深度 学习社区 | http:/ 11 I0902 22:52:17.941328 2079114000 net.cpp:103 Top shap

30、e: (1) I0902 22:52:17.941329 2079114000 net.cpp:109 with loss weight 1 I0902 22:52:17.941779 2079114000 net.cpp:170 loss needs backward computation. I0902 22:52:17.941787 2079114000 net.cpp:170 ip needs backward computation. I0902 22:52:17.941794 2079114000 net.cpp:172 mnist does not need backward c

31、omputation. # determine outputs I0902 22:52:17.941800 2079114000 net.cpp:208 This network produces output loss # finish initialization and report memory usage I0902 22:52:17.941810 2079114000 net.cpp:467 Collecting Learning Rate and Weight Decay. I0902 22:52:17.941818 2079114000 net.cpp:219 Network

32、initialization done. I0902 22:52:17.941824 2079114000 net.cpp:220 Memory required for data: 201476 Caffe 中网络的构建与设备无关,可回忆下我们 之前的 解释, blobs 和 layers 在模型定义时是隐藏了 实现细节的 。网络构建完之后,通过设置 Caffe:mode()函数中的 Caffe:set_mode(),即可实现在 CPU 或 GPU 上的运行。采用 CPU 或 GPU 计算得到的结果相同(通过多次实验已证明), CPU 与 GPU 无缝切换并且独立于模型定义。对于研究和调用来

33、说,将模型定义和实现分离开来是最好不过了。 1.3.1 模型格式 模型是利用文本 protocol buffer( prototxt)语言定义的,学习好的模型 会 被 序列化 地 存储在二进制 protocol buffer (binaryproto) .caffemodel 文件中。 模型格式用 protobuf 语言定义在 caffe.proto 文件中。大部分源文件中 都带有解释 ,所以鼓励大家去查看。 Caffe 使用 Google Protocol Buffer 有以下优势:按序排列时二进制字符串尺寸最小,高效序列化,易读的文本格式与二进制版本兼容,可用多种语言实现高效的接口,尤其是

34、 C+和 Python。这些优势造就了 Caffe 模型 的灵活性与扩展性。 CaffeCN 深度 学习社区 | http:/ 12 本 章翻译 、 校对 、 审校 人员 : 翻译 :郑 昌 艳 校对:王蒙蒙、马杰超 审校 : 辛淼 CaffeCN 深度 学习社区 | http:/ 13 第二章 Forward and Backward(前传 /反传) 前传和反传是一个 网络 最重要的计算过程。 下面以最简单的逻辑回归分类器为例。 2.1 前传 前传 ( forward) 过程为给定 的待 推断的 输入计算输出。在前传过程中, Caffe 组合每一层 的 计算以得到整个模型的计算“函数”。本过

35、程自底向上进行。 数据 x 通过一个内积层得到 )(xg ,然后通过 softmax 层得到 )( xgh ,通过 softmax loss 得到 )(xfw 。 CaffeCN 深度 学习社区 | http:/ 14 2.2 反传 反传 ( backward) 过程根据损失 来 计算梯度 从而 进行学习。在反传过程中, Caffe 通过自动求导并反向组合每一层的梯度来计算整个网络的梯度。这就是反传过程的本质。本过程自顶向下进行。 反传过程以损失开始,然后根据输出计算梯度 hfw 。根据链式准则,逐层计算出模型其余部分的梯度。有参数的层,例如 INNER_PRODUCT 层 , 会在反传过程中

36、根据参数计算梯度ipwwf 。 2.3 Caffe 中前传和反传的实现 只要定义好了模型,这些计算就可以立即进行: Caffe 已经为你准备好了前传和反传的实现方法。 Net:Forward()和 Net:Backward()方法实现网络的前传和后传,而 Layer:Forward()和Layer:Backward()计算每一层的前传后传。 每一层都有 forward_cpu, gpu()和 backward_cpu, gpu方法来适应不同的计算模式。由于 条件限制或者为了使用便利,一 个 层可能仅实现 了 CPU 或者 GPU 模式。 CaffeCN 深度 学习社区 | http:/ 15

37、Solver 优化一个模型,首先通过调用前传来获得输出和损失,然后调用反传产生模型的梯度,将梯度与权值更新后相结合来最小化损失。 Solver、 网络和层之间的分工使得 Caffe可以模块化并且开源。 若想了解更多关于 Caffe 前传和后传 的 层的 类型,可参考 层类别 部分。 本 章翻译 、 校对 、 审校 人员 : 翻译 : 师亚亭 校对: 潘智斌、张欣 审校 : 辛淼 CaffeCN 深度 学习社区 | http:/ 16 第三章 Loss 与大多数的机器学习模型一样,在 Caffe 中,学习是由一个 损失 函数驱动的 ( 通常也被称为 误差 、 代价 或者 目标 函数 ) 。一个损

38、失函数通过将参数集(即当前的网络权值)映射到一个可以标识这些参数 “不良程度 ”的标量值来学习目标。因此,学习的目的是找到一个网络权重的集合,使得损失函数最小。 在 Caffe中,损失是通过网络的前向计算得到的。每一层 由 一系列的输入 blobs (bottom),然后产生一系列的输出 blobs (top)。这些层的某些输出可以用来作为损失函数。典型的一对多分类任务的损失函数是 softMaxWithLoss 函数,使用以下的网络定义,例如 : layer name: “loss“ type: “SoftmaxWithLoss“ bottom: “pred“ bottom: “label“

39、 top: “loss“ 在 softMaxWithLoss 函数中, top blob 是一个 标量 数值 , 该数值是整个 batch 的损失平均值 ( 由预测值 pred 和真实值 label 计算得到 ) 。 3.1 Loss weights 对于 含 有 多 个 损失层的网络 ( 例如,一个网络使用一个 softMaxWithLoss 输入分类并使用 EuclideanLoss 层进行重构 ), 损失权值可以被用来指定它们之间的相对重要性。 按照惯例,有着 Loss 后缀的 Caffe 层对损失函数有贡献,其他层被假定仅仅用于中间计算。然而,通过在层定义中添加一个 loss_weig

40、ht:字段到由该层的 top blob,任何层都可以作为一个 loss。对于带后缀 Loss 的层来说,其对于该层的第一个 top blob 含有一个隐式的 loss_weight:1;其他层对应于所有 top blob 有一个隐式的 loss_weight:0。因此,上面的softMaxWithLoss 层等价于: CaffeCN 深度 学习社区 | http:/ 17 layer name: “loss“ type: “SoftmaxWithLoss“ bottom: “pred“ bottom: “label“ top: “loss“ loss_weight: 1 然而,任何可以反向传播

41、的层,可允许给予一个非 0 的 loss_weight,例如,如果需要,对网络的某些中间层所产生的激活进行正则化。对于具有相关非 0 损失的非单输出,损失函数可以通过对所有 blob 求和来进行简单地计算。 那么,在 Caffe 中最终的损失函数可以通过对整个网络中所有的权值损失进行求和计算获得,正如以下的伪代码: loss := 0 for layer in layers: for top, loss_weight in layer.tops, layer.loss_weights: loss += loss_weight * sum(top) 本 章翻译 、 校对 、审校 人员 : 翻译

42、: 龚国平 校对: 刘艳飞 审校 : 辛淼 CaffeCN 深度 学习社区 | http:/ 18 第四 章 Solver 4.1 Solver 简介 Solver 通过协调 Net 的前向 推断 计算和反向梯度计算( forward inference and backward gradients), 来 对参数进行更新, 从而 达到 减小 loss 的 目的 。 Caffe 模型的学习被分为两个部分:由 Solver 进行优化、更新参数,由 Net 计算出 loss 和 gradient。 Caffe 支持 的 solvers 包括 : Stochastic Gradient Descen

43、t (type: “SGD“), 随机梯度下降 AdaDelta (type: “AdaDelta“) Adaptive Gradient (type: “AdaGrad“),自适应梯度 Adam (type: “Adam“) Nesterov s Accelerated Gradient (type: “Nesterov“) and RMSprop (type: “RMSProp“) Solver: 1. 用于优化过程 的记录 、 创建 训练网络(用于学习)和测试网络(用于评估) ; 2. 通过 forward 和 backward 过程 来 迭代地 优化和更新参数 ; 3. 周期性地 用

44、测试网络 评估 模型性能 ; 4. 在优化过程中记录模型和 solver 状态 的快照 ( snapshot) ; 每一次迭代过称中 : 1. 调用 Net 的 前向过程 计算出 输出 和 loss; 2. 调用 Net 的 后向过程 计算出 梯度 ( loss 对每层的权重 w 和偏置 b 求导 ) ; 3. 根据下面所讲的 Solver 方法,利用 梯度 更新参数 ; 4. 根据学习率( learning rate), 历史数据 和 求解 方法 更新 solver 的状态 ,使权重从初始化状态逐步更新到最终的学习到的状态。 solvers 的运行模式有 CPU/GPU 两 种模式 。 4.

45、2 Methods CaffeCN 深度 学习社区 | http:/ 19 Solver 方法 用于最小化损失( loss)值。给定一个数据集 D,优化的目标是 D 中所有数据损失的均值,即平均损失 , 取 得 最小值。 () = 1|()+|() 其中 ()是数据中 ()项的损失, ()是正则项,权重为 。当 D 数据量很大时(译注:直接采用 梯度下降方法计算量很大),在每一次迭代中,我们采用数据集的一个随机子集( mini-batch)来近似代替,其数据量远小于整个数据集( |) 。 () 1()+() 在前向过程( forward)中计算 (即 loss),在反向过程( backward

46、)中计算 (即梯度 gradient)。根据 误差梯度 、 正则项的梯度 () 以及 其他 方法的特定项 来 计算 参数 更新 量 。 4.2.1 SGD 随机梯度下降( Stochastic gradient descent, type:”SGD”)利用负 梯度 ()和上一次权重的更新值 的线性组合来更新权重 W。学习 率( learning rate) 是负 梯度的权重。动量( momentum) 是上一次更新值的权重。 有如下公式,根据上一次计算的更新值 和当前权重 来计算本次的更新值 +1和权重 +1: +1 = () +1 = +1 学习的超参数( 和 )需要一定的调整才能达到最好的

47、效果。如果你不是很清楚该怎样做的话,请看下面的 “经验法则( Rules of thumb) ”,更多的细节请参考 Leon Bottou 的Stochastic Gradient Descent Tricks1 1 L. Bottou. Stochastic Gradient Descent Tricks. Neural Networks: Tricks of the Trade: Springer, 2012. 设定学习率 和动量 的经验法则 CaffeCN 深度 学习社区 | http:/ 20 一个比较好的建议是,将学习速率( learning rate )初始化为 0.01 = 102,然后在训练( training)中当 loss 达到稳定时,将 除以一个常数(例如 10),将这个过程重复多次。对于动量( momentum )一般设置为 = 0.9, 使 weight 的更新更为平缓,使学习过程更为稳定、快速。 这是 Krizhevsky 在 其 著名 的赢得 ILSVRC-2012 竞赛 过程 中 使用 的技巧 1, Caffe 中的SolverParameter 让个技巧易于实现。 详见: ./examples/imagenet/alexnet_solver.prototxt. 要使用上述技巧,可以将下面的代码添加到自定义的 solver pr

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报