吴恩达机器学习作业翻译3——neural network

程序设计练习3:多类分类和神经网络

介绍

    在这个练习中,你将实现一对多逻辑回归和神经网络来识别手写数字。在开始编程之前,我们强烈建议观看视频课程并完成相关主题问题的复习。

    要开始练习,你需要下载起始代码并将其内容解压缩到你希望完成练习的目录中。如果需要,请在开始本练习之前使用Octave/MATLAB中的cd命令更改到此目录。

    你也可以在课程网站的“环境设置说明”中找到安装Octave/MATLAB的说明。

本练习包含的文件

ex3.m - 指导你完成第一部分练习的Octave/MATLAB脚本
ex3_nn.m - 指导你完成第二部分练习的Octave/MATLAB脚本
ex3data1.mat - 手写数字的训练集
ex3weights.mat - I神经网络练习的初始权值
submit.m - 提交作业的脚本
displayData.m - 帮助可视化数据集的函数
fmincg.m - 最小化函数程序(类似于fminunc)
sigmoid.m - S函数
[*] lrCostFunction.m - 逻辑回归代价函数
[*] oneVsAll.m - 训练一个one-vs-all多类分类器
[*] predictOneVsAll.m - 使用one-vs-all多类分类器预测
[*] predict.m - 神经网络预测函数
* 表示你要完成的文件

    在本练习中,你将使用ex3.m和ex3_nn.m脚本。这些脚本为题目设置数据集并且调用你编写的函数。你不需要修改这些脚本,只需要按照作业说明定义其他函数。

在哪里寻求帮助

    本课程的练习使用非常适合数值计算的高级编程语言Octave或MATLAB。如果你没有安装Octave或MATLAB,请参阅课程网站上“环境设置说明”中的安装说明。

    在Octave/MATLAB命令行中输入help紧跟函数名称会显示内建的函数说明。比如输入help plot会显示绘图函数的帮助信息。更多Octave和MATLAB的函数说明请在Octave官网MATLAB官网查阅。

    我们也非常鼓励使用在线讨论与其他学生讨论练习。但是,不要查看任何源代码或与他人共享源代码。


1、多分类

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

    在本练习的第一部分中,你将扩展之前对逻辑回归的实现,并将其应用于one-vs-all分类。

1.1 数据集

    你会在ex3data1.mat中得到一个包含5000个手写数字识别样本的训练集。mat格式意味着该数据集保存为原生的Octave/MATLAB矩阵格式,而不是像csv那样的文本格式。这些矩阵可以通过load命令直接加载到你的程序中。加载之后,维度和值都无误的矩阵已经被加载到内存中了,而且该矩阵已经被命名了,你不需要对其重命名。

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

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

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

1.2 数据可视化

    你将从可视化训练集的一个子集开始。在ex3.m的Part 1中,代码随机从X中选择100行并将其传递给函数displayData。该函数将每一行映射到20px * 20px的灰度图像,并将图像一起显示。我们提供了displayData函数,同时也鼓励你观察该函数是如何工作的。
运行代码之后,你应该会看到一张图如图1所示:


Figure 1: Examples from the dataset

1.3 向量化逻辑回归

    你将使用多个one-vs-all逻辑回归模型来构建一个多类分类器。由于有10个类(1-10个数字),你将需要训练10个单独的逻辑回归分类器。为了使训练有效,确保代码良好地支持向量化非常重要。在本节中,你将实现逻辑回归的向量化版本,它不使用任何for循环。你可以使用上一个练习中的代码作为这个练习的开始。

1.3.1 向量化代价函数

    我们将从编写成本函数的向量化版本开始。回想一下,在非正则化逻辑回归中,成本函数是:

    为了对每个元素求和,我们必须计算hθ(x(i)),其中:


是S函数。这样一来我们就可以用矩阵乘法快速计算所有样本。其中X和他和θ的定义为:


然后通过计算得到矩阵Xθ,我们有:

