image1000test200数据集分类与检索完整过程:
1.准备数据:数据集图片分10个类,每个类有100个train图片(train文件夹下,一共1000),20个test图片(val文件夹下,一共200)
首先准备自己的数据集(都是全路径),我们需要准备的文件有:
1) 文件夹train:里面放训练的图片
2 )文件夹val:里面放val的图片
3 )train.txt :训练图片的文件名和对应的类别, 格式每一行文件名+ 空格 + label
4) val.txt:测试图片的文件名和对应的类别
2.创建lmdb格式数据集
在caffe安装的根目录下执行下面的脚本可以创建lmdb文件,用于caffe的数据输入;
./examples/image_test/create_imagenet.sh
对于这个脚本,我们打开,根据自己的路径做更改;
参考/home/nielsen/caffe-master/examples/image_test/create_imagenet.sh
3. 计算图像均值
输入数据需要训练图片的均值图像(需要自己修改路径 路径最前面千万不要多加空格,血的教训)只计算训练集的均值,测试的时候减去的也是训练集的均值而不是测试集的
./examples/imagenet/make_imagenet_mean.sh
4. 配置网络结构文件(检查train和test不能同时用train_lmdb,会造成死锁卡在那)
网络模型文件在models/bvlc_reference_caffenet/train_val.prototxt文件中,复制到image_test文件夹中(统一管理比较方便)
这里我们直接使用caffe提供的这个网络结构,以后我们再根据自己的想法做更改。
-----提供的数据为10类,则最后fc8层的num_output相应的改为10,即fc8为10个节点
注意:需要打开这个文件,更改里面的路径
我们对train_val.prototxt 修改后,路径:/home/nielsen/caffe-master/examples/image_test/train_val.prototxt
5. 配置训练参数文件(net路径也需要修改)
训练参数文件在:models/bvlc_reference_caffenet/solver.prototxt中,复制到image_test文件夹中(统一管理比较方便)
我们对solver.prototxt 修改后的参数如下:
net: "examples/image_test/train_val.prototxt"
test_iter: 4 # 测试的时候输入4个batch,
# 说明:查看我们train_val.prototxt文件,发现batch_size: 50;我们的test图片是200张,200/50=4,所以
test_interval: 1000 # 每迭代1000次,测试一次
base_lr: 0.01 # 初始的学习率为0.01
lr_policy: "step"
gamma: 0.1
stepsize: 3000 # 每迭代3000次,调整一次学习率
display: 20 # 每迭代20次,显示一次
max_iter: 12000 # 最大迭代12000次
momentum: 0.9
weight_decay: 0.0005
snapshot: 5000 # 每迭代5000就存一次快照
snapshot_prefix: "examples/image_test/caffenet_train" # 快照存放路径
solver_mode: CPU # 选择模式CPU
6. 开始利用自己的数据训练网络(在caffe的根目录下执行)
./build/tools/caffe train -solver=/home/nielsen/caffe-master/examples/image_test/solver.prototxt
caffenet结构的输出层的类别数一定要大于我训练集的类别数才可以收敛!
比如原来我把图像类别的label设置成1,2,3,改成0,1,2后,最后全连接层的转出改成3就OK了。
./build/tools/caffe train -solver examples/image_test/solver10.prototxt -weights examples/image_test/caffenet_train_iter_5000.caffemodel
微调参考:
1)we will change the name of the last layer form fc8 to fc8_flickr in our prototxt, it will begin training with random weights.
2)decrease base_lr(初始学习率,在train_val.protxt文件值中) and boost the lr_mult(局部学习倍率,conv和fc层才有) on the newly introduced layer(fc8_flickr).
3)set stepsize(solver.prototxt,迭代多少次就下降一次学习率) to a lower value. So the learning rate to go down faster
4)So in the solver.prototxt,we can find the base_lr is 0.001 from 0.01,and the stepsize is become to 20000 from 100000.(重要)
base_lr: 0.001~0.01 降低,基础学习率降低,不然太快的话loss会变成non
lr_mult: w:10,b:20 增大,最后一个fc层(分类层)的局部学习率
stepsize: 20000~100000 降低,迭代多少次就调整一次学习率
1.准备数据:数据集图片分10个类,每个类有100个train图片(train文件夹下,一共1000),20个test图片(val文件夹下,一共200)
首先准备自己的数据集(都是全路径),我们需要准备的文件有:
1) 文件夹train:里面放训练的图片
2 )文件夹val:里面放val的图片
3 )train.txt :训练图片的文件名和对应的类别, 格式每一行文件名+ 空格 + label
4) val.txt:测试图片的文件名和对应的类别
2.创建lmdb格式数据集
在caffe安装的根目录下执行下面的脚本可以创建lmdb文件,用于caffe的数据输入;
./examples/image_test/create_imagenet.sh
对于这个脚本,我们打开,根据自己的路径做更改;
参考/home/nielsen/caffe-master/examples/image_test/create_imagenet.sh
3. 计算图像均值
输入数据需要训练图片的均值图像(需要自己修改路径 路径最前面千万不要多加空格,血的教训)只计算训练集的均值,测试的时候减去的也是训练集的均值而不是测试集的
./examples/imagenet/make_imagenet_mean.sh
4. 配置网络结构文件(检查train和test不能同时用train_lmdb,会造成死锁卡在那)
网络模型文件在models/bvlc_reference_caffenet/train_val.prototxt文件中,复制到image_test文件夹中(统一管理比较方便)
这里我们直接使用caffe提供的这个网络结构,以后我们再根据自己的想法做更改。
-----提供的数据为10类,则最后fc8层的num_output相应的改为10,即fc8为10个节点
注意:需要打开这个文件,更改里面的路径
我们对train_val.prototxt 修改后,路径:/home/nielsen/caffe-master/examples/image_test/train_val.prototxt
5. 配置训练参数文件(net路径也需要修改)
训练参数文件在:models/bvlc_reference_caffenet/solver.prototxt中,复制到image_test文件夹中(统一管理比较方便)
我们对solver.prototxt 修改后的参数如下:
net: "examples/image_test/train_val.prototxt"
test_iter: 4 # 测试的时候输入4个batch,
# 说明:查看我们train_val.prototxt文件,发现batch_size: 50;我们的test图片是200张,200/50=4,所以
test_interval: 1000 # 每迭代1000次,测试一次
base_lr: 0.01 # 初始的学习率为0.01
lr_policy: "step"
gamma: 0.1
stepsize: 3000 # 每迭代3000次,调整一次学习率
display: 20 # 每迭代20次,显示一次
max_iter: 12000 # 最大迭代12000次
momentum: 0.9
weight_decay: 0.0005
snapshot: 5000 # 每迭代5000就存一次快照
snapshot_prefix: "examples/image_test/caffenet_train" # 快照存放路径
solver_mode: CPU # 选择模式CPU
6. 开始利用自己的数据训练网络(在caffe的根目录下执行)
./build/tools/caffe train -solver=/home/nielsen/caffe-master/examples/image_test/solver.prototxt
训练过程中,可以看到正确率在不断提升;最后的准确率是50%;
我们的样本数很少,当图片到百万数量级的时候,效果会很大提升;
7. 改变策略,使用blvc model微调
fc8层的输出节点改为10个,数据只有10类,用已经训练好的1000类进行微调(变动的层fc8需要改名字,不然还是原来的参数)
(学习率:最后一层fc的lr_mult改为10,20 且 降低base_lr为0.001)caffenet结构的输出层的类别数一定要大于我训练集的类别数才可以收敛!
比如原来我把图像类别的label设置成1,2,3,改成0,1,2后,最后全连接层的转出改成3就OK了。
./build/tools/caffe train -solver examples/image_test/solver10.prototxt -weights examples/image_test/caffenet_train_iter_5000.caffemodel
微调参考:
1)we will change the name of the last layer form fc8 to fc8_flickr in our prototxt, it will begin training with random weights.
2)decrease base_lr(初始学习率,在train_val.protxt文件值中) and boost the lr_mult(局部学习倍率,conv和fc层才有) on the newly introduced layer(fc8_flickr).
3)set stepsize(solver.prototxt,迭代多少次就下降一次学习率) to a lower value. So the learning rate to go down faster
4)So in the solver.prototxt,we can find the base_lr is 0.001 from 0.01,and the stepsize is become to 20000 from 100000.(重要)
base_lr: 0.001~0.01 降低,基础学习率降低,不然太快的话loss会变成non
lr_mult: w:10,b:20 增大,最后一个fc层(分类层)的局部学习率
stepsize: 20000~100000 降低,迭代多少次就调整一次学习率