UFLDL实验报告1: Softmax Regression
PS:这些是今年4月份,跟斯坦福UFLDL教程时的实验报告,当时就应该好好整理的…留到现在好凌乱了
Softmax Regression实验报告
1.Softmax Regression实验描述
Softmax回归模型是逻辑回归模型的推广,它可以把数据分类到两个以上的类别。在本实验中,我们的目标是采用Softmax回归模型对MNIST手写数字数据库进行分类,识别每个手写数字,把它们归类于0到9之间的10个类别。实验中需要计算成本函数J,参数Theta,成本函数的梯度
,及预测假设h。

Figure1:some examples from the dataset
2.实现流程
Step 0:初始化常数和参量
Step 1 :加载数据
Step 2 :计算成本函数和梯度
Step 3 :梯度检查(若检查结果差距过大,返回step2)
Step 4 :学习参数
Step 5 : 测试
3.每步关键点及代码、注释
Step 0:初始化常数和参量
在MNIST数据库中,每个图像都由28x28像素的方块构成。实验的分类数量为10,分别对应0-9十个数字。
Step 1 :加载数据
练习中已经提供了两个读取数据的函数,loadMNISTImages,loadMNISTLabels。实际实验中要根据数据存放的路径,和文件名修改对应代码。
Step 2 :计算成本函数和梯度
这是这次实验中最关键也是最难的地方。要解决这个问题,需要熟练Matlab矢量化表示,详细分析每个矩阵的维度大小,每行每列都分别什么。
数据X是一个n x m矩阵,n = inputSize 为输入向量的维度,在本实验中为每个图像的像素数28x28=784,m = numCases 为训练样本的总数,在本实验中为60,000。
假设函数h的表达式如下,在这里h是一个k x m 的矩阵。k = numClasses 为类别数,在这里是10 :


实际运行中,
这项有可能过大,导致内存溢出。处理方法是对假设函数矩阵h中的每列的指数项
都减去一个常数
,在这里选取每列的
等于每列
中最大的一项,具体实现代码如下所示。
M = bsxfun(@minus,theta*data,max(theta*data, [], 1));
M = exp(M);
p = bsxfun(@rdivide, M, sum(M));
参数Theta的结构如下,它是一个k x n的矩阵。

y是对每个手写数字图像正确分类的标签集合,是一个k x m的矩阵。
成本函数J的表达式如下:

成本函数梯度的表达式如下:

