UFLDL教程: Exercise:Learning color features with Sparse Autoencoders


Linear Decoders


Deep Learning and Unsupervised Feature Learning Tutorial Solutions

以三层的稀疏编码神经网络而言,在sparse autoencoder中的输出层满足下面的公式

这里写图片描述

从公式中可以看出,a3的输出值是f函数的输出,而在普通的sparse autoencoder中f函数一般为sigmoid函数,所以其输出值的范围为(0,1),所以可以知道a3的输出值范围也在0到1之间。

另外我们知道,在稀疏模型中的输出层应该是尽量和输入层特征相同,也就是说a3=x1,这样就可以推导出x1也是在0和1之间,那就是要求我们对输入到网络中的数据要先变换到0和1之间,这一条件虽然在有些领域满足,比如前面实验中的MINIST数字识别。
但是有些领域,比如说使用了PCA Whitening后的数据,其范围却不一定在0和1之间。因此Linear Decoder方法就出现了。Linear Decoder是指在隐含层采用的激发函数是sigmoid函数,而在输出层的激发函数采用的是线性函数,比如说最特别的线性函数——等值函数。此时,也就是说输出层满足下面公式:

这里写图片描述

一个 S 型或 tanh 隐含层以及线性输出层构成的自编码器,我们称为线性解码器


随着输出单元的激励函数的改变,这个输出单元梯度也相应变化。回顾之前每一个输出单元误差项定义为:

这里写图片描述

其中 y = x 是所期望的输出, 这里写图片描述 是自编码器的输出, 这里写图片描述 是激励函数.因为在输出层激励函数为 f(z) = z, 这样 f’(z) = 1,所以上述公式可以简化为

这里写图片描述

当然,若使用反向传播算法来计算隐含层的误差项时:

这里写图片描述

因为隐含层采用一个 S 型(或 tanh)的激励函数 f,在上述公式中,这里写图片描述 依然是 S 型(或 tanh)函数的导数。

这样在用BP算法进行梯度的求解时,只需要更改误差的计算公式而已,改成如下公式

这里写图片描述

这里写图片描述


实验步骤


1.初始化参数,编写计算线性解码器代价函数及其梯度的函数sparseAutoencoderLinearCost.m,主要是在sparseAutoencoderCost.m的基础上稍微修改,然后再检查其梯度实现是否正确。
2.加载数据并原始数据进行ZCA Whitening的预处理。
3.学习特征,即用LBFG算法训练整个线性解码器网络,得到整个网络权值optTheta。
4.可视化第一层学习到的特征。

linearDecoderExercise.m

