模型三部分参数
模型是caffe学习系统包含数据与模型两个核心组件之一。一个caffe模型含有三部分参数:
- 要学习的参数:
即权值,通过 初始化和反向传播得到更新。随着训练的结束,要学习的参数就此确定,也意味着确定了一个具体的模型。这个模型或者说是最终的学习参数会保存在.caffemodel
文件中。我们可以直接使用这个模型,或者是在这个模型的基础上继续学习。
- 网络结构超参数:
就是Net的蓝图,即如何构建一个具体的Net,是一种构建策略。比如当前卷积层的kernel数量,kernel大小,步长等参数,显然,结构参数是在训练网络前就确定了的。注意:同一个Net的训练结构和测试结构可能不同。结构参数由Net的蓝图文件.prototxt
提供,读取这个文件,得到Net的结构细节,从而指导caffe构建制定Net。
- 训练超参数:
控用于制训练过程的参数,如learning rate,迭代次数,CPU或GPU训练,等。其描述存在于一个.prototxt
文件,一般使用solver.prototxt
这个文件名。
例
先准备数据。在将原始数据(raw data)转换为LMDB格式之后,就可以由数据层(DataLayer)不断从LMDB(磁盘上)读取数据进入网络。
为了对caffe的pipline有个清晰的理解,在工作目录创建文件夹my_linearReggresion
存放关于这个网络的所有内容,将之前创建好的LMDB数据文件放入 my_linearReggresion
。之后创建网络结构文件 mylr.prototxt
和训练超参数文件 lr_solver.prototxt
。
此时的my_linearReggresion
目录tree如下:
1 | . |
上述是以一个简单的logistic reggresion为例。其网络结构如下图(包含训练和测试两个结构,两者共同的层只需定义一遍,不同阶段的要分别定义):
[插图结构图]
参照结构图,定义网络结构超参数文件和训练超参数文件。
编辑mylr.prototxt
先编辑网络结构超参数文件,就是编辑mylr.prototxt
文件。如下:
1 | name: "lrNet" |
其中source
提供LMDB数据的路径,提供绝对路径不用担心出错。
编辑lr_solver.prototxt
按照上述蓝图构建用于训练的网络和用于测试的网络。之后编辑训练超参数文件lr_solver.prototxt
:
1 | # 结构文件的路径,告诉caffe,构建蓝图在哪 |
note: 想上添加type
关键字,用来指定所使用的优化方法,如type: "Nesterov"
,type: "AdaGrad"
,type: "AdaDelta"
等。默认使用SGD
。
有了数据有了模型就可以训练了:
1 | CAFFE train \ |
其中CAFFE
,表示caffe_master提前编译好的caffe工具,就像在caffe_master中的命令./build/tools/caffe
。
总结,要想正确运行,必须保证所配置的路径是有效的:
- 用于执行指令的
build/tools/caffe
命令的路径, - 训练超参数文件的路径
lr_solver.prototxt
, - LMDB数据路径,
- 模型结构超参数文件路径
mylr.prototxt
,
对于Layer的类型
caffe现有的Layer type
:
1 | known types: AbsVal, Accuracy, ArgMax, BNLL, BatchNorm, |
当训练并测试完毕,会有模型文件和快照文件保存于当前目录:
1 | . |
问题:
这些关键字是在哪了与Layer的实现对应起来的呢?当将自己实现的Layer或其他组件键入到caffe源码中时,就需要在某处添加对应关键字。