参考: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.txtval.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_小训练相关推荐

  1. Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色(末尾有一个小训练——是将所学得的图像颜色修改应用为画板一般的刷新)

    文章目录 愿所有正在努力的人都可以坚持自己的路一直走下去! 实现轨迹(跟踪)栏功能的函数 函数主要参数讲解 代码实现 我们先创建一个窗体,为轨迹(跟踪)栏的挂载做准备 接着我们把需要的轨迹(跟踪)栏添 ...

  2. 竞赛练一练 第10期:Scratch 小训练,快来打卡!

    题目来自电子学会2020年3月份青少年软件编程(图形化)等级考试试卷(三级)-选择题后10题 01 下面的程序执行5分钟后,将会产生多少个克隆体?( ) A.无数个 B.3000个左右 C.300个左 ...

  3. Python自动化处理电化学数据并一键出图---入门小训练

    写在前面 如果你一直都是生化环材专业,连C语言都没有学过的同学,可以看看这个东西来进行简单的python及matplotlib的入门训练. 本文仅作为记录自己的学习代码后结合自己科研的分享,转载请说明 ...

  4. 美亚杯赛前小训练,分享一套小模拟练习,弘连软件使用学习,供大家赛前训练,题目非常简单,很适合大家练手(非常推荐!)(新手手荐!)题目入门非常合适,也是了解软件很好的办法!

    话不多说,先上链接,百度网盘. 链接:https://pan.baidu.com/s/17Sl3R3PfHUuhmaPug-M6Sg?pwd=ybww 提取码:ybww --来自百度网盘超级会员V3的 ...

  5. 只适合小模型小训练集的交叉验证

    https://www.cnblogs.com/henuliulei/p/13686046.html

  6. 苹果公司提出Mobile-ViT | 更小更轻精度更高,MobileNets或成为历史

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨ChaucerG 来源丨集智书童 MobileviT是一个用于移动设备的轻量级通用可视化Tran ...

  7. (二)为AI模型训练准备影像

    目录 介绍 Roboflow数据集标准化 人脸数据集的正规化 数据集扩充 下一步 在这里,我将向您展示如何收集.预处理和扩充模型训练所需的数据. 介绍 在本系列的上一篇文章中,我们讨论了创建口罩检测器 ...

  8. 深度强化学习落地方法论(7)——训练篇

    目录 训练开始前 环境可视化 数据预处理 训练进行中 拥抱不确定性 DRL通用超参数 折扣因子 作用原理 选取方法 Frame Skipping 网络结构 网络类型 网络深度 DRL特色超参数 DQN ...

  9. 小实操(3): 利用键盘事件实现小人快跑

    ** 实例: 利用html表单和js的数学对象及函数做一个有验证码的简单登录表单 实操:利用日期对象和方法以及其他相关知识实现简单的钟表功能 ....... js学习中的小实操(目录) **      ...

  10. batch_size 大小的设定,对训练的影响

    本文链接:https://blog.csdn.net/wydbyxr/article/details/84855489 尽可能地设大batchsize    "Large Batch Lar ...

最新文章

  1. jquery实现抽奖系统
  2. 相似图像识别检 —基于图像签名(LSH)
  3. Java_关于App class loader的总结
  4. Codeforces 1323 div2题解ABC
  5. MongoDB的基本概念与操作
  6. 十一假期国人消费力爆棚,国内旅游收入超6497亿,你花了多少?
  7. python开发跟淘宝有联系没_Python爬取淘宝店铺和评论
  8. 加强的alert confirm js自定义对话框 多个按钮 ICO自定义
  9. hibernate中的saveOrUpdate()报错
  10. 一些牛人的IOS博客,mark下慢慢学习
  11. 火爆的文字游戏你玩了吗?「GitHub 热点速览 v.22.06」
  12. Python处理 JSON 数据
  13. 【odoo15】自定义一个kanban视图
  14. 惠普m154a状态页_惠普m154a感叹号闪烁
  15. VS2008下编写Colors应用程序
  16. 【好数推荐】数据堂平均音色语音库
  17. 自学python能干什么知乎_自学python能干什么
  18. oracle vm 鼠标切换,VirtualBox的Linux虚拟机文本模式和图形模式的切换问题
  19. IxEngine开发笔记
  20. 招聘 | 广州心理学公司招聘招商经理

热门文章

  1. Centos版Linux 一些常用操作命令以及快捷键设置
  2. Photoshop CS5软件安装教程
  3. 适合运动时戴的蓝牙耳机有哪些、非常优秀的运动型蓝牙耳机推荐
  4. html怎么让滚动条不占位置,css怎么设置滚动条不占宽度?
  5. 十几减9的口算题_十几减9精品口算练习
  6. MFC---List Control的用法总结
  7. C# 判断圆与矩形的冲突
  8. python 四象限图_Tableau技巧|制作四象限图
  9. 112、工作繁忙,随口胡说;接近胡说,敷衍而已
  10. 【python爬虫】爬取ip138信息(随机调用User-Agent)