赞
踩
caffe模型需要两个最重要的参数文件:网络模型和参数模型,分别是*.prototxt和*.solver.prototxt文件。
caffe网络模型文件定义了网络的每一层行为。
训练数据层代码如下:
layer { name: "mnist" //网络模型的名称 type: "Data" //输入层的类型 top: "data" //本层下一层连接data top: "label" //本层下一层连接label include { phase: TRAIN //训练阶段 } transform_param { scale:0.00390625 //输入图片像素归一化到[0,1],1除以256为0.00390625 } data_param { source: "examples/mnist/mnist_train_lmdb" //需要训练数据的路径 batch_size: 100 //批量处理数据大小 backend: LMDB //数据类型 } }
name: 表示该层的名称,可随意取。
type: 层类型,如果是Data,表示数据来源于LevelDB或LMDB。根据数据的来源不同,数据层的类型也不同。一般在练习的时候,我们都是采 用的LevelDB或LMDB数据,因此层类型设置为Data。
top或bottom: 每一层用bottom来输入数据,用top来输出数据。如果只有top没有bottom,则此层只有输出,没有输入。反之亦然。如果有多个 top或多个bottom,表示有多个blobs数据的输入和输出。
data 与 label: 在数据层中,至少有一个命名为data的top。如果有第二个top,一般命名为label。 这种(data,label)配对是分类模型所必需的。
include: 一般训练的时候和测试的时候,模型的层是不一样的。该层(layer)是属于训练阶段的层,还是属于测试阶段的层,需要用include来指定。如果没有include参数,则表示该层既在训练模型中,又在测试模型中。
Transformations: 数据的预处理,可以将数据变换到定义的范围内。如设置scale为0.00390625,实际上就是1/255, 即将输入数据由0-255归一化到0-1之间
卷积层Convoluation代码如下:
池化层Pooling代码如下:
layer { name: "conv1" //网络层的名称是conv1 type: "Convolution" //网络层的类型是卷积层 bottom: "data" //网络层的输入层是 data层 top: "conv1" //该层的输出层名称为conv1 /*param定义权重和偏置的学习率,学习率大,迭代速度快,但是容易找不到最优解,学习率小,迭代速度慢,耗时久。如果有两个lr_mult参数,则第一个表示权重(卷积核)的学习率系数,第二个表示偏置的学习率系。lr_mult定义的只是学习率系数,最终的值需要乘以solver.prototxt配置文件中配置的base_lr的值,一般偏置的学习率系数是权重学习率系数的2倍*/ param { lr_mult: 1 //该层权重学习率的系数为1 } param { lr_mult: 2 //该层偏置学习率的系数为2 } convolution_param { //卷积操作的参数设置 num_output: 20 //卷积输出特征图的数量为20 kernel_size: 5 //卷积核的大小是5*5 stride: 1 //卷积操作的步长是1,即卷积核逐个移动 weight_filler { //滤波的类型 type: "xavier" //卷积核参数采用xavier方法初始化 } bias_filler { type: "constant" //偏置初始值为0 } } }
- layer {
- name: "pool1" //网络层的名称是pool1
- type: "Pooling" //网络层的类型是池化层
- bottom: "conv1" //网络层的输入时conv1(第一卷积层)
- top: "pool1" //网络层的输出名称是 pool1
-
- //池化操作的参数设置
- pooling_param {
- pool: MAX //最大值池化
- kernel_size: 2 //池化核尺寸 是2*2
- stride: 2 //池化步长是2
- }
- }
全连接层:
layer { name: "ip1" //网络层的名称是ip1 type: "InnerProduct" //网络层的类型是 全连接层 bottom: "pool2" //网络层的输入时 pool2(第二池化层) top: "ip1" //网络层的输出名称是ip1 param { lr_mult: 1 //卷积核的学习率系数是1 } param { lr_mult: 2 //偏置的学习率系数是2 } //第一全连接层参数设置 inner_product_param { num_output: 500 //输出向量维度,500个输出神经元 weight_filler { type: "xavier" //卷积核参数采用xavier方法初始化 } bias_filler { type: "constant" //偏置初始值为0 } } }
激活层ReLU代码如下:
- layer {
- name: "relu1" //网络层的名称是relu1
- type: "ReLU" //网络层的类型是ReLU激活函数
- bottom: "ip1" //网络层的输入时ip1(第一全连接层)
- top: "ip1" //网络层的输出名称是 ip1,跟输入名称一样
- }
输出层softmax代码如下:
- layer {
- name: "prob" //网络的名称是 prob
- type: "Softmax" //网络的类型是损失函数
- bottom: "ip2" //网络的输入是 ip2(第二全连接层)
- top: "prob" //网络的输出名称是 prob
- }
*.solver.prototxt定义了网络训练过程中需要设置的参数,代码如下
- net: "examples/mnist/lenet_train_test.prototxt" //网络模型的目录,文件路径要从caffe的根目录开始
- test_iter: 100 //迭代100次,test_iter×batch_size=需要训练的图片总数
- test_interval: 500 //每训练500次,进行一次测试
- base_lr: 0.01 //基础学习率
- momentum: 0.9 //上一次梯度更新的权重
- type: SGD //优化算法选择,默认SGD
- weight_decay: 0.0005 //权重衰减项,防止过拟合
- lr_policy: "inv" //对基础学习率进行调整的策略,如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power)
- gamma: 0.0001
- power: 0.75
- display: 100 //每训练100次,在屏幕上显示一次。如果设置为0,则不显示。
- max_iter: 20000 //最大迭代次数。这个数设置太小,会导致没有收敛,精确度很低。设置太大,会导致震荡,浪费时间。
- snapshot: 5000 //用于设置训练多少次后进行保存
- snapshot_prefix: "examples/mnist/lenet" //保存路径
- solver_mode: GPU //设置运行模式
训练出的模型输出文件形式为*.caffemodel
参考博客:点击打开链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。