MATLAB人工神经网络教程

2017 年 9 月 6 日 七月在线实验室

来自36大数据(36dsj.com) | 作者:Toshi Takeuchi

深度学习在这些年是非常热门的话题,特别是在计算机视觉应用方面,也许你会在新闻上有所耳闻并感到好奇。那么现在的问题是,该如何入手?今天带来一篇人工神经网络的快速入门教程。

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)

  1. 你可以通过键入命令 nnstart 来打开神经网络的启动图形界面。

  2. 进入启动界面后,可以通过单击模式识别工具来打开神经网络模式识别工具。你也可以通过命令 nprtool 来直接打开它。

  3. 单击欢迎页面上的“Next”(下一步),进入“Select Data”(数据选择)界面。

  4. 选择Xtrain作为输入,Ytrain为训练目标。

  5. 单击“Next”(下一步),进入“Validation and Test Data”(数据验证和检查)界面。采用默认设置并再次单击“Next”(下一步)。这一操作会将数据分割70个-15个-15个样本,分别作为训练、验证和测试集。

  6. 在“Network Architecture”(网络结构)界面,修改隐层神经元(hidden neurons)的个数值为100,并再次单击“Next”。

  7. 在“Train Network”(网络训练)界面,单击“Train”(训练)按钮开始训练。训练结束后,单击“Next”。跳过“Evaluate Network”(验证网络)并点击下一步。

  8. 在“Deploy Solution”(结果部署)界面,选择“MATLAB Matrix-Only Function”(MATLAB矩阵函数)并保存生成的编码。我将它保存为myNNfun.m。

  9. 如果你单击“Next”并进入“Save Results”(结果保存)界面,你可以保存所创建的模型和对应脚步。我将这个简单的脚本保存为myNNscript.m。

这是你通过图片识别工具创造的人工神经网络模型图表。他有784个输入神经元, 100个隐藏层神经元,以及10个输出层神经元。

你的人工神经网络模型学会了通过训练权重来生产正确的输出。

W在图中代表权重,B代表偏置单元,他们是个体神经元的一部分。 隐藏层中的单个神经元看起来像是784个输入数据和相应的权重, 1个偏置单元和10个输出。

可视化已学习权重

如果你看myNNfun,m,或像IW1_1和x1_step1_keep之类的变量,他们表示你的人工神经网络模型通过训练得到的权重。 因为我们有784个输入数据和100个神经元, 在全层中1权重会变成100 x 784的矩阵。 让我们将它们可视化.。这就是我们的神经元学习的成果!

计算分类精确度

现在您准备使用 myNNfun.m 来预测在 Xtest 伸出的数据的各种标签并将它们和在 Ytest里的实际标签相比较。以防遇到不可见数据,那就给你提供了一次逼真的预测表演机会。这也是评价指标Kaggle用来打分的。

首先,您将看到网络的实际输出,它显示每个可能的标签出现的概率。您只需选择最有可能的标签作为您的预测标签,然后将其与实际标签进行比较。您应该看到95%的分类精确度。

Ypred = myNNfun(Xtest);             % 预测每个标签的概率Ypred(:, 1:5)                       % 显示前5列[~, Ypred] = max(Ypred);            % 寻找最大概率指标sum(Ytest == Ypred) / length(Ytest) % 预测与实际进行比较

网络体系结构

您可能注意到,人工神经网络模型生成于模式识别工具,而该工具只有一个隐藏层。如果您愿意,您可以构建一个具有更多层的自定义模型,但是这种简单的架构足以解决大多数常见问题。

你可能会问的下一个问题是,我是如何选择100个当做隐藏神经元数目。一般的经验法则是在输入神经元的数目784个和输出神经元的数目10个之间选择一个数字,我只是随意地选择了100个。这意味着如果尝试其他值,您可能会做得更好。这次我们已变成的方式做这件事间。采用myNNscript.m 会方便些——要做参数扫描的话,你可以简单地改写脚本。

现在,让我们画出分类精度相对隐层神经元数量的变化。

figure
plot(sweep, scores, '.-')
xlabel('number of hidden neurons')
ylabel('categorization accuracy')
title('Number of hidden neurons vs. accuracy')

看起来这个简单的人工神经网络模型在250个神经元附近获得了最好的结果,最好的分类精度在0.96左右。

如您所见,如果您增加隐藏神经元的数量,您将获得更高的精度,但随后某个时刻精度会降低(由于权重的随机初始化,您的结果可能会有所不同)。 当您增加神经元数量时,您的模型将能够捕获更多的特征,但是如果您捕获的特征太多,那么最终您的模型会过度拟合训练数据,并且对于看不见的数据训练得不好。 让我们用300个隐藏神经元来检查学习的权重。 你会看到更多的细节,但你也会看到更多的噪音。