在上个等式中,假设a和b都是向量,我们使a.T * b = b.T * a。这样我们就可以在一行代码中计算所有样本i的θ.Tx(i)(i为上标,表示第i个样本)。
    你的任务就是在lrCostFunction.m中写非正则化代价函数的代码。你的实现应该使用我们上面的策略来计算的θ.T
x(i)。你还应该对代价函数的其余部分使用向量化的方法,一个完全向量化的lrCostFunction.m应该是没有任何循环的。

1.3.2 向量化梯度

    回想一下(非正则化)逻辑回归成本的梯度是一个向量,其中第j个元素定义为:

    为了在数据集上对该操作进行向量化,我们首先明确地为所有θj写出所有偏导数,

    注意,当($h_{θ}(x^{(i)}) - y^{(i)}$)是一个标量(单个数字)时,$x^{(i)}$是一个向量。为了最后一步求导,我们让$β_i = (h_θ(x^{(i)}) - y^{(i)}$并观察:

    上面的表达式允许我们在不适用任何循环的情况下计算所有偏导数。 如果你对线性代数比较熟悉,我们建议你通过上面的矩阵乘法,因为矢量化版本执行相同的计算。 你现在应该实现等式1来计算正确的矢量化梯度。 一旦结束后,就完成了通过实现梯度来完成函数lrCostFunction.m。

调试技巧:向量化代码有时很棘手。调试的一个常见策略是使用size函数打印出正在处理的矩阵的大小。例如,给定一个大小100×20(100个样本,20特征)的数据矩阵的和一个维度维度是20×1θ的向量,你可以观察到Xθ是一个有效的乘法操作,虽然θX不是。此外,如果你有代码的非向量化版本,你可以比较向量化代码和非向量化代码的输出,以确保它们产生相同的输出。

1.3.3 向量化正则化逻辑回归

    在实现了逻辑回归向量化之后,现在你将向成本函数添加正则化。回想一下,对于正则化逻辑回归,成本函数的定义是

    注意,你不能正则化偏差项$θ_0$

    相应地,正规化的逻辑回归代价函数对于$θ_j$的偏导数被定义为

    现在在lrCostFunction中修改代码以实现正则化。
同样,代码中不应该出现任何循环。

            ==你现在应该提交答案==

1.4 One-vs-all分类器

    在这部分练习中,你将通过训练多个规范化逻辑回归分类器来实现one-vs-all分类,每个规范化逻辑回归分类器对应于我们数据集中的K个类(图1)。在手写数字识别训练集中,K=10,但是你的代码应该接受任意值的K。

    你现在应该完成oneVsAll.m中的代码为每个类训练一个分类器。特别是,你的代码应该在一个矩阵θ中返回所有分类器的参数,每一行Θ对应于学习到的逻辑回归参数的一个类。你可以使用一个从1到K的for循环来实现这一点,独立地训练每个分类器。

    注意,这个函数的参数y是从1到10的标签向量,其中我们将数字“0”映射到标签10(以避免与索引混淆)。

    当训练的分类器类k∈{1,…K},会想要一个标签y的m维向量($y_j$∈0,1表)示第j训练实例是否属于类K($y_j$ = 1),或者如果它属于一个不同的类($y_j$ = 0)。你可能会发现逻辑阵列有助于这项任务。

Ocvate/MATLAB技巧:在Octave/MATLAB中的逻辑数组是包含二进制(0或1)的数组。在Octave/MATLAB中对于向量a(m * 1)和标量b计算a==b时,会返回一个和a大小相同的向量。该向量的元素值在a中的元素等于b的位置为1,否则为0。为了看清楚他们是如何工作的,在你的Octave/MATLAB环境中执行以下代码:

   a = 1:10; % Create a and b
   b = 3;
   a == b % You should try different values of b here

    此外,你将在本练习中使用fmincg(而不是fminunc)。
fmincg的工作原理与fminunc类似,但在处理大量参数时效率更高。

    在你正确完成oneVsAll.m中的代码之后,ex3.m将调用oneVsAll函数来训练多类分类器。

            ==你现在应该提交答案==

1.4.1 One-vs-all预测

    在训练了你的one-vs-all分类器之后,你可以使用它来预测给定图像中包含的数字。对于每个输入,你应该使用训练过的逻辑回归分类器计算它属于每个类的“概率”。你的one-vs-all预测函数将选择相应的逻辑回归分类器输出的概率最大的类,并返回类标签(1,2,…,或K)作为输入示例的预测。

    你现在应该完成predictOneVsAll.m中的代码来做预测。

    当你完成之后,ex3.m将会用你学习到的θ调用predictOneVsAll函数。可以看到,训练集的准确率约为94.9%(即正确分类了训练集中94.9%的样本)。

            ==你现在应该提交答案==

2、神经网络

    在前面的练习中,你实现了多分类逻辑回归来识别手写数字。然而,逻辑回归只是一个线性分类器,不能形成更复杂的假设。

    在这部分练习中,你将使用和前面同样的训练集实现一个神经网络来识别手写数字。神经网络将能够表示非线性假设的复杂模型。本周,你将使用我们已经训练过的神经网络中的参数。 你的目标是实现前馈传播算法以使用我们的权重进行预测。在下周的练习中,你将编写用于学习神经网络参数的反向传播算法。

    ex3_nn.m脚本将带你逐步完成本次练习。

2.1 模型表示

    我们的神经网络如图2所示,总共有3层——一个输入层、一个隐藏层和一个输出层。回想一下,我们的输入是数字图像的像素值。由于图像大小20×20,因此给了我们400个输入层单位(不包括额外的偏差项)。和之前一样,训练数据将被加载到变量X和y中。

    我们已经为你提供了我们训练的一组神经网络参数($θ^{(1)}$,$θ^{(2)}$)。他们存在ex3weights.mat中并可以使用ex3_nn.m加载到Theta1和Theta2中。参数具有针对神经网络的大小,其在第二层中具有25个单元并且具有10个输出单元(对应于10个数字类)。

% Load saved matrices from file
load('ex3weights.mat');
% The matrices Theta1 and Theta2 will now be in your Octave
% environment
% Theta1 has size 25 x 401
% Theta2 has size 10 x 26


Figure 2: Neural network model

2.2 前馈传播与预测

    现在你将实现神经网络的前馈传播。你需要完成predict.m中的代码来返回神经网络的预测。

    你应该实现前馈计算,该计算为每个样本i计算$h_θ(x^{(i)})$并返回相关的预测。 类似于one-vs-all分类策略,来自神经网络的预测将是具有最大输出($h_θ(x)$)k的标签。

实现注意:矩阵X以行为单位包含样本。当你完成predict.m中的样本时,你需要在矩阵中添加全为1的列。矩阵Theta1和矩阵Theta2以行为单位为每一项包含参数。就是说,Theta1的第一行对应第二层中的第一个隐藏单元。在Octave/MATLAB中,当你计算z(2)=θ(1)a(1)时,确保你索引了(如果必要的话,转置)X这样你就得到了a(l)作为列向量。

    一旦你完成之后,ex3_nn.m将使用加载的Thea1和Theta2参数调用predict函数。你应该看到准确率大约是97.5%。之后,一个交互式序列将每次从训练集中启动一个显示图像,而控制台将打印出显示图像的预测标签。要停止图像序列,请按Ctrl-C。

    ==你现在应该提交答案==

提交和评分

    完成此任务后,请确保使用submit函数将你的解决方案提交到我们的服务器。下面是这个练习的每个部分是如何得分的说明。

    你可以多次提交作业,但我们只考虑最高分。

点个赞呗:程序员虾说 » 吴恩达机器学习作业翻译3——neural network

赞 (5) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

请作者喝杯咖啡~

支付宝扫一扫打赏

微信扫一扫打赏