深度学习笔记8 数据预处理
2015-06-17 09:18
483 查看
数据预处理标准流程
自然灰度图像(1)灰度图像具有平稳特性,对每个数据样本分别做均值消减(即减去直流分量)——每个图像块,计算平均像素值,并将图像每个像素点减去均值。每个图像块有一个不同的均值。
x=x-repmat(mean(x,1),size(x,1),1);%x是144*10000,代表10000个patch
(2)然后采用PCA/ZCA白化处理,其中的epsilon要足够大以达到低通滤波的作用。epsilon值如何取,教程上说:
一种检验 epsilon 是否合适的方法是用该值对数据进行 ZCA 白化,然后对白化前后的数据进行可视化。如果 epsilon 值过低,白化后的数据会显得噪声很大;相反,如果 epsilon 值过高,白化后的数据与原始数据相比就过于模糊。一种直观上得到 epsilon 大小的方法是以图形方式画出数据的特征值,如下图的例子所示,你可以看到一条”长尾”,它对应于数据中的高频噪声部分。你需要选取合适的 epsilon,使其能够在很大程度上过滤掉这条”长尾”,也就是说,选取的 epsilon 应大于大多数较小的、反映数据中噪声的特征值。
如原始数据是x
sigma=x*x'./size(x,2); [u,s,v]=svd(sigma); plot(1:size(sigma,1),diag(s));
显示原数据的特征值曲线:
可以看到大约第50个特征值后面的部分要过滤掉,因此,epsilon>=第50个特征值就可以了。
>> s(50,50) ans = 0.1080
可以取epsilon=0.1080,教程上的代码给的值是epsilon=0.1,看来这个方法还是很有效的。
彩色图像
(1)对于彩色图像,色彩通道间并不存在平稳特性。因此首先对数据进行特征缩放(使像素值在[0,1]间)。对于图像[0,255],可将像素值除以255.
(2)对特征进行分量均值归零化
从下面代码中可看到是对同一通道的对应像素点(即特征)进行均值归零。——这属于特征标准化。
特征标准化:
首先计算每一维度上数据的均值(使用全体数据),之后再每个维度上减去该均值。下一步便是在数据的每一维度上除以该维度上数据的标准差。对于自然图像,方差归一化不用进行。
(3)使用足够大的epsilon来做PCA/ZCA。
——参考linearDecoderExercise.m
% Subtract mean patch (hence zeroing the mean of the patches) meanPatch = mean(patches, 2); %patches' size :192*10000 ,即10000个8*8*3块 patches = bsxfun(@minus, patches, meanPatch); % Apply ZCA whitening epsilon=0.1; sigma = patches * patches' / numPatches; [u, s, v] = svd(sigma); ZCAWhite = u * diag(1 ./ sqrt(diag(s) + epsilon)) * u'; patches = ZCAWhite * patches; displayColorNetwork(patches(:, 1:100));
执行:
plot(1:size(s,1),diag(s))
结果:
要滤掉长尾,选第十几个特征值很合适。可选episilon=s(12,12)=0.0962.练习上给的是epsilon=0.1,看来这个方法还是比较靠谱的。~~呵呵
白化
基于重构的模型episilon的选择就采用上面的方式——滤掉“长尾”。
基于正交化ICA的模型
对基于正交化ICA的模型来说,保证输入数据尽可能地白化(即协方差矩阵为单位矩阵)非常重要。这是因为:这类模型需要对学习到的特征做正交化,以解除不同维度之间的相关性(详细内容请参考 ICA 一节)。因此在这种情况下,epsilon 要足够小(比如 epsilon = 1e − 6)。
在上例采用epsilon=1e-6时,ZCA后的数据协方差矩阵,图示:
如果是单位矩阵,就是1对应的一条直线,而现在接近单位矩阵。
注意: 在使用分类框架时,我们应该只基于练集上的数据计算PCA/ZCA白化矩阵。需要保存以下两个参数留待测试集合使用:(a)用于零均值化数据的平均值向量;(b)白化矩阵。测试集需要采用这两组保存的参数来进行相同的预处理。
例:在linearDecoderExercise.m中,可以看到,把ZCA白化后的patches训练稀疏自编码器,保存了 ‘ZCAWhite’, ‘meanPatch’。这样当后面在有图像通过该稀疏自编码器提取特征时,就要和训练时一样的白化矩阵和平均值。
theta = initializeParameters(hiddenSize, visibleSize); % Use minFunc to minimize the function addpath minFunc/ options = struct; options.Method = 'lbfgs'; options.maxIter = 400; options.display = 'on'; [optTheta, cost] = minFunc( @(p) sparseAutoencoderLinearCost(p, ... visibleSize, hiddenSize, ... lambda, sparsityParam, ... beta, patches), ... theta, options); % Save the learned features and the preprocessing matrices for use in % the later exercise on convolution and pooling fprintf('Saving learned features and preprocessing matrices...\n'); save('STL10Features.mat', 'optTheta', 'ZCAWhite', 'meanPatch');
相关文章推荐
- 关于设置半透明背景的一些技巧
- 杰西·李佛摩尔的股市存亡战
- C/C++中赋值语句的返回值问题
- vs编写ActiveX控件,无法运行调试配置
- 【j2ee spring】35、巴巴运动网的产品类别管理(2)
- 用ffmpeg把H264数据流解码成YUV420P
- Scala学习(一)--Scala基础学习
- linux定时器
- sdl2.0示例
- Android Loader学习
- android小事记
- Android 4.4 实现状态栏(status bar)透明效果
- 第十四周项目3:OOP版电子词典
- 立方尾不变
- android软重启问题
- 严重:IOException while loading persisted sessions: java.io.EOFException
- Trie——字典树
- 一步一步写算法(洗牌算法)
- 利用CSS3打造一组质感细腻丝滑的按钮
- Volley简单学习使用一