下面是matlab实现上述表达式的Matlab源码。
softmaxCost.m
%% ---------- YOUR CODE HERE --------------------------------------
% Instructions: Compute the cost and gradient for softmax regression.
% You need to compute thetagrad and cost.
% The groundTruth matrix might come in handy.
M = bsxfun(@minus,theta*data,max(theta*data, [], 1));
M = exp(M);
p = bsxfun(@rdivide, M, sum(M));
cost = -1/numCases * groundTruth(:)' * log(p(:)) + lambda/2 * sum(theta(:) .^ 2);
thetagrad = -1/numCases * (groundTruth - p) * data' + lambda * theta;
Step 3 :梯度检查
在实际训练样本数据之前,应该总是进行梯度检查。以确保实际得到的梯度与数值计算得到的梯度尽可能接近,在本实验中要小于10 e-9。如果这个差值过大,则应该重新检查算法的实现代码。
本实验中用到了checkNumericalGradient.m函数,需要从之前的实验中获得。
在这里最后梯度检查的差值为7.4657e-10,具体运行过程已附在文后。
Step 4 :学习参数
在本实验中优化函数常用minFunc_2009,是有Mark Schmidt 编写的一个Matlab优化工具箱,采用Limited-memory BFGS等算法实现最优化。
由于Matlab版本问题,起初使用2012版出现错误,后改用2009版minfunc才能正常运行。
优化代码如下所示:
% Use minFunc to minimize the function
addpath minFunc/
options.Method = 'lbfgs'; % Here, we use L-BFGS to optimize our cost
% function. Generally, for minFunc to work, you
% need a function pointer with two outputs: the
% function value and the gradient. In our problem,
% softmaxCost.m satisfies this.
minFuncOptions.display = 'on';
[softmaxOptTheta, cost] = minFunc( @(p) softmaxCost(p, ...
numClasses, inputSize, lambda, ...
inputData, labels), ...
theta, options);
Step 5 : 测试
测试时需要先把 softmaxExercise.m 中 DEBUG 设为 false ,跳过调试部分直接运行测试代码。
假设函数矩阵中h的每一列为给出的针对不同数字的概率,预测时找出每一列中概率最大的元素,令其为1,列中其余元素为0。具体实现代码如下。
softmaxPredict.m
%% ---------- YOUR CODE HERE --------------------------------------
% Instructions: Compute pred using theta assuming that the labels start from 1.
% theta : numClasses(k) x inputSize(N)
% pred : size(label) -> m x 1
M = bsxfun(@minus,theta*data,max(theta*data, [], 1));
M = exp(M);
h = bsxfun(@rdivide, M, sum(M));
[Y,pred] = max(h, [], 1);
4.实验结果及运行环境
实验结果
对最后10,000个测试集合,预测的精确度为:92.640%
耗时:91.919秒
运行环境
处理器: AMD A6-3420M APU with Radeon(tm) HD Graphics 1.50 GHz
RAM:4.00GB(2.24GB可用)
OS:Windows 7,32 bit
Matlab:R2012b(8.0.0.783)
minFunc:minFunc_2009
5.附录:实际运行结果
>> softmaxExercise
Iteration FunEvals Step Length Function Val Opt Cond
1 3 1.92327e-01 2.10164e+00 4.70649e+01
2 4 1.00000e+00 7.85859e-01 2.66517e+01
3 6 2.46921e-01 6.62726e-01 1.44533e+01
4 7 1.00000e+00 6.09112e-01 8.55839e+00
5 8 1.00000e+00 5.38142e-01 6.62115e+00
6 9 1.00000e+00 5.17398e-01 1.71550e+01
7 10 1.00000e+00 4.64872e-01 6.08330e+00
8 11 1.00000e+00 4.51595e-01 3.75876e+00
………..
95 101 1.00000e+00 2.67229e-01 8.72547e-03
96 102 1.00000e+00 2.67227e-01 8.84766e-03
97 103 1.00000e+00 2.67226e-01 1.00373e-02
98 104 1.00000e+00 2.67225e-01 1.68570e-02
99 105 1.00000e+00 2.67224e-01 7.52862e-03
100 106 1.00000e+00 2.67223e-01 5.98523e-03
Exceeded Maximum Number of Iterations
Accuracy: 92.640%
Elapsed time is 91.878679 seconds.
>> memory
Maximum possible array: 1021 MB (1.071e+09 bytes) *
Memory available for all arrays: 1809 MB (1.897e+09 bytes) **
Memory used by MATLAB: 521 MB (5.467e+08 bytes)
Physical Memory (RAM): 2297 MB (2.408e+09 bytes)
* Limited by contiguous virtual address space available.
** Limited by virtual address space available.
>>

