Caffe_stu03_小训练
参考:https://blog.csdn.net/sst___/article/details/79847697
获得数据集
使用官方的数据集 mnist
在caffe
文件夹下 执行./data/mnist/get_mnist.sh
或者编写以下shell文件
#!/usr/bin/env sh
# This scripts downloads the mnist data and unzips it.DIR="$( cd "$(dirname "$0")" ; pwd -P )"
cd "$DIR"echo "Downloading..."for fname in train-images-idx3-ubyte train-labels-idx1-ubyte t10k-images-idx3-ubyte t10k-labels-idx1-ubyte
doif [ ! -e $fname ]; thenwget --no-check-certificate http://yann.lecun.com/exdb/mnist/${fname}.gzgunzip ${fname}.gzfi
done
执行得到数据集
使用自己的数据集
这里我借用的是别人的数据集 百度网盘
下载之后只保留train和val即可,因为我们后面用这两个文件来自己生成train.txt和val.txt.
在caffe/examples
文件夹下新建一个myfile_tostudy
文件夹 放入data文件
如果没有 caffe
文件夹 那么可以随便建立一个文件夹用来放数据(只是需要更改后续各个文件的路径)。
这里我因为之前不知道直接安装了caffe后各种bulid/tools 已经自动写入到了Linux的PATH里面去了
所以我git clone了 caffe的源码文件
git clone https://github.com/BVLC/caffe.git
未进行编译,因为后面做着做着发现 所需要的tools都可以直接从命令行使用(下载caffe时自动写入了PATH)
1. 数据格式处理
生成txt文件
在myfile_tostudy
下建立一个shell
文件。我的命名为create_filelist.sh
目的是根据所下载的百度网盘里面的图片的进行分类(百度网盘中的文件内容根据文件名进行了分类)
#!/usr/bin/env sh
DATA=examples/myfile_tostudy/data #数据来源的路径
MY=examples/myfile_tostudy/data #生成的txt文件存储位置echo "Create train.txt..."
rm -rf $MY/train.txt #先把文件中原有的同名文件删除
# find $DATA/train -name 15001*.jpg 是在文件加下找到所有前几位名为15001的图片
# cut -d '/' -f4-5 是以'/'为分界符,找到第四至五段的内容截取下来
# sed "s/$/ 0/" 在截取的文件名后面加一个空格和一个标签0
# MY/train.txt 存储到train.txt中
find $DATA/train -name 15001*.jpg | cut -d '/' -f4-5 | sed "s/$/ 0/">>$MY/train.txt
find $DATA/train -name 15059*.jpg | cut -d '/' -f4-5 | sed "s/$/ 1/">>$MY/train.txt
find $DATA/train -name 62047*.jpg | cut -d '/' -f4-5 | sed "s/$/ 2/">>$MY/train.txt
find $DATA/train -name 68021*.jpg | cut -d '/' -f4-5 | sed "s/$/ 3/">>$MY/train.txt
find $DATA/train -name 73018*.jpg | cut -d '/' -f4-5 | sed "s/$/ 4/">>$MY/train.txt
find $DATA/train -name 73063*.jpg | cut -d '/' -f4-5 | sed "s/$/ 5/">>$MY/train.txt
find $DATA/train -name 80012*.jpg | cut -d '/' -f4-5 | sed "s/$/ 6/">>$MY/train.txt
find $DATA/train -name 92002*.jpg | cut -d '/' -f4-5 | sed "s/$/ 7/">>$MY/train.txt
find $DATA/train -name 92017*.jpg | cut -d '/' -f4-5 | sed "s/$/ 8/">>$MY/train.txt
find $DATA/train -name 95005*.jpg | cut -d '/' -f4-5 | sed "s/$/ 9/">>$MY/train.txtecho "Create test.txt..."
rm -rf $MY/val.txtfind $DATA/val -name 15001*.jpg | cut -d '/' -f4-5 | sed "s/$/ 0/">>$MY/val.txt
find $DATA/val -name 15059*.jpg | cut -d '/' -f4-5 | sed "s/$/ 1/">>$MY/val.txt
find $DATA/val -name 62047*.jpg | cut -d '/' -f4-5 | sed "s/$/ 2/">>$MY/val.txt
find $DATA/val -name 68021*.jpg | cut -d '/' -f4-5 | sed "s/$/ 3/">>$MY/val.txt
find $DATA/val -name 73018*.jpg | cut -d '/' -f4-5 | sed "s/$/ 4/">>$MY/val.txt
find $DATA/val -name 73063*.jpg | cut -d '/' -f4-5 | sed "s/$/ 5/">>$MY/val.txt
find $DATA/val -name 80012*.jpg | cut -d '/' -f4-5 | sed "s/$/ 6/">>$MY/val.txt
find $DATA/val -name 92002*.jpg | cut -d '/' -f4-5 | sed "s/$/ 7/">>$MY/val.txt
find $DATA/val -name 92017*.jpg | cut -d '/' -f4-5 | sed "s/$/ 8/">>$MY/val.txt
find $DATA/val -name 95005*.jpg | cut -d '/' -f4-5 | sed "s/$/ 9/">>$MY/val.txtecho "All done"
执行该文件,注意在caffe文件夹下面执行 ,因为前面DATA变量 使用的路径是caffe
下的相对路径 examples/myfile_tostudy/data
如果执行不了,给该文件添加执行权限
chmod a+x examples/myfile_tostudy/create_filelist.sh
执行之后就会得到 train.txt
和 val.txt
转化为db文件
接着把.txt文件转换成caffe能识别的db文件。还是在myfile_tostudy
下建立该文件,文件名为create_lmdb.sh。内容如下:
#!/usr/bin/env sh
# lmdb文件存储的位置
MY=examples/myfile_tostudyTRAIN_DATA_ROOT=/home/hzq/Caffe_stu_dir/caffe/examples/myfile_tostudy/data/
VAL_DATA_ROOT=/home/hzq/Caffe_stu_dir/caffe/examples/myfile_tostudy/data/echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
# 这句是利用caffe自带的图片处理工具对图片进行处理
# 这里因为我未对caffe源码进行编译,所以不存在build/tools/ 目录,直接使用即可(安装时自动写入了PATH)
# convert_imageset命令行使用格式 convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
# FLAGS是处理的参数,像图片的大小,随机抽取还是怎么样。
# ROOTFOLDER是图片存放的绝对目录。
# LISTFILE是文件列表清单。
# DB_NAME是生成的文件存放的位置。
convert_imageset \
--resize_height=32 \
--resize_width=32 \
--shuffle \
$TRAIN_DATA_ROOT \
$MY/data/train.txt \
$MY/img_train_lmdbecho "Create test lmdb.."
rm -rf $MY/img_val_lmdb
convert_imageset \
--resize_height=32 \
--resize_width=32 \
--shuffle \
$VAL_DATA_ROOT \
$MY/data/val.txt \
$MY/img_val_lmdb echo "All Done.."
同理,执行该文件
如果不能执行使用 chmod a+x
增加执行权限
执行之后myfile_tostudy
文件夹下生成img_val_lmdb和img_train_lmdb文件,
里面就是我们想要的caffe能识别的db文件
计算均值
计算均值的原因是保证所有特征都在0附近
在大多数情况下,我们并不关心所输入图像的整体明亮程度
比如对象识别任务中,图像的整体明亮程度,并不会影响图像中存在的是什么物体,我们对图像的平均亮度感兴趣,所以可以减去这个值来进行均值规整化。
创建的文件名为,create_meanfile.sh 代码如下:
EXAMPLE=examples/myfile_tostudy
DATA=examples/myfile_tostudy/# compute_image_mean 是caffe自带的工具,
# 如果没加入到PATH里面需要自己编译caffe源码,然后使用build/tools/compute_image_mean 调用
# $EXAMPLE/img_train_lmdb要处理的文件的位置,$DATA/mean1.binaryproto文件的存储位置
compute_image_mean $EXAMPLE/img_train_lmdb $DATA/mean1.binaryprotoecho "Done."
2.构建网络
在myfile_tostudy
下建立一个.prototxt文件,来搭建网络。文件名为:myfile_tostudy_train_test.prototxt
构建的网络内容如下:
数据层及其参数 参考
1、数据来自于数据库(如LevelDB和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之间
name: "myfile_tostudy"
# 定义网络结构
layer {name: "data" # 网络层的名字type: "Data" # 网络层类型,数据层top: "data" # 这一层产生两个blob输出 一个是数据top: "label" # 一个是标签include {phase: TRAIN # TRAIN:=用于训练,TEST:=用于测试}# caffe中transform_param有四个选项:scale,mean,mirror,crop_size# 执行顺序是mean(file)、mean(value)、crop、mirror、scaletransform_param{mean_file:"examples/myfile_tostudy/mean1.binaryproto" # 用一个配置文件来进行均值操作}data_param {source: "examples/myfile_tostudy/img_train_lmdb" # 包含数据库的目录名称batch_size: 50 # 每次处理的数据个数backend: LMDB # 指定数据库格式,LMDB/LevelDB}
}
layer {name: "data"type: "Data"top: "data"top: "label"include {phase: TEST}transform_param{mean_file:"examples/myfile_tostudy/mean1.binaryproto"}data_param {source: "examples/myfile_tostudy/img_val_lmdb"batch_size: 50backend: LMDB}
}
layer {name: "conv1" type: "Convolution" # 卷积层bottom: "data" # 上一层的输出作为输入top: "conv1" # 输出param {lr_mult: 1 #卷积层参数w的学习率}param { #卷积层参数b的学习率lr_mult: 2}convolution_param {num_output: 32 # 卷积层输出的feature map数量 pad:2 # 卷积层的填充大小kernel_size: 5 # 卷积层的大小stride: 1 # 进行卷积的步长weight_filler { # 参数w的初始话策略type:"gaussian"std:0.0001}bias_filler {type: "constant"}}
}
layer {name: "pool1"type: "Pooling" # 池化层,即下采样层bottom: "conv1"top: "pool1"pooling_param {pool: MAX # 最大值池化,还有AVE均值池化kernel_size: 3stride: 2}
}
layer {name:"relu1"type:"ReLU" # 激活函数层bottom:"pool1"top:"pool1"
}
layer {name: "conv2"type: "Convolution"bottom: "pool1"top: "conv2"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 32pad:2kernel_size: 5stride: 1weight_filler {type: "gaussian"std:0.01}bias_filler {type: "constant"}}
}
layer {name:"relu2"type:"ReLU"bottom:"conv2"top:"conv2"
}
layer {name: "pool2"type: "Pooling"bottom: "conv2"top: "pool2"pooling_param {pool: AVEkernel_size: 3stride: 2}
}
layer {name:"conv3"type:"Convolution"bottom:"pool2"top:"conv3"param{lr_mult:1}param{lr_mult:2}convolution_param {num_output:64pad:2kernel_size:5stride:1weight_filler {type:"gaussian"std:0.01}bias_filler{type:"constant"}}
}
layer {name:"relu3"type:"ReLU"bottom:"conv3"top:"conv3"
}
layer {name:"pool3"type:"Pooling"bottom:"conv3"top:"pool3"pooling_param {pool:AVEkernel_size:3stride:2}
}
layer {name: "ip1"type: "InnerProduct" # 全连接层bottom: "pool3"top: "ip1"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 64weight_filler {type: "gaussian"std:0.1}bias_filler {type: "constant"}}
}layer {name: "ip2"type: "InnerProduct"bottom: "ip1"top: "ip2"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 10weight_filler {type: "gaussian"std:0.1}bias_filler {type: "constant"}}
}
layer {name:"accuracy"type:"Accuracy"bottom:"ip2"bottom:"label"top:"accuracy"include {phase:TEST}
}
layer {name: "loss"type: "SoftmaxWithLoss" # 损失函数层bottom: "ip2"bottom: "label"}
3. 编写网络求解文件
也是建立一个.prototxt文件。文件名为myfile_tostudy_solver.prototxt
,
solver这个文件主要存放模型训练所用到的一些超参数:
- net := 指定待训练模型结构文件,即train_val.prototxt
- test_interval :=
- test_initialization := 指定是否进行初始测试,即模型未进行训练时的测试
- test_iteration := 指定测试时进行的迭代次数
- base_lr :=
- lr_policy := 学习率变更策略,这里有介绍,可供参考
- gamma := 学习率变更策略需要用到的参数
- power := 同上
- stepsize := 学习率变更策略Step的变更步长(固定步长)
- stepvalue := 学习率变更策略Multistep的变更步长(可变步长)
- max_iter :=
- momentum := 动量,这是优化策略(Adam, SGD, … )用到的参数
- momentum2 := 优化策略Adam用到的参数
- weight_decay := 权重衰减率
- clip_gradients := 固定梯度范围
- display := 每隔几次迭代显示一次结果
- snapshot := 快照,每隔几次保存一次模型参数
- snapshot_prefix := 保存模型文件的前缀,可以是路径
- solver_mode :=
用户根据自己的情况进行相应设置,黑体参数为必须指定的,其余参数为可选(根据情况选择)
内容如下:
# 选择网络结构文件
net: "examples/myfile_tostudy/myfile_tostudy_train_test.prototxt"test_iter: 2 # 在测试的时候,需要迭代的次数
test_interval: 50 # 测试间隔,即每隔多少次迭代进行一次测试
base_lr: 0.001 # 指定基本学习率
lr_policy: "step" # 学习率变更策略
gamma: 0.1 # 学习率变更策略需要用到的参数
stepsize:400 # 学习率变更策略Step的变更步长(固定步长)
momentum:0.9 # 动量,这是优化策略(Adam, SGD, … )用到的参数
weight_decay:0.004 # 权重衰减率
display:10 # 每隔几次迭代显示一次结果
max_iter: 2000 # 模型训练的最大迭代次数
snapshot: 2000 # 快照,每隔几次保存一次模型参数
snapshot_prefix: "examples/myfile_tostudy" # 保存模型文件的前缀,可以是路径
solver_mode: CPU # 指定训练模式,即GPU/CPU
4.训练
执行 caffe train -solver examples/myfile_tostudy/myfile_tostudy_solver.prototxt
耐心等待之后
5.测试
将以下两种图片放入imgs
文件夹 用来测试模型
建立deploy.prototex
文件
在 myfile_tostudy
文件夹新增文件deploy.prototxt
name: "myfile4"
layer {name: "data"type: "Input"top: "data"input_param{shape:{dim:1 dim:3 dim:32 dim:32}}}layer {name: "conv1"type: "Convolution"bottom: "data"top: "conv1"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 32pad:2kernel_size: 5stride: 1}
}
layer {name: "pool1"type: "Pooling"bottom: "conv1"top: "pool1"pooling_param {pool: MAXkernel_size: 3stride: 2}
}
layer {name:"relu1"type:"ReLU"bottom:"pool1"top:"pool1"
}
layer {name: "conv2"type: "Convolution"bottom: "pool1"top: "conv2"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 32pad:2kernel_size: 5stride: 1}
}
layer {name:"relu2"type:"ReLU"bottom:"conv2"top:"conv2"
}
layer {name: "pool2"type: "Pooling"bottom: "conv2"top: "pool2"pooling_param {pool: AVEkernel_size: 3stride: 2}
}
layer {name:"conv3"type:"Convolution"bottom:"pool2"top:"conv3"param{lr_mult:1}param{lr_mult:2}convolution_param {num_output:64pad:2kernel_size:5stride:1}
}
layer {name:"relu3"type:"ReLU"bottom:"conv3"top:"conv3"
}
layer {name:"pool3"type:"Pooling"bottom:"conv3"top:"pool3"pooling_param {pool:AVEkernel_size:3stride:2}
}
layer {name: "ip1"type: "InnerProduct"bottom: "pool3"top: "ip1"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 64}
}layer {name: "ip2"type: "InnerProduct"bottom: "ip1"top: "ip2"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 10}
}layer {name: "prob"type: "Softmax"bottom: "ip2"top: "prob"
}
建立 synset.txt
在myfile_tostudy
文件夹中新建文件synset_work.txt
,内容如下:
biao
fajia
kuzi
xiangzi
yizi
dianshi
suannai
xiangshui
hufupin
xiezi
在myfile_tostudy
文件夹下新建demo.sh。内容如下:
classification examples/myfile_tostudy/deploy.prototxt examples/myfile_tostudy_iter_2000.caffemodel examples/myfile_tostudy/mean1.binaryproto examples/myfile_tostudy/synset_work.txt examples/myfile_tostudy/imgs/111.jpg
上述要注意各个路径、文件的命名
否则会报错
运行结果如下
Caffe_stu03_小训练相关推荐
- Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色(末尾有一个小训练——是将所学得的图像颜色修改应用为画板一般的刷新)
文章目录 愿所有正在努力的人都可以坚持自己的路一直走下去! 实现轨迹(跟踪)栏功能的函数 函数主要参数讲解 代码实现 我们先创建一个窗体,为轨迹(跟踪)栏的挂载做准备 接着我们把需要的轨迹(跟踪)栏添 ...
- 竞赛练一练 第10期:Scratch 小训练,快来打卡!
题目来自电子学会2020年3月份青少年软件编程(图形化)等级考试试卷(三级)-选择题后10题 01 下面的程序执行5分钟后,将会产生多少个克隆体?( ) A.无数个 B.3000个左右 C.300个左 ...
- Python自动化处理电化学数据并一键出图---入门小训练
写在前面 如果你一直都是生化环材专业,连C语言都没有学过的同学,可以看看这个东西来进行简单的python及matplotlib的入门训练. 本文仅作为记录自己的学习代码后结合自己科研的分享,转载请说明 ...
- 美亚杯赛前小训练,分享一套小模拟练习,弘连软件使用学习,供大家赛前训练,题目非常简单,很适合大家练手(非常推荐!)(新手手荐!)题目入门非常合适,也是了解软件很好的办法!
话不多说,先上链接,百度网盘. 链接:https://pan.baidu.com/s/17Sl3R3PfHUuhmaPug-M6Sg?pwd=ybww 提取码:ybww --来自百度网盘超级会员V3的 ...
- 只适合小模型小训练集的交叉验证
https://www.cnblogs.com/henuliulei/p/13686046.html
- 苹果公司提出Mobile-ViT | 更小更轻精度更高,MobileNets或成为历史
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨ChaucerG 来源丨集智书童 MobileviT是一个用于移动设备的轻量级通用可视化Tran ...
- (二)为AI模型训练准备影像
目录 介绍 Roboflow数据集标准化 人脸数据集的正规化 数据集扩充 下一步 在这里,我将向您展示如何收集.预处理和扩充模型训练所需的数据. 介绍 在本系列的上一篇文章中,我们讨论了创建口罩检测器 ...
- 深度强化学习落地方法论(7)——训练篇
目录 训练开始前 环境可视化 数据预处理 训练进行中 拥抱不确定性 DRL通用超参数 折扣因子 作用原理 选取方法 Frame Skipping 网络结构 网络类型 网络深度 DRL特色超参数 DQN ...
- 小实操(3): 利用键盘事件实现小人快跑
** 实例: 利用html表单和js的数学对象及函数做一个有验证码的简单登录表单 实操:利用日期对象和方法以及其他相关知识实现简单的钟表功能 ....... js学习中的小实操(目录) ** ...
- batch_size 大小的设定,对训练的影响
本文链接:https://blog.csdn.net/wydbyxr/article/details/84855489 尽可能地设大batchsize "Large Batch Lar ...
最新文章
- jquery实现抽奖系统
- 相似图像识别检 —基于图像签名(LSH)
- Java_关于App class loader的总结
- Codeforces 1323 div2题解ABC
- MongoDB的基本概念与操作
- 十一假期国人消费力爆棚,国内旅游收入超6497亿,你花了多少?
- python开发跟淘宝有联系没_Python爬取淘宝店铺和评论
- 加强的alert confirm js自定义对话框 多个按钮 ICO自定义
- hibernate中的saveOrUpdate()报错
- 一些牛人的IOS博客,mark下慢慢学习
- 火爆的文字游戏你玩了吗?「GitHub 热点速览 v.22.06」
- Python处理 JSON 数据
- 【odoo15】自定义一个kanban视图
- 惠普m154a状态页_惠普m154a感叹号闪烁
- VS2008下编写Colors应用程序
- 【好数推荐】数据堂平均音色语音库
- 自学python能干什么知乎_自学python能干什么
- oracle vm 鼠标切换,VirtualBox的Linux虚拟机文本模式和图形模式的切换问题
- IxEngine开发笔记
- 招聘 | 广州心理学公司招聘招商经理