MATLAB人工神经网络教程-36大数据

我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

MATLAB人工神经网络教程-36大数据

作者: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
				
			

MATLAB人工神经网络教程-36大数据

准备数据

你可以使用神经网络工具箱中的模式识别应用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个输出层神经元。

MATLAB人工神经网络教程-36大数据

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

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

MATLAB人工神经网络教程-36大数据

可视化已学习权重

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

MATLAB人工神经网络教程-36大数据

计算分类精确度

现在您准备使用 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')
			

MATLAB人工神经网络教程-36大数据

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

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

MATLAB人工神经网络教程-36大数据

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

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

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

MATLAB人工神经网络教程-36大数据

将您的练习提交到Kaggle

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

				n = size(
				
					sub
					, 1)
				
				;                                   % num of samples
				
					sub
					=
					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竞赛。

End.

转载请注明来自36大数据(36dsj.com): 36大数据 » MATLAB人工神经网络教程

随意打赏

人工神经网络
提交建议
微信扫一扫,分享给好友吧。