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.

>>

时间: 2024-08-05 07:04:05

UFLDL实验报告1: Softmax Regression的相关文章

UFLDL实验报告3:Self-taught

Self-taught 自我学习器实验报告 1.Self-taught 自我学习实验描述 自我学习是无监督特征学习算法,自我学习意味着算法能够从未标注数据中学习,从而使机器学习算法能够获得更大数量的数据,因而更有可能取得更好的性能.在本实验中,我们将按照自我学习的步骤,使用稀疏自编码器和softmax分类器去构造一个手写数字分类器. 实现流程 Step 1 :产生训输入和测试样本集 Step 2 :训练稀疏自编码器 Step 3 :提取特征 Step 4 :训练和测试softMax分类器 Ste

UFLDL实验报告2:Sparse Autoencoder

Sparse Autoencoder稀疏自编码器实验报告 1.Sparse Autoencoder稀疏自编码器实验描述 自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值,比如 .自编码神经网络尝试学习一个 的函数.换句话说,它尝试逼近一个恒等函数,从而使得输出 接近于输入 .当我们为自编码神经网络加入某些限制,比如给隐藏神经元加入稀疏性限制,那么自编码神经网络即使在隐藏神经元数量较多的情况下仍然可以发现输入数据中一些有趣的结构.稀疏性可以被简单地解释如下.如果当神经

ufldl学习笔记与编程作业:Softmax Regression(vectorization加速)

ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节是对ufldl学习笔记与编程作业:Softmax Regression(softmax回归)版本的改进. 哈哈,把向量化的写法给写出来了,尼玛好快啊.只需要2分钟,2

ufldl学习笔记和编程作业:Softmax Regression(softmax回报)

ufldl学习笔记与编程作业:Softmax Regression(softmax回归) ufldl出了新教程.感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其它机器学习的算法,能够直接来学dl. 于是近期就開始搞这个了.教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习链接:http://ufldl.stanford.edu/tutoria

ufldl学习笔记与编程作业:Softmax Regression(softmax回归)

ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习链接:http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/ softmax回归其实是逻

深度学习 Deep Learning UFLDL 最新Tutorial 学习笔记 5:Softmax Regression

Softmax Regression Tutorial地址:http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/ 从本节开始,难度开始加大了,我将更详细地解释一下这个Tutorial. 1 Softmax Regression 介绍 前面我们已经知道了Logistic Regression,简单的说就判断一个样本属于1或者0,在应用中比如手的识别,那么就是判断一个图片是手还是非手.这就是很简单的分类.事实上,我们只要把L

UFLDL 08 Softmax Regression

所谓softmax regression 是在logistic regression基础上的升级版. logistics是二分类,而softmax可以多分类. 1 logistic regression 学习softmax regression之前 我们先回归一下 logistic regression的相关知识. (参见http://blog.csdn.net/bea_tree/article/details/50432411#t6) logistic regression的函数是 他的名字虽

Deep Learning 学习笔记(一)——softmax Regression

茫然中不知道该做什么,更看不到希望. 偶然看到coursera上有Andrew Ng教授的机器学习课程以及他UFLDL上的深度学习课程,于是静下心来,视频一个个的看,作业一个一个的做,程序一个一个的写.N多数学的不懂.Matlab不熟悉,开始的时候学习进度慢如蜗牛,坚持了几个月,终于也学完了.为了避免遗忘,在这里记下一些内容.由于水平有限,Python也不是太熟悉,英语也不够好,有错误或不当的地方,请不吝赐教. 对于softmax背后的理论还不是很清楚,不知道是来自信息论还是概率.不过先了解个大

广外第二周的实验报告来这里分享一下

虽然有很多还不知道怎么改,可能也有很多测试不到的地方,但是通过这个星期我好歹了解了好多东西啊 实验报告 通过本次学习,能了解到VC6.0.是用于将已生成的C++语言源程序代码转换为计算机能读懂的目标代码,计算机用的均是二进制代码.编辑完成后它首先生成扩展名为obj的文件(程序编译后的二进制文件),若想进行之后的链接.运行过程,必须不断修改源程序文件至完全正确. 在文件→新建→源代码这里可以新建源代码:新建→打开项目或文件中可以打开以前写过的源代码或者程序:运行→编译中即把所打源文件转换为二进制代