%% CS294A/CS294W Linear Decoder Exercise%  Instructions
%  ------------
% 
%  This file contains code that helps you get started on the
%  linear decoder exericse. For this exercise, you will only need to modify
%  the code in sparseAutoencoderLinearCost.m. You will not need to modify
%  any code in this file.%%======================================================================
%% STEP 0: Initialization
%  Here we initialize some parameters used for the exercise.imageChannels = 3;     % number of channels (rgb, so 3)patchDim   = 8;          % patch dimension
numPatches = 100000;   % number of patchesvisibleSize = patchDim * patchDim * imageChannels;  % number of input units 
outputSize  = visibleSize;   % number of output units
hiddenSize  = 400;           % number of hidden units sparsityParam = 0.035; % desired average activation of the hidden units.
lambda = 3e-3;         % weight decay parameter       
beta = 5;              % weight of sparsity penalty term       epsilon = 0.1;         % epsilon for ZCA whitening%%======================================================================
%% STEP 1: Create and modify sparseAutoencoderLinearCost.m to use a linear decoder,
%          and check gradients
%  You should copy sparseAutoencoderCost.m from your earlier exercise 
%  and rename it to sparseAutoencoderLinearCost.m. 
%  Then you need to rename the function from sparseAutoencoderCost to
%  sparseAutoencoderLinearCost, and modify it so that the sparse autoencoder
%  uses a linear decoder instead. Once that is done, you should check 
% your gradients to verify that they are correct.% NOTE: Modify sparseAutoencoderCost first!% To speed up gradient checking, we will use a reduced network and some
% dummy patchesdebugHiddenSize = 5;
debugvisibleSize = 8;
patches = rand([8 10]);%随机产生10个样本,每个样本为一个8维的列向量,元素值为0~1
theta = initializeParameters(debugHiddenSize, debugvisibleSize); [cost, grad] = sparseAutoencoderLinearCost(theta, debugvisibleSize, debugHiddenSize, ...lambda, sparsityParam, beta, ...patches);% Check gradients
numGrad = computeNumericalGradient( @(x) sparseAutoencoderLinearCost(x, debugvisibleSize, debugHiddenSize, ...lambda, sparsityParam, beta, ...patches), theta);% Use this to visually compare the gradients side by side
disp([numGrad grad]); diff = norm(numGrad-grad)/norm(numGrad+grad);
% Should be small. In our implementation, these values are usually less than 1e-9.
disp(diff); assert(diff < 1e-9, 'Difference too large. Check your gradient computation again');% NOTE: Once your gradients check out, you should run step 0 again to
%       reinitialize the parameters
%}%%======================================================================
%% STEP 2: Learn features on small patches从pathes中学习特征
%  In this step, you will use your sparse autoencoder (which now uses a 
%  linear decoder) to learn features on small patches sampled from related
%  images.%% STEP 2a: Load patches 加载数据
%  In this step, we load 100k patches sampled from the STL10 dataset and
%  visualize them. Note that these patches have been scaled to [0,1]load stlSampledPatches.mat  %里面自己定义了变量patches的值displayColorNetwork(patches(:, 1:100));%% STEP 2b: Apply preprocessing预处理
%  In this sub-step, we preprocess the sampled patches, in particular, 
%  ZCA whitening them. 
% 
%  In a later exercise on convolution and pooling, you will need to replicate 
%  exactly the preprocessing steps you apply to these patches before 
%  using the autoencoder to learn features on them. Hence, we will save the
%  ZCA whitening and mean image matrices together with the learned features
%  later on.% Subtract mean patch (hence zeroing the mean of the patches)
meanPatch = mean(patches, 2); %注意这里减掉的是每一维属性的均值
%为什么是对每行求平均,以前是对每列即每个样本求平均呀?因为以前是灰度图,现在是彩色图,如果现在对每列平均就是对三个通道求平均,这肯定不行
patches = bsxfun(@minus, patches, meanPatch);%每一维都均值化% Apply ZCA whitening
sigma = patches * patches' / numPatches;%协方差矩阵
[u, s, v] = svd(sigma);
ZCAWhite = u * diag(1 ./ sqrt(diag(s) + epsilon)) * u';%求出ZCAWhitening矩阵
patches = ZCAWhite * patches;displayColorNetwork(patches(:, 1:100));%% STEP 2c: Learn features
%  You will now use your sparse autoencoder (with linear decoder) to learn
%  features on the preprocessed patches. This should take around 45 minutes.theta = initializeParameters(hiddenSize, visibleSize);% Use minFunc to minimize the function
addpath minFunc/options = struct;
options.Method = 'lbfgs'; 
options.maxIter = 400;
options.display = 'on';[optTheta, cost] = minFunc( @(p) sparseAutoencoderLinearCost(p, ...visibleSize, hiddenSize, ...lambda, sparsityParam, ...beta, patches), ...theta, options);% Save the learned features and the preprocessing matrices for use in 
% the later exercise on convolution and pooling
fprintf('Saving learned features and preprocessing matrices...\n');                          
save('STL10Features.mat', 'optTheta', 'ZCAWhite', 'meanPatch');
fprintf('Saved\n');%% STEP 2d: Visualize learned featuresW = reshape(optTheta(1:visibleSize * hiddenSize), hiddenSize, visibleSize);
b = optTheta(2*hiddenSize*visibleSize+1:2*hiddenSize*visibleSize+hiddenSize);
figure;
%这里为什么要用(W*ZCAWhite)'呢?首先,使用W*ZCAWhite是因为每个样本x输入网络,
%其输出等价于W*ZCAWhite*x;另外,由于W*ZCAWhite的每一行才是一个隐含节点的变换值
%而displayColorNetwork函数是把每一列显示一个小图像块的,所以需要对其转置。displayColorNetwork( (W*ZCAWhite)');

sparseAutoencoderLinearCost.m

function [cost,grad,features] = sparseAutoencoderLinearCost(theta, visibleSize, hiddenSize, ...lambda, sparsityParam, beta, data)
% -------------------- YOUR CODE HERE --------------------
% Instructions:
%   Copy sparseAutoencoderCost in sparseAutoencoderCost.m from your
%   earlier exercise onto this file, renaming the function to
%   sparseAutoencoderLinearCost, and changing the autoencoder to use a
%   linear decoder.
% -------------------- YOUR CODE HERE --------------------                                    %计算线性解码器代价函数及其梯度
% visibleSize:输入层神经单元节点数   
% hiddenSize:隐藏层神经单元节点数  
% lambda: 权重衰减系数 
% sparsityParam: 稀疏性参数
% beta: 稀疏惩罚项的权重 
% data: 训练集 
% theta:参数向量,包含W1、W2、b1、b2W1 = reshape(theta(1:hiddenSize*visibleSize), hiddenSize, visibleSize);
W2 = reshape(theta(hiddenSize*visibleSize+1:2*hiddenSize*visibleSize), visibleSize, hiddenSize);
b1 = theta(2*hiddenSize*visibleSize+1:2*hiddenSize*visibleSize+hiddenSize);
b2 = theta(2*hiddenSize*visibleSize+hiddenSize+1:end);% Loss and gradient variables (your code needs to compute these values)
m = size(data, 2); % 样本数量%% ---------- YOUR CODE HERE --------------------------------------
%  Instructions: Compute the loss for the Sparse Autoencoder and gradients
%                W1grad, W2grad, b1grad, b2grad
%
%  Hint: 1) data(:,i) is the i-th example
%        2) your computation of loss and gradients should match the size
%        above for loss, W1grad, W2grad, b1grad, b2grad% z2 = W1 * x + b1
% a2 = f(z2)
% z3 = W2 * a2 + b2
% h_Wb = a3 = f(z3)z2 = W1 * data + repmat(b1, [1, m]);
a2 = sigmoid(z2);
z3 = W2 * a2 + repmat(b2, [1, m]);
a3 = z3;rhohats = mean(a2,2);
rho = sparsityParam;
KLsum = sum(rho * log(rho ./ rhohats) + (1-rho) * log((1-rho) ./ (1-rhohats)));squares = (a3 - data).^2;
squared_err_J = (1/2) * (1/m) * sum(squares(:));              %均方差项
weight_decay_J = (lambda/2) * (sum(W1(:).^2) + sum(W2(:).^2));%权重衰减项
sparsity_J = beta * KLsum;                                    %惩罚项cost = squared_err_J + weight_decay_J + sparsity_J;%损失函数值% delta3 = -(data - a3) .* fprime(z3);
% but fprime(z3) = a3 * (1-a3)
delta3 = -(data - a3);
beta_term = beta * (- rho ./ rhohats + (1-rho) ./ (1-rhohats));
delta2 = ((W2' * delta3) + repmat(beta_term, [1,m]) ) .* a2 .* (1-a2);W2grad = (1/m) * delta3 * a2' + lambda * W2;   % W2梯度
b2grad = (1/m) * sum(delta3, 2);               % b2梯度
W1grad = (1/m) * delta2 * data' + lambda * W1; % W1梯度
b1grad = (1/m) * sum(delta2, 2);               % b1梯度%-------------------------------------------------------------------
% Convert weights and bias gradients to a compressed form
% This step will concatenate and flatten all your gradients to a vector
% which can be used in the optimization method.
grad = [W1grad(:) ; W2grad(:) ; b1grad(:) ; b2grad(:)];%-------------------------------------------------------------------
% We are giving you the sigmoid function, you may find this function
% useful in your computation of the loss and the gradients.
function sigm = sigmoid(x)sigm = 1 ./ (1 + exp(-x));
endend

displayColorNetwork.m

function displayColorNetwork(A)% display receptive field(s) or basis vector(s) for image patches
%
% A         the basis, with patches as column vectors% In case the midpoint is not set at 0, we shift it dynamically
if min(A(:)) >= 0 A = A - mean(A(:));%0均值化
endcols = round(sqrt(size(A, 2)));% 每行大图像中小图像块的个数channel_size = size(A,1) / 3;
dim = sqrt(channel_size);% 小图像块内每行或列像素点个数
dimp = dim+1;
rows = ceil(size(A,2)/cols);% 每列大图像中小图像块的个数
B = A(1:channel_size,:);% R通道像素值
C = A(channel_size+1:channel_size*2,:);% G通道像素值
D = A(2*channel_size+1:channel_size*3,:);% B通道像素值
B=B./(ones(size(B,1),1)*max(abs(B)));% 归一化
C=C./(ones(size(C,1),1)*max(abs(C)));
D=D./(ones(size(D,1),1)*max(abs(D)));
% Initialization of the image
I = ones(dim*rows+rows-1,dim*cols+cols-1,3);%Transfer features to this image matrix
for i=0:rows-1for j=0:cols-1if i*cols+j+1 > size(B, 2)breakend% This sets the patchI(i*dimp+1:i*dimp+dim,j*dimp+1:j*dimp+dim,1) = ...reshape(B(:,i*cols+j+1),[dim dim]);I(i*dimp+1:i*dimp+dim,j*dimp+1:j*dimp+dim,2) = ...reshape(C(:,i*cols+j+1),[dim dim]);I(i*dimp+1:i*dimp+dim,j*dimp+1:j*dimp+dim,3) = ...reshape(D(:,i*cols+j+1),[dim dim]);end
endI = I + 1;% 使I的范围从[-1,1]变为[0,2]
I = I / 2;% 使I的范围从[0,2]变为[0, 1]
imagesc(I); 
axis equal% 等比坐标轴:设置屏幕高宽比,使得每个坐标轴的具有均匀的刻度间隔
axis off% 关闭所有的坐标轴标签、刻度、背景end

参考文献


Exercise:Learning color features with Sparse Autoencoders

Deep learning:十七(Linear Decoders,Convolution和Pooling)

线性解码器

吴恩达 Andrew Ng 的公开课

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UFLDL教程:Exercise:Convolution and Pooling

Deep Learning and Unsupervised Feature Learning Tutorial Solutions CNN的基本结构包括两层 其一为特征提取层&#xff0c;每个神经元的输入与前一层的局部接受域相连&#xff0c;并提取该局部的特征。一旦该局部特征被提取后&#xff0c;它与其它特征间的位置关系也随之确…

莫凡机器学习课程笔记

怎样区分好用的特征 避免无意义的信息避免重复性的信息避免复杂的信息 激活函数的选择 浅层神经网络&#xff0c;可以随便尝试各种激活函数 深层神经网络&#xff0c;不可随机选择各种激活函数&#xff0c;这涉及到梯度爆炸和梯度消失。&#xff08;给出梯度爆炸和梯度消失的…

UFLDL教程:数据预处理

数据预处理是深度学习中非常重要的一步&#xff01;如果说原始数据的获得&#xff0c;是深度学习中最重要的一步&#xff0c;那么获得原始数据之后对它的预处理更是重要的一部分。 一般来说&#xff0c;算法的好坏一定程度上和数据是否归一化&#xff0c;是否白化有关。 数据归…

深度学习笔记(待续)

背景知识 好的特征应具有不变性&#xff08;大小、尺度和旋转等&#xff09;和可区分性&#xff09;&#xff1a;例如Sift的出现&#xff0c;是局部图像特征描述子研究领域一项里程碑式的工作。由于SIFT对尺度、旋转以及一定视角和光照变化等图像变化都具有不变性&#xff0c;并…

人工智能泰斗迈克尔·乔丹分享机器学习要义:创新视角,直面挑战

2017年6月21日至22日&#xff0c;腾讯云未来峰会在深圳举行。人工智能领域的世界级泰斗迈克尔欧文乔丹&#xff08;Michael I.Jordan&#xff09;进行了主题为“机器学习&#xff1a;创新视角&#xff0c;直面挑战”的演讲&#xff0c;与大家分享他对人工智能的未来与挑战的见解…

Tensorflow官方文档---起步 MNIST示例

Tensorflow •使用图 (graph) 来表示计算任务. • 在被称之为 会话 (Session) 的上下文 (context) 中执行图. • 使用 tensor 表示数据. • 通过 变量 (Variable) 维护状态. • 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据 综述 Ten…

Git 版本管理

相关文章 版本管理 github访问太慢解决方案 Material for git workshop GitHub秘籍 安装-Git版本管理 Git官网安装说明 Linux 系统安装 # 如果你的 Linux 是 Ubuntu: $ sudo apt-get install git-all# 如果你的 Linux 是 Fedora: $ sudo yum install git-all 如果是其他…

tensorflow:Multiple GPUs

深度学习theano/tensorflow多显卡多人使用问题集 tensorflow中使用指定的GPU及GPU显存 Using GPUs petewarden/tensorflow_makefile tf_gpu_manager/manager.py 多GPU运行Deep Learning 和 并行Deep Learning&#xff08;待续&#xff09; Multiple GPUs 1. 终端执行程序…

Tensorflow一些常用基本概念与函数

参考文献 Tensorflow一些常用基本概念与函数 http://www.cnblogs.com/wuzhitj/archive/2017/03.html Tensorflow笔记&#xff1a;常用函数说明&#xff1a; http://blog.csdn.net/u014595019/article/details/52805444 Tensorflow一些常用基本概念与函数&#xff08;1&#…

ubuntu16.04 Nvidia 显卡的风扇调速及startx的后果

问题描述 #查看nvdia GPU 显卡状态 watch -n 10 nvidia-smi 发现显卡Tesla k40c的温度已经达到74&#xff0c;转速仅仅只有49%。 查看Tesla产品资料&#xff0c;Tesla K40 工作站加速卡规格 &#xff0c;可知 所以需要调整风扇速度来降温。 然而官方驱动面板里也没有了风扇调…

Python函数式编程-map()、zip()、filter()、reduce()、lambda()

三个函数比较类似&#xff0c;都是应用于序列的内置函数。常见的序列包括list、tuple、str map函数 map函数会根据提供的函数对指定序列做映射。 map函数的定义&#xff1a; map(function, sequence[, sequence, ...]) -> list map()函数接收两个参数&#xff0c;一个是函…

Kaggle : Using a Convolutional Neural Network for classifying Cats vs Dogs

数据下载 https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/data Part 1 - Preprocessing #Package Requirements #!/usr/bin/python2 # -*- coding: UTF-8 -*- import cv2 # working with, mainly resizing, images import numpy as np …

李宏毅机器学习课程1~~~Introduction Regression

机器学习介绍 机器学习就是要找一个函数。 机器学习的三大要素框架&#xff1a;训练集&#xff0c;函数集&#xff08;模型集&#xff09;&#xff0c;损失函数集。 机器学习图谱 AI训练师的成长之路。 1. 梯度下降法的理解Gradient Descent 参数变化的方向就是损失函数减少的方…

李宏毅机器学习课程2~~~误差从哪里来?

Stanford机器学习—第六讲. 怎样选择机器学习方法、系统 误差来源 误差主要来自于偏差和方差。 数学上定义&#xff1a; 通过covariate X 预测 Y &#xff0c;我们假设存在如下关系&#xff1a; Y f(X) ϵ 满足正态分布均值为0 方差σϵ 模型预测错误定义为&#xff1a; …

李宏毅机器学习课程3~~~梯度下降法

梯度下降法描述 梯度下降法是为了找到最优的目标函数&#xff0c;寻找的过程就是沿着损失函数下降的方向来确定参数变化的方向。参数更新的过程就是一个不断迭代的过程&#xff0c;每次更新参数学到的函数都会使得误差损失越来越小&#xff0c;也就是说学习到的参数函数越来越逼…

李宏毅机器学习课程4~~~分类:概率生成模型

分类问题用回归来解决&#xff1f; 当有右图所示的点时&#xff0c;这些点会大幅改变分类线的位置。这时候就会导致整体的回归结果变差。当把多分类当成回归问题&#xff0c;类别分别为1&#xff0c;2,3,4……&#xff0c;因为回归的问题是预测具体的值&#xff0c;这样定义类别…

李宏毅机器学习课程5~~~分类:逻辑回归

Function Set 不同的w&#xff0c;b来确定不同的函数&#xff0c;这样就组成了函数集合&#xff0c;不同的w&#xff0c;b可以来表达不同的分布函数。 Good of a Function 变换表达形式 两个Bernoulli distribution的交叉熵。所谓交叉熵&#xff0c;是用来刻画两个分布的相似性…

李宏毅机器学习课程6~~~深度学习入门

深度学习历史 深度学习经典步骤 神经网络的符合标记含义 Wij 代表的是从神经元&#xff4a;到神经元&#xff49;&#xff0c;这样写的目的是便于表达&#xff0c;否则最后的表达式子就是Wij的转置&#xff0c;细节见下面。 每个神经元的偏执值组成一个向量&#xff42; 单个神…

李宏毅机器学习课程7~~~反向传播

到底为什么基于反向传播的纯监督学习在过去表现不佳&#xff1f;Geoffrey Hinton总结了目前发现的四个方面问题&#xff1a; 带标签的数据集很小&#xff0c;只有现在的千分之一. 计算性能很慢&#xff0c;只有现在的百万分之一. 权重的初始化方式笨拙. 使用了错误的非线性模型…

李宏毅机器学习课程8~~~keras

keras keras示例 确定网络结构 确定损失函数 确定训练网络参数 batchsize与运算时间&#xff0c;平行运算&#xff0c;可以缩简运算时间。batchsize不能太大&#xff0c;这是由于内存的关系。此外&#xff0c;batchsize太大容易陷入局部极值点或者鞍点。batchsize&#xff1d;&…