特征标准化(使数据集中所有特征都具有零均值和单位方差)。
零均值:计算每一个维度上数据的均值(使用全体数据计算),之后在每一个维度上都减去该均值。
单位方差:在数据的每一维度上除以该维度上数据的标准差。
在大多数情况下,我们并不关注所输入图像的整体明亮程度。比如在目标识别任务中,图像的整体明亮程度并不会影响图像中存在的是什么物体。更为正式地说,我们对图像块的平均亮度值不感兴趣,所以可以减去这个值来进行均值削减。
深层一点的解释:斯坦福大学的cs231n深度学习课程,其中在激活函数一章讲到:
http://study.163.com/course/courseMain.htm?courseId=1003223001
Consider what happens when the input to a neuron is always positive…
根据求导的链式法则,w的局部梯度是X,当X全为正时,由反向传播传下来的梯度乘以X后不会改变方向,要么为正数要么为负数,也就是说w权重的更新在一次更新迭代计算中要么同时减小,要么同时增大。为了更好得理解,假设w有两维,做出下图:
其中,w的更新方向向量只能在第一和第三象限。假设最佳的w向量如蓝色线所示,由于输入全为正,现在迭代更新只能沿着红色路径做zig-zag运动,更新的效率很慢。基于此,当输入数据减去均值后,就会有负有正,会消除这种影响。
图片减去均值后,再进行训练/测试,会提高速度和精度。
在caffe中,计算所有训练样本的平均值,保存为一个均值文件,在以后的测试中,就可以直接使用这个均值,而不需要重新对待测试的图像进行计算了。
一、以Caffe中的MNIST数据集为例
1、二进制格式的均值计算
Caffe中使用的均值数据格式是binaryproto, 作者提供了一个计算均值的文件compute_image_mean.cpp
,在Caffe根目录下的tools文件夹里面。编译后的可执行体在 build/tools/
下面,直接调用就可以。
Caffe根目录下执行:
sudo build/tools/compute_image_mean examples/mnist/mnist_train_lmdb examples/mnist/mean.binaryproto
第一个参数:examples/mnist/mnist_train_lmdb
,表示需要计算均值的数据,格式为lmdb。
第二个参数:examples/mnist/mean.binaryproto
,计算出来的结果保存文件。
2、python格式的均值计算mean.binaryproto转mean.npy
如果要使用python接口,或者要进行特征可视化,可能就要用到python格式的均值文件了。首先,我们用lmdb格式的数据,计算出二进制格式的均值mean.binaryproto,然后,再转换成python格式的均值mean.npy。
转换脚本convert_mean.py
如下:
调用方法为:
sudo python examples/mnist/convert_mean.py examples/mnist/mean.binaryproto examples/mnist/mean.npy
#!/usr/bin python
# -*- coding: utf-8 -*-
import numpy as np
import sys
caffe_root = '/home/bu5/bu5project/caffe-ssd/'
sys.path.insert(0, caffe_root + 'python') # 添加系统环境变量
import caffe
if len(sys.argv)!=3:
print "Usage: python convert_mean.py mean.binaryproto mean.npy"
sys.exit()
blob = caffe.proto.caffe_pb2.BlobProto()
bin_mean = open( sys.argv[1] , 'rb' ).read()
blob.ParseFromString(bin_mean)
arr = np.array( caffe.io.blobproto_to_array(blob) )
npy_mean = arr[0]
np.save( sys.argv[2] , npy_mean )
二、处理自己的数据
1、二进制格式的均值计算
训练数据先转为lmdb,由lmdb计算出均值
将caffe下的imagenet文件夹的make_imagenet_mean.sh复制到制作数据的文件夹下进行修改,进行均值的计算,运行该sh。
执行:
./ make_imagenet_mean.sh
或者sh make_imagenet_mean.sh
可生成image_mean.binaryproto文件
#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12
EXAMPLE=/home/bu5/bu5project/LMDB-lwp
DATA=/home/bu5/bu5project/LMDB-lwp
TOOLS=/home/bu5/bu5project/caffe-ssd/build/tools
$TOOLS/compute_image_mean $EXAMPLE/image_train_lmdb \
$DATA/image_mean.binaryproto
echo "Done."
2、python格式的均值计算
同上MNIST的转换