今天给大家分享基于DAF-MLP的手写数字分类预测MATLAB实战 ,主要从算法原理和代码实战展开。
一、算法原理
1.1 降噪自编码器(Denoising Auto-Encoders, DAE)
在介绍降噪自编码器的原理之前,需要介绍一下自编码器的原理,这样才能方便我们理解降噪自编码器的原理。如图1所示为自编码器的网络结构,它包含有编码阶段和解码阶段。主要应用于数据去噪和数据降维。
.png)
图1 自编码器的网络结构
它的编码和解码过程可表达为
.png)
其中,W1、b1为编码的权重和偏置,W2、b2为编码的权重和偏置,
自编码器的目的是使输出与输入尽量相同,所以采用的损失函数可表达为:
当损失函数J的值越小,那么经自编码器重构的数据与原始数据就尽可能的相同。但在实际中,我们更关注的是自编码器的隐层表达,而不是实际输出。自编码器真正关心的是隐藏层的特征表达,一个好的表达能够捕获输入信号的稳定结构,以该目的为出发出现了降噪自动编码器。
降噪自动编码器的网络结构如图2所示。降噪自动编码器,首先对干净的输入信号加入噪声产生一个受损的信号。然后将受损信号送入传统的自动编码器中,使其重建回原来的无损信号。降噪自编码器的优点是:它通过人为的增加噪声使模型获得鲁棒性的特征表达。
.png)
图2 降噪自编码器的网络结构
-
1.2 多层感知机(Multilayer Perceptron,MLP)
多层感知机是由单层感知机推广而来,最主要的特点是有多个神经元层。一般将MLP的第一层称为输入层,中间的层为隐藏层,最后一层为输出层。如下图3所示。MLP并没有规定隐藏层的数量,因此可以根据实际处理需求选择合适的隐藏层层数,且对于隐藏层和输出层中每层神经元的个数也没有限制。 多层感知机采用反向传播BP算法训练得到模型的权重和偏置。关于MLP的公式推导这里不做详细的描述,大家可参考下面的文章:手把手教学 - MLP算法实现 - 知乎 (zhihu.com)
.png)
图3 多层感知机的网络结构
二、代码实战
%%以手写数字分类预测为例clcclear% load MNISTload 'mnist_14x14.mat';% shuffle the training dataX_labels = X_labels + 1;X_test_labels = X_test_labels + 1;perm_idx = randperm (size(X,1));n_all = size(X, 1);n_train = ceil(n_all * 3 / 4);n_valid = floor(n_all /4);X_valid = X(perm_idx(n_train+1:end), :);X_valid_labels = X_labels(perm_idx(n_train+1:end));X = X(perm_idx(1:n_train), :);X_labels = X_labels(perm_idx(1:n_train));layers = [size(X,2), 500, 500, 10];n_layers = length(layers);blayers = [1, 1, 1, 1];use_tanh = 0;do_pretrain = 1;if do_pretrainDs = cell(n_layers - 2, 1);H = X;H_valid = X_valid;for l = 1:n_layers-2% construct DAE and use default configurationsD = default_dae (layers(l), layers(l+1));D.data.binary = blayers(l);D.hidden.binary = blayers(l+1);if use_tanhif l > 1D.visible.use_tanh = 1;endD.hidden.use_tanh = 1;elseif D.data.binarymH = mean(H, 1)';D.vbias = min(max(log(mH./(1 - mH)), -4), 4);elseD.vbias = mean(H, 1)';endendD.learning.lrate = 1e-1;D.learning.lrate0 = 5000;D.learning.minibatch_sz = 128;D.noise.drop = 0.2;D.noise.level = 0;%D.adagrad.use = 1;%D.adagrad.epsilon = 1e-8;D.adadelta.use = 1;D.adadelta.epsilon = 1e-8;D.adadelta.momentum = 0.99;D.valid_min_epochs = 10;if blayers(l+1)D.cae.cost = 0.01;%D.sparsity.target = 0.1;%D.sparsity.cost = 0.01;endD.iteration.n_epochs = 500;% save the intermediate data after every epochD.hook.per_epoch = {@save_intermediate, {sprintf('dae_mnist_%d.mat', l)}};% print learining processD.verbose = 0;% display the progressD.debug.do_display = 0;% train RBMfprintf(1, 'Training DAE (%d)\n', l);tic;D = dae (D, H, H_valid, 0.1);fprintf(1, 'Training is done after %f seconds\n', toc);H = dae_get_hidden(H, D);H_valid = dae_get_hidden(H_valid, D);Ds{l} = D;endendM = default_mlp (layers);M.output.binary = blayers(end);M.hidden.use_tanh = use_tanh;M.valid_min_epochs = 10;M.dropout.use = 1;M.hook.per_epoch = {@save_intermediate, {'mlp_mnist.mat'}};M.learning.lrate = 1e-3;M.learning.lrate0 = 5000;M.learning.minibatch_sz = 128;M.adadelta.use = 1;M.adadelta.epsilon = 1e-8;M.adadelta.momentum = 0.99;M.noise.drop = 0;M.noise.level = 0;M.iteration.n_epochs = 100;if do_pretrainfor l = 1:n_layers-2M.biases{l+1} = Ds{l}.hbias;M.W{l} = Ds{l}.W;endendfprintf(1, 'Training MLP\n');tic;M = mlp (M, X, X_labels, X_valid, X_valid_labels, 0.1);fprintf(1, 'Training is done after %f seconds\n', toc);[pred] = mlp_classify (M, X_test);n_correct = sum(X_test_labels == pred);fprintf(2, 'Correctly classified test samples: %d/%d\n', n_correct, size(X_test, 1));
实现结果:
.png)
.png)
需要调整相关参数才能获得较好的效果,由于运行时间较长,这里不再进行调参后的效果展示,此代码是根据算法原理来写的可供入门DAE的同学学习
文章来源:matlab学习之家