读书笔记 1 CIFAR-10 在 caffe 上进行训练与学习
2014.7.21 薛开宇
本次学习笔记作用,知道如何在 caffe 上训练与学习,如何看结果。
1.1 使用数据库:CIFAR-10
60000 张 32X32 彩色图像 10 类
50000 张训练
10000 张测试
1.2 准备
在终端运行以下指令:
cd $CAFFE_ROOT/data/cifar10
./get_cifar10.sh
cd $CAFFE_ROOT/examples/cifar10
./create_cifar10.sh
其中 CAFFE_ROOT 是 caffe-master 在你机子的地址
运行之后,将会在 examples 中出现数据库文件./cifar10-leveldb 和数据库图像均值二进制文
件./mean.binaryproto
1.3 模型
该 CNN 由卷积层,POOLing 层,非线性变换层,在顶端的局部对比归一化线性分类器组成。
该模型的定义在 CAFFE_ROOT/examples/cifar10 directory’s cifar10_quick_train.prototxt 中,
可以进行修改。其实后缀为 prototxt 很多都是用来修改配置的。
1.4 训练和测试
训练这个模型非常简单,当我们写好参数设置的文件 cifar10_quick_solver.prototxt 和定义的
文件 cifar10_quick_train.prototxt 和 cifar10_quick_test.prototxt 后,运行 train_quick.sh 或者在
终端输入下面的命令:
cd $CAFFE_ROOT/examples/cifar10
./train_quick.sh
即 可 , train_quick.sh 是 一 个 简 单 的 脚 本 , 会 把 执 行 的 信 息 显 示 出 来 , 培 训 的 工 具 是
train_net.bin,cifar10_quick_solver.prototxt 作为参数。
然后出现类似以下的信息:
I0317 21:52:48.945710 2008298256 net.cpp:74] Creating Layer conv1
I0317 21:52:48.945716 2008298256 net.cpp:84] conv1 <- data
I0317 21:52:48.945725 2008298256 net.cpp:110] conv1 -> conv1
I0317 21:52:49.298691 2008298256 net.cpp:125] Top shape: 100 32 32 32 (3276800)
I0317 21:52:49.298719 2008298256 net.cpp:151] conv1 needs backward computation.
这是搭建模型的相关信息
接着:
0317 21:52:49.309370 2008298256 net.cpp:166] Network initialization done.
I0317 21:52:49.309376 2008298256 net.cpp:167] Memory required for Data 23790808
I0317 21:52:49.309422 2008298256 solver.cpp:36] Solver scaffolding done.
I0317 21:52:49.309447 2008298256 solver.cpp:47] Solving CIFAR10_quick_train
之后,训练开始
I0317 21:53:12.179772 2008298256 solver.cpp:208] Iteration 100, lr = 0.001
I0317 21:53:12.185698 2008298256 solver.cpp:65] Iteration 100, loss = 1.73643
...
I0317 21:54:41.150030 2008298256 solver.cpp:87] Iteration 500, Testing net
I0317 21:54:47.129461 2008298256 solver.cpp:114] Test score #0: 0.5504
I0317 21:54:47.129500 2008298256 solver.cpp:114] Test score #1: 1.27805
其中每 100 次迭代次数显示一次训练时 lr(learning rate),和 loss(训练损失函数),每 500 次
测试一次,输出 score 0(准确率)
和 score 1(测试损失函数)
当 5000 次迭代之后,正确率约为 75%,模型的参数存储在二进制 protobuf 格式在
cifar10_quick_iter_5000
然后,这个模型就可以用来运行在新数据上了。
1.5 其他
另外,更改 cifar*solver.prototxt 文件可以使用 CPU 训练,
# solver mode: CPU or GPU
solver_mode: CPU
可以看看 CPU 和 GPU 训练的差别。
主要资料来源:caffe 官网教程
读书笔记 2 用一个预训练模型提取特征
2014.7.21 薛开宇
本学习笔记的作用在于为后面打基础,没有什么实际的东西可以观测到,要可视化特
征还要观看后面的教程。
2.1 制作一个数据库
先做一个临时文件夹存放东西。
mkdir examples/_temp
我们为两张在 images 文件夹的照片生成一个文件列表(默认为一张图片,cat1 是我随意加
上去的)
find `pwd`/examples/images -type f -exec echo {} \; > examples/_temp/temp.txt
我们将使用 imagedatalayer 预计标签之后的每一个文件名,所以让我们添加一个 0 到每一行
的末尾
sed "s/$/ 0/" examples/_temp/temp.txt > examples/_temp/file_list.txt
这样,我们将得到两个文件 temp.txt 和 file_list.txt。
2.2.定义特征提取网络结构
在实践中,从一个数据集中减去均值图像对于提高分类准确性很重要,因此从 ILSVRC
dataset 中下载均值图像数据库
data/ilsvrc12/get_ilsvrc_aux.sh
我们将使用其中的 data/ilsvrc212/imagenet_mean.binaryproto 去定义网络结构。
将定义结构的文件 cope 到我们的临时文件夹。
cp examples/feature_extraction/imagenet_val.prototxt examples/_temp
然后,我们进入 imagenet_val.prototxt 更改路径。更改其中$CAFFE_DIR 的地方
下图是我做的改动。
2.3.提取特征
执行指令
build/tools/extract_features.bin
examples/imagenet/caffe_reference_imagenet_model
examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10
其中 fc7 是最高层的特征,我们也可以使用其他层提取,像 conv5 或 pool3
最后的参数是数据的批次
特征保存在 LevelDB examples/_temp/features ,可以运用到其他代码了。
这里可以发现,特征文件中 5 个文件和 cifar10 中的 leveldb 是相似的。
_temp 下 features
Cifar10 下特征数据库
因此,这是我们训练时组建模型时必要的文件。
2.4.注意
当存在 features 文件夹时将出现错误,这时需要移除该文件夹。
资料来源: caffe 官网教程
学习笔记 3 用自己的数据训练和测试“CaffeNet”
2014.7.22 薛开宇
本次学习笔记作用比较大,也是重点,知道如何在 caffe 上搭建自己的数据库。
3.1 数据准备
本学习笔记有点脱离了原文,原文是用 ImageNet1000 类的数据库,而因为电脑内存不
足,只能自己模仿做一个小的数据库进行下去。
本来教程是假设已经下载了 ImageNet 训练数据和验证数据(非常大),并以下面的格式
存储在磁盘:
/path/to/imagenet/train/n01440764/n01440764_10026.JPEG
/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG
里面是各种的分类图。
因为实在太大,所以我们改为模仿搭建自己的数据库。
在 data 中新建文件夹 myself,本人在网上下载了训练猫的图片 50 张,测试猫 10 张,训练
鸟的图片 50 张,测试鸟 10 张。如图所示:
如果坚持用 Imagenet 的话,我们还需要一些标签数据进行训练,用以下指令可以下载,
如果不用,就可以不执行下面指令。
cd $CAFFE_ROOT/data/ilsvrc12/
./get_ilsvrc_aux.sh
培训和测试的输入是用 train.txt 和 val.txt 描述的,这些文档列出所有文件和他们的标签。
注意,我们分类的名字是 ASCII 码的顺序,即 0-999,对应的分类名和数字的映射在
synset_words.txt(自己写)中。
运行以下指令:
find -name *.jpeg |cut -d '/' -f2-3 > train.txt
注意路径
然后,因为样本数比较少,可以自行手动做分类标签。在 train.txt 的每个照片后用 0-999
分类。当样本过多,就自己编写指令批量处理。
同理,获得 val.txt
Test.txt 和 val.txt 一样,不过后面不能标签,全部设置成 0。
我们还需要把图片的大小变成 256X256,但在一个集群环境,可以不明确的进行,使用
Mapreduce 就可以了,像杨青就是这样做的。如果我们希望更简单,用下面的命令:
for name in /path/to/imagenet/val/*.JPEG; do
convert -resize 256x256\! $name $name
done
我做成了 sh,方便以后使用。
然后在 caffe-master 创建 myself 文件夹,然后将 imagenet 的 create_imagenet.sh. 复制到
该文件夹下进行修改,进行训练和测试路径的设置,运行该 sh.
最后得到
3.2 计算图像均值
模型需要我们从每张图片减去均值,所以我们必须获得训练的均值,用
tools/compute_image_mean.cpp 实现,这个 cpp 是一个很好的例子去熟悉如何操作多个组建,
例如协议的缓冲区,leveldbs,登录等。我们可以直接复制 imagenet 的
./make_imagenet_mean.加以修改应用就行,注意路径。