介绍

在本练习中,您将实现一对多逻辑回归和神经识别手写数字的网络。在开始编程之前练习,我们强烈建议观看视频讲座并完成相关主题的复习问题。要开始练习,您需要下载起始代码并将其内容解压缩到要完成练习的目录。如果需要,请在开始本练习之前使用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个数字类)的神经网络。

ex3 多分类和神经网络的更多相关文章

  1. 斯坦福深度学习与nlp第四讲词窗口分类和神经网络

    http://www.52nlp.cn/%E6%96%AF%E5%9D%A6%E7%A6%8F%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E4%B8%8Enlp%E7%A ...

  2. Coursera-AndrewNg(吴恩达)机器学习笔记——第四周编程作业(多分类与神经网络)

    多分类问题——识别手写体数字0-9 一.逻辑回归解决多分类问题 1.图片像素为20*20,X的属性数目为400,输出层神经元个数为10,分别代表1-10(把0映射为10). 通过以下代码先形式化展示数 ...

  3. 机器学习作业(三)多类别分类与神经网络——Python(numpy)实现

    题目太长了!下载地址[传送门] 第1题 简述:识别图片上的数字. import numpy as np import scipy.io as scio import matplotlib.pyplot ...

  4. 机器学习作业(三)多类别分类与神经网络——Matlab实现

    题目太长了!下载地址[传送门] 第1题 简述:识别图片上的数字. 第1步:读取数据文件: %% Setup the parameters you will use for this part of t ...

  5. 神经网络NN

    神经网络基本模型: 1.前向神经网络:无圈的有向图N=(V,E,W),其中,V为神经元集合,E为连结权值集合,W为每一连结赋予一实值的权重. 神经元集V可以被分成无接受域的输入结点集V1,无投射域的输 ...

  6. PaddlePaddle︱开发文档中学习情感分类(CNN、LSTM、双向LSTM)、语义角色标注

    PaddlePaddle出教程啦,教程一部分写的很详细,值得学习. 一期涉及新手入门.识别数字.图像分类.词向量.情感分析.语义角色标注.机器翻译.个性化推荐. 二期会有更多的图像内容. 随便,帮国产 ...

  7. 卷积神经网络CNN

    卷积神经网络,在图像识别和自然语言处理中有很大的作用,讲cnn的中文博客也不少,但是个人感觉说的脉络清晰清晰易懂的不多. 无意中看到这篇博客,写的很好,图文并茂.建议英文好的直接去看原文.英文不好的就 ...

  8. Hopfield神经网络

    神经网络分类 多层神经网络:模式识别 相互连接型网络:通过联想记忆去除数据中的噪声 1982年提出的Hopfield神经网络是最典型的相互连结型网络. 联想记忆 当输入模式为某种状态时,输出端要给出与 ...

  9. 卷积神经网络CNNs的理解与体会

    https://blog.csdn.net/shijing_0214/article/details/53143393 孔子说过,温故而知新,时隔俩月再重看CNNs,当时不太了解的地方,又有了新的理解 ...

随机推荐

  1. python装饰器的简单理解

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你 ...

  2. 【LuoguP4770】[NOI2018] 你的名字

    题目链接 题意简述 给定一个串 \(S\) 多组询问 , 每次给定一个串 \(T\) 和一个 区间 \([l,r]\) 求串\(T\) 有多少个本质不同的子串 满足不是 \(S[l...r]\) 的子 ...

  3. 【LuoguP4156】论战捆竹竿

    题目链接 题意简述 你有一个长度为 n 的字符串 , 将它复制任意次 , 复制出的串的前缀可以与之前的串的后缀重叠在一起 , 问最后总共可能的长度数目 , 长度不能超过 \(w\) 多组数据. \(n ...

  4. 查询重复数据group by menu_id having count(menu_id)>1

    select * from sys_power_menu WHERE menu_id in ( select menu_id from  sys_power_menu group by menu_id ...

  5. html显示高亮c++

    配色与Devc++ 的classic plus 相同 输入文件名即可,输出在out.htm中 #include<bits/stdc++.h> #include<windows.h&g ...

  6. 使用M/Monit进行可视化集中进程管理

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://heqin.blog.51cto.com/8931355/1863924 一:前言 ...

  7. python新动态执行 文件头标识 禁止断言

    1.exec “python语句” 2. 3.禁止断言

  8. RedisTemplate访问Redis数据结构(前言)

    Redis五种基本数据结构 redis提供键值对的形式对数据进行存储.支持五种数据类型:String(字符串),List(链表),Hash(散列),Set(无序集合),ZSet(有序集合).下面是网上 ...

  9. No plugin found for prefix 'war' in the current project and in the plugin groups

    解决办法: 在pom里面添加 : <dependency> <groupId>org.apache.maven.plugins</groupId> <arti ...

  10. elasticsearch堆内存的配置建议

    1.将最小堆大小(Xms)和最大堆大小(Xmx)设置为彼此相等 防止内存抖动 2:给多大的堆内存? 给ES的内存配置不是越大越好,建议不能超过32GB,不同jdk版本最大边界值是不同的,对于32位小于 ...