MATLAB实现自编码器(二)——(稀疏)自编码器的实现

以下代码来源于mathworks官网文档trainAutoencoder的Examples部分,注释来源是翻译原网页的介绍以及自己的理解。

Train Sparse Autoencoder训练稀疏自编码器

利用8个特征4177个样本的数据进行稀疏自编码器的训练,训练设置为系统默认。利用训练后的网络进行数据重建,最后给出了重建误差作为网络效果的衡量。

%% Train Sparse Autoencoder 
clc
clear
%导入数据
X = abalone_dataset;
%X是一个 8x4177 的矩阵, 定义了4177个不同鲍鱼壳的8种属性: 性别 (m, f 和 i (婴儿))、长度、直径、高度、整体重量、夹重重量、内脏重量、壳重量。有关数据集的详细信息, 请在matlab命令行中键入help abalone_dataset

%使用默认设置训练稀疏自动编码器
autoenc = trainAutoencoder(X);

%使用训练后的自动编码器重建X
XReconstructed = predict(autoenc,X);

%计算平均平方重建误差
mseError = mse(X-XReconstructed)

运行结果
trainAutoencoder函数在运行时会显示训练窗口,窗口中给出了训练的一系列参数。
图1

Train Autoencoder with Specified Options使用指定选项训练自动编码器

以下代码实现的功能与前一段的相同,只是在trainAutoencoder函数中加入了几个名称-值对参数,设置了网络训练的参数。包括:隐含层(编码器)的神经元个数,训练的最大轮次,解码器的传递函数。

%% Train Autoencoder with Specified Options
clc
clear
%导入数据
X = abalone_dataset;

%训练一个4个隐含层,400个最大轮次的稀疏自动编码器, 并为解码器提供线性传输功能
autoenc = trainAutoencoder(X,4,'MaxEpochs',400,...
'DecoderTransferFunction','purelin');

%使用训练的自动编码器重建鲍鱼壳环数据
XReconstructed = predict(autoenc,X);

%计算平均平方重建误差
mseError = mse(X-XReconstructed)

运行结果,同样给出训练窗口
图2

Reconstruct Observations Using Sparse Autoencoder用稀疏自编码器重建对象

以下代实现的是1000个点的重构,并给出了重构数据的对比图。

%Reconstruct Observations Using Sparse Autoencoder
%用稀疏自编码器重建对象
clc
clear
%% 生成训练集,1000个点
rng(0,'twister'); %保证可重复性
n = 1000;         %训练数据个数
r = linspace(-10,10,n)';      %训练集区间
x = 1 + r*5e-2 + sin(r)./r + 0.2*randn(n,1); %取值

%% 使用训练数据训练自动编码器
hiddenSize = 25;    %隐藏单元数
autoenc = trainAutoencoder(x',hiddenSize,...
        'EncoderTransferFunction','satlin',... % 编码函数
        'DecoderTransferFunction','purelin',...% 解码函数
        'L2WeightRegularization',0.01,...      % L2权重调整器的系数
        'SparsityRegularization',4,...         % 稀疏正则项的系数   
        'SparsityProportion',0.10);            % 稀疏比例

%% 生成测试集,1000个点
n = 1000;
r = sort(-10 + 20*rand(n,1));
xtest = 1 + r*5e-2 + sin(r)./r + 0.4*randn(n,1);

%利用训练后的网络对测试集进行预测
xReconstructed = predict(autoenc,xtest');

%% 绘制结果图
figure;
subplot(2,2,1);plot(xtest,'r.');title('测试数据')
subplot(2,2,2);plot(xReconstructed,'go'); title('重构数据')
subplot(2,2,[3,4]);
plot(xtest,'r.');% 红色圆点代表原数据
hold on
plot(xReconstructed,'go'); % 绿色圆圈代表新建数据
title('新旧数据对比')

运行结果
图3

构建前后数据的对比
图4

Reconstruct Handwritten Digit Images Using Sparse Autoencoder使用稀疏自编码器重建手写数字图像

以下代码实现了稀疏自编码器对MNIST手写数字重构,并给出了重构前后图片的对比,以及图片的保存。

%% Reconstruct Handwritten Digit Images Using Sparse Autoencoder  
%% 导入训练数据
XTrain = digitTrainCellArrayData; 
% 训练数据是一个15000的单元格数组, 其中每个单元包含一个2828矩阵, 表示手写数字的合成图像。
% 训练集中的数字是随机的,测试集中是09的排列,一组500%% 训练包含25个隐藏神经元的自编码器
hiddenSize = 25;
autoenc = trainAutoencoder(XTrain,hiddenSize,...
        'L2WeightRegularization',0.004,... % L2权重调整器的系数
        'SparsityRegularization',4,...     % 稀疏正则项的系数
        'SparsityProportion',0.15);        % 稀疏比例
%% 导入测试数据
% Load the test data. 
XTest = digitTestCellArrayData; 
% The test data is a 1-by-5000 cell array, with each cell containing a 28-by-28
% matrix representing a synthetic image of a handwritten digit.
%测试数据是一个15000的单元格数组, 每个单元格包含一个2828的矩阵, 表示手写数字的合成图像。

%% 使用训练有素的自编码器重建测试图像数据
% Reconstruct the test image data using the trained autoencoder, |autoenc|. 
xReconstructed = predict(autoenc,XTest);  

%% 数据展示
% View the actual test data. 显示测试数据
figure;
for i = 1:20
    subplot(4,5,i);
    imshow(XTest{i});
end     

% View the reconstructed test data. 显示重构的测试数据
figure;
for i = 1:20
    subplot(4,5,i);
    imshow(xReconstructed{i});
end

%% 重构之后应该对图片进行保存
num=max(size(xReconstructed))%单元数组的大小就是图片的数量

% 保存原图片
for i=1:500
    filepath=pwd;   %保存当前工作目录
    cd('E:\dataset\0') ;      %把当前工作目录切换到指定文件夹
    str=[num2str(0+i) '.png']; %编码每个图片的名字为0+i
    imwrite(XTest{i}, str);    %单元数组的每个单元都可以直接转换为图片输出
end
% 保存重构的图片
for i=501:1000
    filepath=pwd;   %保存当前工作目录
    cd('E:\dataset\1') ;           %把当前工作目录切换到指定文件夹
    str=[num2str(0+i) '.png'];      %编码每个图片的名字为0+i
    imwrite(xReconstructed{i}, str);%单元数组的每个单元都可以直接转换为图片输出
end

运行结果
图5

还给出了重构前后图片的对比
图6

其他

训练设置通过,该网页中Name-Value Pair Arguments部分的介绍见前一篇博客MATLAB实现堆栈自编码器(一)——Autoencoder类和训练设置,通过trainAutoencoder函数中名称-值组合,对训练的设置进行修改,可以更好地实现网络功能。

  • 21
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值