用MATLAB搭建DNN
本文简要介绍了如何用MATLAB搭建一个可自定义层数的深度神经网络,并以MNIST为例进行网络训练、验证、误差可视化展示。不仅限制在该手写数字库,所搭建的DNN也可以用于其他数据。读者需要对MATLAB的矩阵操作、反向传播算法有所了解。
1 工具
MATLAB:version>=7.0.0.19920 (R14)。本人所使用的MATLAB版本较低,对于任何不低于该版本的MATLAB,代码都是可以运行的。
MNIST:手写数字库。也可以使用其他数据。
2 数据准备
你需要了解MNIST的存储格式,并将MNIST原始格式转换为mat格式。鉴于网上已有很多博客介绍了如何将MNIST转换为mat格式,本节直接贴上MATLAB代码loadMNIST。该函数参考了互联网上现有代码,包括多个来源,未指明具体作者。如有冒犯,请您见谅。
function [Train, Label] = loadMNIST(train_file, label_file, force)
% MNIST数据读取与保存.
% train_file = 'data/train-images.idx3-ubyte';
% label_file = 'data/train-labels.idx1-ubyte';
% 返回时将矩阵转置,即矩阵的每一列是一个结果.
% 如果第3个参数输入force为true,则强制从原始文件读取数据.
% 该函数参考了互联网上现有代码,包括多个来源,未指明具体作者.
if nargin < 3
force = false;
end
% MATLAB7.0
VERSION = datenum(version('-date'));
r2013a = datenum('Jan 01, 2013');
if ~exist('train-images.mat', 'file') || force
FID = fopen(train_file, 'rb');
if FID == -1
Train = [];
Label = [];
fprintf('File [%s] does not exist.\n', train_file);
return
end
magic = fread(FID, 1, 'int32', 0, 'ieee-be');
if VERSION > r2013a
assert(magic == 2051, ['Bad magic number in ', train_file, '']);
end
numImages = fread(FID, 1, 'int32', 0, 'ieee-be');
numRows = frea