UFLDL实验报告3:Self-taught

Self-taught 自我学习器实验报告

1.Self-taught 自我学习实验描述

自我学习是无监督特征学习算法,自我学习意味着算法能够从未标注数据中学习,从而使机器学习算法能够获得更大数量的数据,因而更有可能取得更好的性能。在本实验中,我们将按照自我学习的步骤,使用稀疏自编码器和softmax分类器去构造一个手写数字分类器。

  1. 实现流程

    Step 1 :产生训输入和测试样本集

    Step 2 :训练稀疏自编码器

    Step 3 :提取特征

    Step 4 :训练和测试softMax分类器

    Step 5 :对测试样本集进行分类,计算准确度

    3.每步关键点及代码、注释

    Step 1 :产生输入和测试样本集

    利用loadMNISTImages.m和loadMNISTLabels.m从MNIST数据库中加载数据,注意数据文件存放的路径和名字。

    Step 2 :训练稀疏自编码器

    将没有标签的训练图像作为输入,训练稀疏自编码器,得到对应最优的权值。在该步骤中调用minFunc.m和先前实验得到的sparseAutoencoderCost.m。

    具体实现代码如下:

    % Find opttheta by running the sparse autoencoder on

    % unlabeledTrainingImages

    opttheta = theta;

    % [cost, grad] = sparseAutoencoderCost(theta, inputSize, hiddenSize, lambda, ...

    % sparsityParam, beta, unlabeledData);

    % 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,

    % sparseAutoencoderCost.m satisfies this.

    options.maxIter = 400; % Maximum number of iterations of L-BFGS to run

    options.display = ‘on‘;

    [opttheta, cost] = minFunc( @(p) sparseAutoencoderCost(p, ...

    inputSize, hiddenSize, ...

    lambda, sparsityParam, ...

    beta, unlabeledData), ...

    theta, options);

    Step 3 :提取特征

    在该步骤中调用feedForwardAutoencoder.m,计算稀疏自编码器的隐藏层单元的输出(激活值),这些输出便是我们从没有标签的训练图像中提取出来的更高阶的特征。

    在feedForwardAutoencoder.m中添加如下代码:

    % Compute the activation of the hidden layer for the Sparse Autoencoder.

    m = size(data,2);

    z2 = W1*data+repmat(b1,1,m);

    activation = sigmoid(z2);

    Step 4 :训练和测试softMax分类器

    利用先前实验得到的softmaxCost.m和softmaxTrain.m对步骤3中提取的特征和训练标签集trainLabels进行训练,得到一个多类别的分类器。

    具体实现代码如下:

    inputSize = hiddenSize;

    % C = unique(A) for the array A returns the same values as in A but with

    % no repetitions. C will be sorted.

    % a = [9 9 9 9 9 9 8 8 8 8 7 7 7 6 6 6 5 5 4 2 1]

    % c = unique(a) -> c = [1 2 4 5 6 7 8 9]

    numClasses = numel(unique(trainLabels));

    lambda1 = 1e-4;

    options.maxIter = 100;

    softmaxModel = softmaxTrain(inputSize, numClasses, lambda1, ...

    trainFeatures, trainLabels, options);

    Step 5 :对测试样本集进行分类,计算准确度

    调用先前实验得到的softmaxPredict.m对测试样本集进行预测,计算准确度。具体实现代码如下:

    [pred] = softmaxPredict(softmaxModel, testFeatures);

  2. 实验结果及运行环境

    我们可以看到隐藏层单元学习提取到了类似图像边缘的高阶特征。

    训练准确度:

    Test Accuracy:98.247284%

    与Lecture Note给出的98.3%基本相符

    训练样本耗时:

    Elapsed time is 2955.575443 seconds.

    约50分钟。

    运行环境

    处理器: 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)

  3. 附录:稀疏自编码器的部分关键代码与解释

    隐藏层单元输出(activation)的表达式如下:

    也可以表示为:

    矢量化表达式如下

    这个步骤称为前向传播forward propagation,更一般的,对神经网络中的l层和l+1层,有:

    成本函数由三项构成:

    其中

    算法通过迭代,尽量使

    用反向传播(Backward propagation)算法计算预测误差,需要用到成本函数的梯度,其表达式如下:

    算法调用minFunc()更新参数W,b,以便得到更好的预测模型。

    实现矢量化的关键是了解各变量的维度大小,各变量维数大小如下:

    关键实现代码如下:

    function [cost,grad] = sparseAutoencoderCost(theta, visibleSize, hiddenSize, ...

    lambda, sparsityParam, beta, data)

    %% ---------- YOUR CODE HERE --------------------------------------

    [n,m] = size(data); % m is the number of traning set,n is the num of features

    % forward algorithm

    % B = repmat(A,M,N) -> replicate and tile an array->MxN

    % b1 -> b1 row vector 1xm

    z2 = W1*data+repmat(b1,1,m);

    a2 = sigmoid(z2);

    z3 = W2*a2+repmat(b2,1,m);

    a3 = sigmoid(z3);

    % compute first part of cost

    Jcost = 0.5/m*sum(sum((a3-data).^2));

    % compute the weight decay

    Jweight = 1/2* lambda*sum(sum(W1.^2)) + 1/2*lambda*sum(sum(W2.^2));

    % compute the sparse penalty

    % sparsityParam(rho): The desired average activation for the hidden units

    % rho(rho^) : the actual average activation of hidden unit

    rho = 1/m*sum(a2,2);

    Jsparse = beta * sum(sparsityParam.*log(sparsityParam./rho)+...

    (1-sparsityParam).*log((1-sparsityParam)./(1-rho)));

    % the complete cost function

    cost = Jcost + Jweight + Jsparse;

    % backward propagation

    % compute gradient

    d3 = -(data-a3).*sigmoidGradient(z3);

    % since we introduce the sparsity term--Jsparse in cost function

    extra_term = beta*(-sparsityParam./rho+(1-sparsityParam)./(1-rho));

    % add the extra term

    d2 = (W2‘*d3 + repmat(extra_term,1,m)).*sigmoidGradient(z2);

    % compute W1grad

    W1grad = 1/m*d2*data‘ + lambda*W1;

    % compute W2grad

    W2grad = 1/m*d3*a2‘+lambda*W2;

    % compute b1grad

    b1grad = 1/m*sum(d2,2);

    % compute b2grad

    b2grad = 1/m*sum(d3,2);

