caffe下get_ilsvrc_aux简单解读

来源:互联网 发布:印度电影 知乎 编辑:程序博客网 时间:2024/06/02 16:25
1. 数据预处理

1) 下载训练数据和验证数据

2)  准备额外的数据:

./data/ilsvrc12/get_ilsvrc_aux.sh

3) 产生lmdb数据
采用create_iamgetnet 直接在里面设置,对图片进行缩放,并在/examples/imagenet下产生lmdb格式文件
./examples/imagenet/create_imagenet.sh

也可采用如下命令将图片进行缩放:

for name in /path/to/imagenet/val/*.JPEG; do    convert -resize 256x256\! $name $namedone
4) 计算图片均值
./examples/imagenet/make_imagenet_mean.sh
另外会在目录下生成***mean.binaryproto文件

2 模型训练
1) 训练模型在/models/bvlc_reference_caffenet/train_val.protext上
主要包括:
训练阶段调用lmdb文件,同时对图片进行mirror,裁剪等,调用均值文件, 批次,学习率,卷积,池化等
训练批次大小:256
测试批次大小:50
测试阶段多了一个输出层获得输出正确率
在训练过程中,会用测试集(这里指验证集)进行测试,输出损失loss,和accuracy
2) 迭代次数,学习策略等定义在solver.prototxt中

net: "models/bvlc_reference_caffenet/train_val.prototxt"test_iter: 1000#测试集迭代次数test_iter = num_test/batch_size = 50000/50 = 1000test_interval: 1000  #每隔1000个训练迭代次数,用验证集测试一次base_lr: 0.01#初始学习率为0.01lr_policy: "step"gamma: 0.1stepsize: 100000display: 20#每20次迭代显示一次信息max_iter: 450000   #运行总共迭代次数450,000, (大约 90 epochs)怎么计算:# 共 1281167个样本,每个批次256个样本,共1281167/256=5004.5个批次.# 运行完全部样本(1个循环epoch)需要迭代次数5004.5次迭代# 450000次迭代可以循环epochs=450000/5004.5=89.9 epochsmomentum: 0.9weight_decay: 0.0005snapshot: 10000#每100,00次迭代快照snapshot_prefix: "models/bvlc_reference_caffenet/caffenet_train"solver_mode: GPU
3) 训练

./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt

4) 当无意中中断时,可以从snapshot备份的阶段继续开始训练
./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt --snapshot=models/bvlc_reference_caffenet/caffenet_train_iter_10000.solverstate
5) 将训练好的模型用新的数据进行预测,例如手写体的测试(可建立shell脚本)
$./build/tools/caffe.bin test \-model examples/mnist/lenet_train_test.prototxt \-weigths examples/mnist/lenet_iter_1000.caffemodel \-iterations 100 # 参与测试的数目为(iterations*batch_size)
5) 另外关于MNIST模型的参数解读:

#网络的名字name: "LeNet"# 定义数据层:名字,数据类型,读取源数据,批次layer {  name: "mnist"  type: "Data"  transform_param {    scale: 0.00390625#将(0,256)归一化到(0,1), scale = 1/256  }  data_param {    source: "mnist_train_lmdb"    backend: LMDB    batch_size: 64  }  top: "data"  top: "label"#最后产生两个块,一个数据块,一个标签块blob}定义卷积层layer {  name: "conv1"  type: "Convolution"  param { lr_mult: 1 }  param { lr_mult: 2 }  convolution_param {    num_output: 20#卷积核数目    kernel_size: 5    stride: 1#步长    weight_filler {      type: "xavier"#采用xavier算法(基于输入和输出神经元)初始化权值    }    bias_filler {      type: "constant"# 初始化为常数0    }  }  bottom: "data"  top: "conv1"}注:lr_mults为调整权值的学习率,默认与solver.protxt定义相同偏值学习率设置为权值的2倍(通常能获得更好的收敛)# 定义池化层:layer {  name: "pool1"  type: "Pooling"  pooling_param {    kernel_size: 2#池化核大小2    stride: 2#步长2,这样池化时无重叠    pool: MAX  }  bottom: "conv1"  top: "pool1"}–----继续定义卷积和池化层-----------# 定义全连接层(InnerProduct)layer {  name: "ip1"  type: "InnerProduct"  param { lr_mult: 1 }  param { lr_mult: 2 }  #对应偏值学习率的系数  inner_product_param {    num_output: 500#输出单元为500    weight_filler {      type: "xavier"    }    bias_filler {      type: "constant"    }  }  bottom: "pool2"  top: "ip1"}# 定义ReLU层layer {  name: "relu1"  type: "ReLU"  bottom: "ip1"  top: "ip1"}# 注:ReLu执行element-wise operation操作,即对应矩阵元素的点层(a.*b), 是一种in-place操# 作,所以输入和输出名字一样# 定义另一个全连接层layer {  name: "ip2"  type: "InnerProduct"  param { lr_mult: 1 }  param { lr_mult: 2 }  inner_product_param {    num_output: 10    weight_filler {      type: "xavier"    }    bias_filler {      type: "constant"    }  }  bottom: "ip1"  top: "ip2"}# 定义损失层layer {  name: "loss"  type: "SoftmaxWithLoss"  bottom: "ip2"  bottom: "label"  top: “loss”}# 层定义的规则:layer {  // ...layer definition...  include: { phase: TRAIN }}# 默认所有层在训练和测试都共享,如果定义了,值属于phase共享

0 0