UFLDL稀疏自编码器练习第一步:生成训练集

来源:互联网 发布:php秒杀系统设计 编辑:程序博客网 时间:2024/05/18 09:02

  今天按照UFLDL稀疏自编码器单元练习要求,编程完成第一步:生成训练集,并用该练习所提供函数显示所选出的图像块。

  下面给出所编写的生成训练集程序sampleImagesWEI.m,很简单。为了保持作业原貌,程序采用所提供模版。所以将其中英文注释也换成了中文。

 

function patches = sampleImagesWEI()
% sampleImages,返回 10000 个训练用图像样本块,64x10000 矩阵形式
% 图像样本块是从所提供图像中随机剪切出的 8x8 块

load IMAGES;                % 装入所提供图像
patchsize  = 8;               % 定义图像快大小(8x8)
numpatches = 10000;    % 图像块数量(10000)

% 所有图像块初始化为0,下面编写代码从图像中剪切图像块填充
patches = zeros(patchsize*patchsize, numpatches);

%% ---------- YOUR CODE HERE --------------------------------------
%  说明:用来自 IMAGES 的数据填充称为 patches 的变量

%  IMAGES 是3D数组,包含10幅图像
%  举例:IMAGES(:,:,6) 是第6幅图像,大小为 512x512
%  可用 imagesc(IMAGES(:,:,6)), colormap gray;命令看看这幅图像
%  (这些图像的对比度有些暗,因为被用“白化”方法预处理过,细节见讲义)
%  再举一例:IMAGES(21:30,21:30,1) 是一个 10x10 图像块,对应第一幅图像中
%  (21,21)到(30,30)区域图像

% randi(IMax,1,N)函数生成 1xN 随机向量,元素在 1 - IMAX间 均匀采样,有重复


tic

image_size  = size(IMAGES);
rowStarter  = randi(image_size(1) - patchsize + 1, 1, numpatches);
colStarter  = randi(image_size(2) - patchsize + 1, 1, numpatches);
imgSelected = randi(image_size(3), 1, numpatches);

for k = 1 : numpatches
    patches(:, k) = reshape(          ...
        IMAGES( rowStarter(k) : rowStarter(k) + patchsize - 1, ...
                colStarter(k) : colStarter(k) + patchsize - 1, ...
                imgSelected(k) ),      ...
        1, patchsize * patchsize);
end

toc

 

%% ---------------------------------------------------------------
% 为让自编码器好好工作,需要归一化数据
% 这里,因为网络输出界定在 [0,1] 之间(sigmoid激活函数决定)
% 故得确保像素值也在 [0,1] 之间
patches = normalizeData(patches);

end


%% ---------------------------------------------------------------
function patches = normalizeData(patches)

% 因为在输出层使用sigmoid激活函数,故将数据压入 [0.1, 0.9]

% 去除直流成分(图像均值)
patches = bsxfun(@minus, patches, mean(patches));

% 截尾为3倍的标准离差,调整为 -1 到 1
pstd = 3 * std(patches(:));
patches = max(min(patches, pstd), -pstd) / pstd;

% 从 [-1,1] 再调整为 [0.1,0.9]
patches = (patches + 1) * 0.4 + 0.1;

end

 

关键是for循环前面几句和循环。其它部分是练习中提供的,不用管。

 

检查所生成训练集时,调用练习所提供的display_network函数。用下面方式调用:

display_networkWEI(img200, [], [], 20);

这样生成的200个图像块按照10x20排列。如果按练习中所提供方式调用,则生成一个12x17图像块,最后四个格子里没有内容,不好看。

 

0 0