UFLDL实验报告1: Softmax Regression的更多相关文章
- UFLDL实验报告3:Self-taught
Self-taught 自我学习器实验报告 1.Self-taught 自我学习实验描述 自我学习是无监督特征学习算法,自我学习意味着算法能够从未标注数据中学习,从而使机器学习算法能够获得更大数量的数 ...
- UFLDL实验报告2:Sparse Autoencoder
Sparse Autoencoder稀疏自编码器实验报告 1.Sparse Autoencoder稀疏自编码器实验描述 自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值, ...
- ufldl学习笔记与编程作业:Softmax Regression(vectorization加速)
ufldl学习笔记与编程作业:Softmax Regression(vectorization加速) ufldl出了新教程,感觉比之前的好.从基础讲起.系统清晰,又有编程实践. 在deep learn ...
- ufldl学习笔记和编程作业:Softmax Regression(softmax回报)
ufldl学习笔记与编程作业:Softmax Regression(softmax回归) ufldl出了新教程.感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量 ...
- 深度学习 Deep Learning UFLDL 最新Tutorial 学习笔记 5:Softmax Regression
Softmax Regression Tutorial地址:http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/ 从本节開始 ...
- R︱Softmax Regression建模 (MNIST 手写体识别和文档多分类应用)
本文转载自经管之家论坛, R语言中的Softmax Regression建模 (MNIST 手写体识别和文档多分类应用) R中的softmaxreg包,发自2016-09-09,链接:https:// ...
- 北京电子科技学院(BESTI)实验报告5
北京电子科技学院(BESTI)实验报告5 课程: 信息安全系统设计基础 班级:1452.1453 姓名:(按贡献大小排名) 郑凯杰.周恩德 学号:(按贡献大小排名) 20145314.20145217 ...
- 北京电子科技学院(BESTI)实验报告4
北京电子科技学院(BESTI)实验报告4 课程: 信息安全系统设计基础 班级:1452.1453 姓名:(按贡献大小排名)周恩德 .郑凯杰 学号:(按贡献大小排名)20145217 .201453 指 ...
- 20145215&20145307信息安全系统设计基础实验报告
20145215&20145307信息安全系统设计基础实验报告 PART1 一.实验原理 交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码.同一个体系结构可以运行不同的操作系统 ...
随机推荐
- runtime/KVO等面试题
整理中... 1.KVO内部实现原则 回答:1>KVO是基于runtime机制实现的 2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中 ...
- ASP.NET与SOAP协议使用记录
近期初次接手一个公司的管理系统开发任务,因为公司需要有Android,IOS客户端,又要求有PC端的网页客户端....对服务请求的要求自然也就落在了统一接口访问上了.... 使用ASP.NET的WEB ...
- Maven属性、profile和资源过滤
Maven的六类属性 内置属性 主要有两个常用内置属性:${basedir}项目的根目录(包含pom.xml文件的目录),${version}项目版本 POM属性 用户可以使用该属性引用POM文件中对 ...
- pomelo 服务器之间的通信
master服务器在启动的时候会启动mater服务,生成一个MasterAgent,作为中心服务器. 然后所有服务器,包括mater服务器,都会启动monitor服务,生成一个MonitorAgent ...
- SQL 存储过程 通过多个ID更新数据 分类: SQL Server 2014-12-08 16:08 299人阅读 评论(0) 收藏
下面举个例子说明: 我想让一部分品牌的名称(即Brand_Name)后面加上1,Brand_ID是主键,sql语句很容易实现,但是存储过程如何写呢? 错误写法如下: //*************** ...
- JAVA Web学习篇--Servlet
Servlet由来 做过BS项目的人都知道,浏览器可以依据HTML静态标记语言来显示各式各样的网页.可是假设我们须要在网页上完毕一些业务逻辑:比方登陆验证.或者说网页显示的内容在server的数据库中 ...
- Linux Device Driver 3th 中的一些坑
linux设备驱动第三版由于年代比较久远,有很多东西已过时.开一贴记录自己发现的一些问题. 4.3.1.4. seq_file接口 此节最后提到用 struct proc_dir_entry* cre ...
- block没那么难(一):block的实现
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> block 顾名思义就是代码块,将 ...
- (总结)CentOS Linux搭建SVN Server配置详解
PS:虽然在公司linux服务器上搭建过几次svn,但是时间长了,有些配置操作会忘掉,上网搜索的结果都不大满意,有幸在前几天看到一篇算是最满意的svn搭建文章,转载一下以备以后使用,原文地址 ...
- Javascript绝句欣赏
1. 取整同时转成数值型: '10.567890'|0 结果: 10 '10.567890'^0 结果: 10 -2.23456789|0 结果: -2 ~~-2.23456789 结果: -2 2. ...