深度学习在这些年是非常热门的话题,特别是在计算机视觉应用方面,也许你会在新闻上有所耳闻并感到好奇。那么现在的问题是,该如何入手?今天带来一篇人工神经网络的快速入门教程。
MNIST 数据集
我们当中有许多人想在一个具体的例子中开始入手。那我就写一个手把手快速教程,我们用一个常用的 MINIST 手写数字数据集作为例子以使教程比较直观的、易理解。Kaggle 刚好也在数字识别教程中使用这个数据集。你需要从 “Get the Data” 页面中下载这些数据集:
train.csv – 训练数据
test.csv – 测试数据
当你已经将上述文件下载到当前文件夹时,将训练数据和测试数据都加载进 MATLAB,测试数据用于生成你的提交。
tr = csvread('train.csv', 1, 0); % 读文件 train.csv
sub = csvread('test.csv', 1, 0); % 读文件 test.csv
第一列是数据集中每个样本字符的正确标签,每行一个样本。剩余的列中,每行表示一个28×28的手写字符的图像,所有像素都放在一行中,而不是原本的矩阵格式。如果要使字符可视化,我们需要将这些行重新组织成28×28的矩阵。 reshape 操作是按列进行的,所以除非你需要对数据进行转置,否则可以用 reshape 函数实现这字符的可视化。
figure
% 绘制图像
colormap(gray)
% 设置为灰度图
for i = 1:25
% 查看前25个样本
subplot(5,5,i)
% 在6 x 6的格子中绘制
digit = reshape(tr(i, 2:end), [28,28])'; % 行数据 = 28 x 28 的图像
imagesc(digit)
% 显示图像
title(num2str(tr(i, 1)))
% 显示标签
end
准备数据
你可以使用神经网络工具箱中的模式识别应用nprtool 。这个应用需要两个数据集:
输入 – 一个数值矩阵,列表示样本,行表示特征。该数据集是手写字符的扫描图像;
目标 – 一个0和1的数值矩阵,映射到图像代表的特定标签。该数据集中的值也被称为虚拟变量。神经网络工具箱中希望标签被保存成列而不是行。
标签的取值范围是0到9,但由于MTLAB中的下表是从1开始的,所以我们可以用“10”表示“0”。
1 --> [1; 0; 0; 0; 0; 0; 0; 0; 0; 0]
2 --> [0; 1; 0; 0; 0; 0; 0; 0; 0; 0]
3 --> [0; 0; 1; 0; 0; 0; 0; 0; 0; 0]
:
0 --> [0; 0; 0; 0; 0; 0; 0; 0; 0; 1]
数据集中的样本是按列保存而不是按行保存的,所以你需要对数据进行转置。然后,你需要将数据集分割,保留1/3的数据用作模型评估,仅用2/3的数据来训练我们的人工神经网络模型。
n = size(tr, 1);
% 数据集中的样本数量
targets = tr(:,1);
% 第一列是 |标签|
targets(targets == 0) = 10;
% 用'10' 表示'0'
targetsd = dummyvar(targets);
% 将标签转化为虚拟变量
inputs = tr(:,2:end);
% 剩余的列为预测量
inputs = inputs';
% 转置输入矩阵
targets = targets';
% 转置目标矩阵
targetsd = targetsd';
% 转置虚拟变量
rng(1);
% 消除随机数列的再现性
c = cvpartition(n,'Holdout',n/3); % 保留1/3的数据集
Xtrain = inputs(:, training(c)); % 输入集的2/3用于训练
Ytrain = targetsd(:, training(c)); % 目标集的2/3用于训练
Xtest = inputs(:, test(c));
% 输入集的1/3用于测试
Ytest = targets(test(c));
% 目标集的1/3用于测试
Ytestd = targetsd(:, test(c));
% 虚拟变量的1/3用于测试
使用神经网络工具箱中的图形界面应用(GUI APP)
你可以通过键入命令 nnstart 来打开神经网络的启动图形界面。
进入启动界面后,可以通过单击模式识别工具来打开神经网络模式识别工具。你也可以通过命令 nprtool 来直接打开它。
单击欢迎页面上的“Next”(下一步),进入“Select Data”(数据选择)界面。
选择Xtrain作为输入,Ytrain为训练目标。