均值削减是数据预处理中常见的处理方式,按照之前在学习ufldl教程PCA的一章时,对于图像介绍了两种:第一种常用的方式叫做dimension_mean(个人命名),是依据输入数据的维度,每个维度内进行削减,这个也是常见的做法;第二种叫做per_image_mean,ufldl教程上说,在natural images上训练网络时;给每个像素(这里只每个dimension)计算一个独立的均值和方差是make little sense的;这是因为图像本身具有统计不变性,即在图像的一部分的统计特性和另一部分相同。作者最后建议,如果你训练你的算法在非natural images(如mnist,或者在白背景存在单个独立的物体),其他类型的规则化是值得考虑的。但是当在natural images上训练时,per_image_mean是一个合理的默认选择。
本文中在imagenet数据集上采用的是dimension_mean的方法。
一:程序开始
make_image_mean.sh文件调用代码:
EXAMPLE=examples/imagenet
DATA=data/ilsvrc12
TOOLS=build/tools
$TOOLS/compute_image_mean $EXAMPLE/ilsvrc12_train_lmdb \
$DATA/imagenet_mean.binaryproto<strong>
</strong>
二:make_image_mean.cpp函数分析
输入参数:lmdb文件 均值文件imagenet_mean.binaryproto
2.1 头文件分析
#include<stdint.h>//定义了几种扩展的整数类型和宏
#include<algorithm>//输出数组的内容、对数组进行排序、反转数组内容、复制数组内容等操作,
#include<string>
#include<utility>//utility头文件定义了一个pair类型,pair类型用于存储一对数据;它也提供一些常用的便利函数、或类、或模板。大小求值、值交换:min、max和swap。
#include<vector>//可以自动扩展容量的数组
#include"boost/scoped_ptr.hpp"
#include"gflags/gflags.h"
#include"glog/logging.h"
#include"caffe/proto/caffe.pb.h"
#include"caffe/util/db.hpp"//引入包装好的lmdb操作函数
#include"caffe/util/io.hpp"//引入opencv中的图像操作函数
usingnamespacecaffe; //引入caffe命名空间
usingstd::max;//
usingstd::pair;
using boost::scoped_ptr;
2.2 gflags宏定义string变量
DEFINE_string(backend, "lmdb",