参考链接:
https://blog.csdn.net/m0_37264397/article/details/76686159
https://www.cnblogs.com/alexcai/p/5469436.html
介绍
根据上述的两个链接,本人制作了自己的第一个caffe模型,具体过程不在赘述,在本文中对其中的一些东西做一些自己的理解。
文件位置的放置
其实在本人的测试中发现所有文件位置的放置其实并没有绝对的要求。你可以将训练数据分成无数个不同的文件夹放置,甚至你可以将训练数据和测试数据混合放置,只要你将哪个图片是测试数据哪个图片是训练数据分别写在不同的文件中即可,如链接2中的train.txt和val.txt。caffe主要是通过读取train.txt和val.txt里面的文件路径来读取文件的。
特殊的:对于lmdb文件夹,这个是系统根据train.txt和val.txt生成的,就不要去动它了。
关于train.txt和val.txt
在这两个文件夹中,存放训练数据和测试数据,这里面格式:地址+空格+标签(没有加号)。这个地址建议写相对地址吧,这样复制到其他环境下也能用,这个相对地址写的应该是相对于create_imagenet.sh的地址,通过create_imagenet.sh读取这两个文件夹,将图片转化为lmdb格式的文件方便caffe读取。
(对于这个文件夹本人有个问题,如果是目标定位的任务,这个train.txt的标签又该怎么写呢??知道的朋友能否解答下呢??)
(lmdb格式的文件内部是怎么运作的呢?caffe读取lmdb是怎么的一个流程和机理的呢??这个有很大的疑惑)
大家如果有相关解答这些问题的链接可以发在评论或者私聊交流。
关于create_imagenet.sh
#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e
EXAMPLE=/home/wwtpy2/caffe/examples/wwt # 这个建议把路径写成绝对路径,是imdb文件夹的路径
TrainDATA=/home/wwtpy2/caffe/examples/wwt/data/train # 这是train.txt的路径
ValDATA=/home/wwtpy2/caffe/examples/wwt/data/val # 这是val.txt的路径
TOOLS=/home/wwtpy2/caffe/build/tools # 这是caffe工具的路径,这个路径不要动,改改前面的路径就好了,当然前面可以改成~,我没试过
TRAIN_DATA_ROOT=/ # 这是训练数据的前置路径,由于我在train.txt直接写了绝对路径了,所以这里我就写/
VAL_DATA_ROOT=/ # 这是验证数据的前置路径
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=false
if $RESIZE; then
RESIZE_HEIGHT=256 # 图片resize的大小
RESIZE_WIDTH=256 # resize大小
else
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
fi
if [ ! -d "$TRAIN_DATA_ROOT" ]; then
echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet training data is stored."
exit 1
fi
if [ ! -d "$VAL_DATA_ROOT" ]; then
echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet validation data is stored."
exit 1
fi
echo "Creating train lmdb..."
# 下面的不需要怎么改
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$TrainDATA/train.txt \
$EXAMPLE/my_train_lmdb
echo "Creating val lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$ValDATA/val.txt \
$EXAMPLE/my_val_lmdb
echo "Done."
关于 make_mean.sh
这个文件主要是计算图片的均值,把训练数据的lmdb文件夹路径输入就可以了,然后改一下输出的均值文件的路径就可以了
#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12
EXAMPLE=./ # imdb的路径
DATA=./ # 均值文件的路径
TOOLS=/home/wwtpy2/caffe/build/tools # 这个不懂
# 看一下下面这个路径的文件名
$TOOLS/compute_image_mean $EXAMPLE/my_train_lmdb \
$DATA/my_mean.binaryproto
echo "Done."
关于 *_quick_train_test.prototxt
这个文件夹内部主要是保持模型的结构,具体写法后面再重启一个博客来写,这里主要写一下对整体的理解
name: "CIFAR10_quick"
layer {
name: "cifar"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mean_file: "my_mean.binaryproto"# 均值文件的路径
}
data_param {
source: "my_train_lmdb" # lmdb文件的路径,这是训练的
batch_size: 100
backend: LMDB
}
}
layer {
name: "cifar"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mean_file: "my_mean.binaryproto"# 均值文件的路径
}
data_param {
source: "my_val_lmdb" # lmdb文件的路径,这是验证的
batch_size: 100
backend: LMDB
}
}
...
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 10 # 需要分类的数目
weight_filler {
type: "gaussian"
std: 0.1
}
bias_filler {
type: "constant"
}
}
}
...
关于 *_quick_solver.prototxt
这个就是我们训练模型时候用到的一些超参数
net: "my_quick_train_test.prototxt" # 模型文件的路径
test_iter: 100
test_interval: 500
base_lr: 0.001
momentum: 0.9
weight_decay: 0.004
lr_policy: "fixed"
display: 10
max_iter: 4000
snapshot: 200
snapshot_prefix: "my_quick" # 保持训练后模型和结果的路径
solver_mode: GPU
有没有人能帮忙解释下这个文件的超参数是如何作用在*_quick_train_test.prototxt的?
如果我们需要自定义loss函数需要如何自定义呢?自己写一个C++的文件编译吗?
整个caffe流程
准备数据-》将数据转化为imdb文件-》通过imdb文件计算数据的均值(非必须)-》编写模型结构文件-》编写模型的超参数-》训练模型