• 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.

    >>

     

  • 相关阅读:
    学习java随笔第五篇:流程控制
    学习java随笔第四篇:运算符
    学习java随笔第三篇:java的基本数据类型
    知识精简
    性能优化(详细)
    2,8,10,16进制转换
    前端优化35例
    性能优化
    字面量自定义事件

  • 原文地址:https://www.cnblogs.com/lvye-song/p/4029718.html
Copyright © 2020-2023  润新知