时间: 2024-12-22 06:51:31

UFLDL实验报告3:Self-taught的相关文章

UFLDL实验报告1: Softmax Regression

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

UFLDL实验报告2:Sparse Autoencoder

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

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

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

2062326 齐力锋 实验四《Java面向对象程序设计Android开发》实验报告

北京电子科技学院(BESTI) 实 验 报 告 课程: 程序设计与数据结构  班级: 1623  姓名: 齐力锋 学号: 20162326 成绩: 指导教师: 娄嘉鹏/王志强 实验日期: 2017年5月26日 实验密级:非密级 预习程度: 优良 实验时间: 2 Hours 仪器组次: 必修/选修: 必修 实验序号: 04 实验名称:Java面向对象程序设计Android开发 实验内容 1.Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBI

词法分析实验报告

词法分析实验报告 一.        实验目的 编制一个词法分析器,通过该词法分析程序的设计实例,进一步了解词法分析程序构造的一些细节. 二.        实验内容和要求 实验内容: 对字符串表示的源程序,从左到右进行扫描和分解.根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用,若发现词法错误,则返回出错信息. 实验要求: 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三. 实验方法.步骤及结果测试 源程序名:压缩包文件(rar或zip)中源程序

DAY01 WINDOWS 实验报告

DAY 01   Windows 实验一 实验名称:虚拟机的安装以及win7系统的安装 实验描述:学习安装虚拟机,以及安装不同的系统,可以满足用户不同时期的不同的需求 实验步骤: 步骤1:点击开始-选择vmware文件夹-点击Vmware Workstation                             步骤2:点击文件-新建虚拟机-下一步-选择客户机操作系统和版本-选择虚拟机安装位置-设置虚拟机的处理器.内存等信息-完成虚拟机裸机的安装 步骤3:点击编辑虚拟器-双击CD/DVD(

DAY02 WINDOWS 实验报告

实验一 实验名称: ghost做系统的备份与还原 实验描述:对系统进行备份,可以使用户在电脑中病毒或出故障后,可以还原到一个比较纯净的系统环境 实验步骤: 步骤1:点击编辑虚拟机设置-CD/DVD-选择镜像文件-选择超级急救箱 步骤2:启动虚拟机-进入资源管理器-运行超级急救箱安装文件 步骤3:重启系统-选择超级急救箱-选择ghost32 for winpe 步骤4:进入PE系统以后,点击ghost32程序-选择local->partition->To image-下一步-选择要备份的分区-选

数据结构与算法 第四次实验报告 图

数据结构与算法 第四次实验报告 姓名:许恺 学号:2014011329 班级:计算机14-1     中国石油大学(北京)计算机科学与技术系 1.图的定义,文件为"Graph.h" #ifndef GRAPH_H//定义头文件 #define GRAPH_H #include<string>//引入标准库中的头文件 using namespace std; const int MaxSize=12; struct ArcNode//定义边表结点 { int adjvex;/

《信息安全系统设计基础》第二次实验实验报告

<信息安全系统设计基础>实验二实验报告 实验报告封面 实验目的与要求 解多线程程序设计的基本原理,学习 pthread 库函数的使用. 了解在 linux 环境下串行程序设计的基本方法. 掌握终端的主要属性及设置方法,熟悉终端I /O 函数的使用.学习使用多线程来完成串口的收发处理. 熟悉linux开发环境,学会基于S3C2410的linux开发环境的配置和使用.使用linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程 实验步