caffe详解之solver
从零开始,一步一步学习caffe的使用,期间贯穿深度学习和调参的相关知识!
solver配置说明
通过前面的讲解我们了解了不同的层,作为我们设计深度神经网络的积木,梳理了caffe中给定的损失函数(当然我们也可以针对自己的问题设计),并进一步对优化算法进行了细致的总结,接下来我们将caffe中需要配置的solver.prototxt
中涉及到的参数进行详细剖析。
我们首先看一看lenet
中定义的solver
配置文件。
net: "examples/mnist/lenet_train_test.prototxt" #网络位置
test_iter: 100 #设置测试迭代次数
test_interval: 500 #测试间隔。也就是每训练500次,才进行一次测试。
base_lr: 0.01 #用于设置基础学习率
momentum: 0.9 #动量大小
type: SGD #SGD优化算法
weight_decay: 0.0005 # 权重衰减项(正则化项),防止过拟合的一个参数λ
lr_policy: "inv" #学习率调整策略
gamma: 0.0001
power: 0.75
display: 100
max_iter: 20000 # 最大迭代次数。这个数设置太小,会导致没有收敛,精确度很低。设置太大,会导致震荡,浪费时间。
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
solver_mode: CPU
设置网络定义文件位置
net: "examples/mnist/lenet_train_test.prototxt"
设置网络定义文件位置,也可以分别设定train
和test
如下所示:
train_net: "examples/hdf5_classification/logreg_auto_train.prototxt"
test_net: "examples/hdf5_classification/logreg_auto_test.prototxt"
设置测试迭代次数
test_iter: 100
这个要与test layer
中的batch_size
结合起来理解。mnist
数据中测试样本总数为10000,一次性执行全部数据效率很低,因此我们将测试数据分成几个批次(batch_num
)来执行,每个批次的数量就是batch_size
。假设我们设置batch_size
为100,则需要迭代100次才能将10000个数据全部执行完。因此test_iter
设置为100。执行完一次全部数据,称之为一个epoch
。
总结
- 当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个
epoch
。一般情况下在迭代的过程中需要使用多次epoch
防止模型欠拟合。 - 在不能将数据一次性通过神经网络的时候,就需要将数据集分成几个
batch
(Number of batches,简记为batch_num
)。 - 一个
batch
中的样本总数(Batch Size,简记为batch_size
) -
Iteration
是batch
需要完成一个epoch
的次数。记住:在一个epoch
中,batch_num
和Iteration
是相等的。比如对于一个有 2000 个训练样本的数据集。将 2000 个样本分成4个大小为 500 的batch_size
,那么完成一个epoch
需要 4 个iteration
,对应的batch_num
也是4。
设置测试间隔
test_interval: 500
测试间隔。也就是每训练500次,才进行一次测试。
设置优化算法类型
type: SGD
常见的优化算法包括:SGD、Adagrad、RMSProp、AdaDelta、Adam等。
设置动量大小
momentum :0.9
momentum指的是设置上面公式r的值,一般设置为0.9
。
设置权重衰减系数
weight_decay: 0.0005
设置显示周期
display: 100
每训练100次,在屏幕上显示一次。如果设置为0,则不显示。
设置最大迭代次数
max_iter: 20000
最大迭代次数,到达20000次就停止了。
设置快照
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
快照。将训练出来的model
和solver
状态进行保存,snapshot
用于设置训练多少次后进行保存,默认为0,不保存。snapshot_prefix
设置保存路径。
还可以设置snapshot_diff
,是否保存梯度值,默认为false
,不保存。
也可以设置snapshot_format
,保存的类型。有两种选择:HDF5
和BINARYPROTO
,默认为BINARYPROTO
设置运行模式
solver_mode: CPU
设置运行模式。默认为GPU,如果你没有GPU,则需要改成CPU,否则会出错。
设置学习率调整策略
base_lr: 0.01 # base_lr用于设置基础学习率
lr_policy: "inv" # 学习率调整策略
gamma: 0.0001
power: 0.75
学习率调整的策略还包括
参考
Caffe学习系列(7):solver及其配置
- WannaCry勒索病毒详细解读
- matlab GUI基础3
- 不使用反射的实体类方案
- matlab GUI基础1
- Why to do,What to do,Where to do 与 Lambda表达式!
- Cloak ; Dagger攻击:一种可针对所有版本Android的攻击技术(含演示视频)
- 实例探究字符编码:unicode,utf-8,default,gb2312 的区别
- 分布式计算,WCF+JSON+实体对象与WebService+DataSet效率大比拼
- 【自然框架】 页面里的父类—— 改进和想法、解释
- 线性神经网络
- 【数据可视化】深度解析大数据可视化设计案例分析
- 使用IE6看老赵的博客——比较完美版(可以在线查看、回复)
- 【Python环境】R vs Python:硬碰硬的数据分析
- 使用IE6看老赵的博客——jQuery初探
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python如何从键盘获取输入实例
- 使用Keras实现Tensor的相乘和相加代码
- php无限级分类实现评论及回复功能
- php获取手机端的号码以及ip地址实例代码
- PHP数组遍历的几种常见方式总结
- 详解php协程知识点
- php curl简单采集图片生成base64编码(并附curl函数参数说明)
- PHP通过get方法获得form表单数据方法总结
- PHP filesize函数用法浅析
- PHP中创建和编辑Excel表格的方法
- php二维数组按某个键值排序的实例讲解
- thinkphp5引入公共部分header、footer的方法详解
- php实现文章评论系统
- PHP如何搭建百度Ueditor富文本编辑器
- 浅谈keras.callbacks设置模型保存策略