现在你已经对人工神经网络有了一些直觉——该网络能自动根据输入数据记录下一切相关特性,并生成一个映射到输出数据标签的稀疏表示。如果我们把输入数据作为目标值情形又如何?那样你就不再需要训练标签了,并将其转化为无监督学习法。这就是众所周知的自编码,也就变成了一个深度学习网络的构建块。有一个很好的有关自编码的例子,是其专门用于深度神经网络的数字分类 页面上,该页面就是神经网络工具箱文档的页面,而该文档也使用MNIST数据集。更多详情,斯坦福大学提供了一个很好的 UFLDL 教程,该教程也使用相同的数据集和基于MATLAB的入门代码。

除了理解各种算法之外,还有一个实际问题就是如何第一时间生成输入数据。有人曾花了很多时间准备MNIST数据集来保证其具有统一的大小,缩放,对比等。为了在实际应用中去使用你从这个数据集里建立的模式,你必须能够在新的数据上重复相同的处理模式。你自己是怎么做这样的准备的呢?

现在有一个有趣的视频可告诉你如何使用一个网络摄像头来解决数独谜题,该摄像头使用不同的字符识别技术。没用静态图像,使用现场直播来做这件事,他带领你一步一步地完成前处理步骤。你一定查个明白: 使用网络摄像头解决数独谜题.


将您的练习提交到Kaggle

通过简单地接受除隐藏神经元数量之外的默认设置,您可以获得96%的分类准确率。 第一次尝试还不错。 因为您使用Kaggle数据集,因此现在可以将结果提交给Kaggle。

n = size(sub, 1);                                   % num of samplessub = sub';                                         % transpose
[~, highest] = max(scores);                         % highest scoring model
net = models{highest};                              % restore the model
Ypred = net(sub);                                   % label probabilities
[~, Label] = max(Ypred);                            % predicted labels
Label = Label';                                     % transpose Label
Label(Label == 10) = 0;                             % change '10' to '0'
ImageId = 1:n; ImageId = ImageId';                  % image ids
writetable(table(ImageId, Label), 'submission.csv');% write to csv

您现在可以在Kaggle的项目提交页面上提交submission.csv。

结语

在这个例子中,我们专注于使用手写数字识别的具体例子来获得对人工神经网络的直观理解。 我们没有详细介绍输入权重和偏差单位如何组合,激活(activation )如何工作,如何训练这样一个网络等等。但是现在您已经足够了解在MATLAB中使用神经网络工具箱来参与Kaggle竞赛。

为庆祝北京七月在线上海分公司开业

9月11日-9月13日全部课程7折起

届时更有神秘大礼送不停!


登录查看更多
8

相关内容

人工神经网络(Artificial Neural Network,即ANN),它从信息处理角度对人脑神经元网络进行抽象,建立某种简单模型,按不同的连接方式组成不同的网络。在工程与学术界也常直接简称为神经网络或类神经网络。神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
神经网络的拓扑结构,TOPOLOGY OF DEEP NEURAL NETWORKS
专知会员服务
31+阅读 · 2020年4月15日
Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
129+阅读 · 2020年3月15日
MATLAB玩转深度学习?新书「MATLAB Deep Learning」162页pdf
专知会员服务
99+阅读 · 2020年1月13日
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
187+阅读 · 2019年12月28日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
Python 热图进阶
专知
15+阅读 · 2019年5月4日
卷积神经网络简明教程
论智
8+阅读 · 2018年8月24日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
动手写机器学习算法:K-Means聚类算法
七月在线实验室
5+阅读 · 2017年12月6日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
模仿人类智慧——“多任务学习”动手实践
人工智能头条
8+阅读 · 2017年7月28日
Caffe 深度学习框架上手教程
黑龙江大学自然语言处理实验室
14+阅读 · 2016年6月12日
Feature Selection Library (MATLAB Toolbox)
Arxiv
7+阅读 · 2018年8月6日
Arxiv
6+阅读 · 2018年1月14日
VIP会员
相关VIP内容
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
神经网络的拓扑结构,TOPOLOGY OF DEEP NEURAL NETWORKS
专知会员服务
31+阅读 · 2020年4月15日
Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
129+阅读 · 2020年3月15日
MATLAB玩转深度学习?新书「MATLAB Deep Learning」162页pdf
专知会员服务
99+阅读 · 2020年1月13日
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
187+阅读 · 2019年12月28日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
相关资讯
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
Python 热图进阶
专知
15+阅读 · 2019年5月4日
卷积神经网络简明教程
论智
8+阅读 · 2018年8月24日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
动手写机器学习算法:K-Means聚类算法
七月在线实验室
5+阅读 · 2017年12月6日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
模仿人类智慧——“多任务学习”动手实践
人工智能头条
8+阅读 · 2017年7月28日
Caffe 深度学习框架上手教程
黑龙江大学自然语言处理实验室
14+阅读 · 2016年6月12日
Top
微信扫码咨询专知VIP会员