ex3 多分类和神经网络

倾然丶 夕夏残阳落幕 提交于 2019-12-01 16:10:42

介绍

在本练习中,您将实现一对多逻辑回归和神经识别手写数字的网络。在开始编程之前练习,我们强烈建议观看视频讲座并完成相关主题的复习问题。要开始练习,您需要下载起始代码并将其内容解压缩到要完成练习的目录。如果需要,请在开始本练习之前使用octave/matlab中的cd命令更改到此目录。您也可以在课程网站的“环境设置说明”中找到安装Octave/Matlab的说明。

本练习中包含的文件

ex3.m-octave/Matlab脚本,它引导您完成第1部分

ex3 nn.m-octave/matlab脚本,它引导您完成第2部分

ex3data1.mat-手写数字训练集

ex3weights.mat-神经网络练习的初始权重

submit.m-将解决方案发送到我们服务器的提交脚本

displaydata.m-帮助可视化数据集的函数

fmincg.m-函数最小化例程(类似于fminunc)

sigmoid-S形函数

[*]lrcostfunction.m-逻辑回归成本函数

[*]one vs all.m-训练一对多分类器

[*]PredictOneVsall.m-使用一对多分类进行预测

[*]predict.m-神经网络预测功能

*表示需要完成的文件

在整个练习中,您将使用脚本ex3.m和ex3 nn.m。这些脚本为问题设置数据集,并调用要编写的函数。不需要修改这些脚本。您只需按照本作业中的说明修改其他文件中的函数。

1多类器

在本练习中,您将使用逻辑回归和神经网络来识别手写数字(从0到9)。自动手写数字识别在今天得到了广泛的应用,从识别信封上的邮政编码到识别银行支票上的金额。这个练习将向你展示你所学的方法是如何用于这个分类任务。在练习的第一部分中,您将扩展先前的逻辑回归实现,并将其应用于一对所有分类。

1.1数据集

在ex3data1.mat中提供了一个包含5000个手写数字训练示例的数据集,.mat格式表示数据已保存为本机倍频程/Matlab矩阵格式,而不是像CSV文件那样的文本(ASCII)格式。这些矩阵可以使用load命令直接读入程序。加载后,正确大小和值的矩阵将出现在程序内存中。矩阵将已命名,因此不需要为它们指定名称。

% Load saved matrices from file
load('ex3data1.mat');
% The matrices X and y will now be in your Octave environment

ex3data1.mat中有5000个训练示例,其中每个训练示例是数字的20像素x 20像素灰度图像。每个像素由一个表示该位置灰度强度的浮点数表示。20×20像素网格被“展开”成400维向量。每一个训练样本在我们矩阵X中都变成了一行。这给了我们一个5000×400的矩阵x,其中每一行都是训练手写数字图像的示例。

 

 训练集的第二部分是包含训练集标签的5000维向量y。为了使与octave/Matlab索引更兼容,在没有零索引的情况下,我们将数字零映射到值十。因此,“0”数字标记为“10”,而数字“1”到“9”按其自然顺序标记为“1”到“9”。

1.2可视化数据

您将从可视化训练集的子集开始。在ex3.m的第1部分中,代码从X中随机选择100行,并将这些行传递给displaydata函数。此函数将每行映射为20像素×20像素的灰度图像,并将图像一起显示。我们已经提供displaydata函数,我们鼓励您检查代码以了解其工作原理。运行此步骤后,应该会看到类似于图像的图形

 

1.3向量化逻辑回归

您将使用多个 one-vs-all逻辑回归模型来构建一个多类分类。因为有10个类,你需要训练10个独立的逻辑回归分类。为了提高培训效率,重要的是确保您的代码是良好的矢量化。在本节中,您将实现一个逻辑回归的矢量化版本,它不使用任何循环。您可以使用上一个练习中的代码作为本练习的起点。

1.3.1成本函数矢量化

我们将从编写成本函数的矢量化版本开始。回想一下,在(非规范的)logistic回归中,成本函数是

 

 

 为了计算求和式中的每一个元素,我们不得不去计算hθ(x(i))对于每一个i,而hθ(x(i))=g(θTX),g(z)=1/(1-exp(-z))为S函数。结果证明我们可以很快计算出使用矩阵乘法的例子。我们把x和θ定义为

 

 

 

 

 在上一个等式中,我们利用了这样一个事实,如果a、b都是向量,aTb=bTa。者允许我们对所有i,用一行代码计算这个等式θTx(i)

你的工作是在lrcostfunction.m中编写未经规范化的成本函数。您的实现应该使用我们上面介绍的策略来计算θTx(i)  你应该使用矢量化接近其余的成本函数lrcostfunction.m的完全矢量化版本不应包含任何循环。

(提示:可能需要使用按元素的乘法操作(.*)和编写此函数时的sum操作sum)

1.3.2梯度矢量化

回想一下,(未规范的)逻辑回归成本的梯度是一个向量,其中第j个元素定义为

 

 为了使这个操作在数据集上矢量化,我们首先显式地写出所有θj的所有偏导数

 

 

 

 注意x(i)是一个矢量,然而是一个标量,为了理解上一步的转变,令后观察:

 

 

 

上面的表达式允许我们计算所有的偏导数,而不需要任何循环。如果你熟悉线性代数,我们鼓励你通过上面的矩阵乘法运算来说服自己矢量化版本执行相同的计算。现在应该实现公式1来计算正确的矢量化梯度。完成后,通过实现梯度来完成函数lrcostfunction.m。

 调试技巧:对代码进行矢量化有时会很棘手。调试的一个常见策略是使用size函数打印出正在使用的矩阵的大小。例如,给定一个尺寸为100×20(100个例子,20个特征)的数据矩阵x和一个尺寸为20×1的向量θ,可以观察到xθ是一个有效的乘法运算,而θx不是。此外,如果您有一个非矢量化版本对于代码,可以比较矢量化代码和非矢量化代码的输出,以确保它们产生相同的输出。

1.3.3向量化正则logistic回归

在为逻辑回归实现矢量化之后,现在将向成本函数添加正则化。回顾一下,对于正则化的logistic回归,成本函数定义为

 

 

 注意不要正则化θ0,因为它是一个偏置项。相应地,θj的正则logistic回归成本的偏导数定义为

 

现在修改lrcostfunction中的代码以考虑正则化。同样,您不应该在代码中放入任何循环。

1.4一对所有分类

在练习的这一部分中,您将通过进行多个正则化logistic回归分类法来实现one-vs-all分类法,在我们的数据集中,每个k类一个分类法(图1)。在手写数字数据集中,k=10,但是你的代码应该适用于k的任何值。你现在应该在onevsall.m中完成代码,为每个类训练一个分类。特别是,您的代码应该返回所有Classifier参数.在矩阵Θ∈Rk×(n+1)中,其中每一行Θ对应于学习的一个类的logistic回归参数。你可以用“for”循环从1到K,独立训练每个等级。

请注意,这个函数的Y参数是1到10的标签向量,在这里我们将数字“0”映射到标签10(以避免索引混乱)。当为类k∈{1,…,k}训练分类器时,需要一个标签y的多维向量,其中y j∈0,1表示第j个训练实例是否属于类k(yj=1),或者是否属于不同的类(yj=0)。您可以找到有助于此任务的逻辑数组。

此外,您将在本练习中使用fmincg(而不是fminunc)。fmincg的工作原理与fminnc类似,但在处理大量的参数。正确完成onevsall.m的代码后,脚本ex3.m将继续使用onevsall函数来训练多类分类器

1.4.1一对所有预测

在训练完你的一对所有分类后,你现在可以用它来预测包含在给定图像中的数字。对于每个输入,您应该计算使用训练的logistic回归分析,它属于每个类的“概率”分类。你的one vs all预测函数将选择相应的logistic回归分类输出最高概率和返回类标签(1、2、…,或k)作为输入示例的预测。现在您应该完成predictonevsall.m中的代码来使用一对所有分类进行预测。完成后,ex3.m将使用的学习价值。你应该看到训练集的准确94.9%(即,它正确分类了训练集中94.9%的示例)。

2神经网络

在本练习的前一部分中,您实现了多类逻辑回归来识别手写数字。然而,逻辑回归不能形成更复杂的假设,因为它只是一个线性分类。在练习的这一部分中,您将使用与之前相同的训练集实现一个神经网络来识别手写数字。神经网络将能够表示形成非线性假设的复杂模型。本周,你将使用我们已经训练过的神经网络的参数。

你的目标是实现前馈传播算法来使用我们的权重进行预测。在下周的练习中,您将编写用于学习神经系统的反向传播算法网络参数。

提供的脚本ex3 nn.m将帮助您逐步完成此练习

2.1模型表示

我们的神经网络如图2所示。它有三层:输入层、隐藏层和输出层。回想一下,我们的输入是数字图像的像素值。由于图像的大小是20×20,这给了我们400个输入层单元(不包括总是输出+1的额外偏置单元)。与之前一样,训练数据将加载到变量x和y中。

  我们已向你提供了一套数据训练过的数据这些参数存储在ex3weights.mat中,将由ex3 nn.m加载到θ1和θ2中。参数的尺寸为第二层25个单位和10个输出单位(对应于10个数字类)的神经网络。

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!