Softmax回归

Softmax回归

这次,让我们一起来做Softmax回归。首先我们先去下载。
同时,这次我们将用到 computeNumericalGradient.m这个是在我们做稀疏自编码的时候的。
在这次实验里面,我们只需要完成softmaxCost.m和softmaxPredict.m这两个文件的修改。

第0步:初始化常数和变量
这一步,系统已经自动帮我们完成了。

第1步:加载数据
我们将加载MNIST的图片和标签,把它们作为inputData和labels。图片是经过预处理成0到1之间的像素值,label0倍映射成10为了方便。当然,上面的代码也已经给出。

第2步:执行softmaxCost
这步是需要我们去完成的,我们需要实现代价函数和梯度的计算。
function [cost, grad] = softmaxCost(theta, numClasses, inputSize, lambda, data, labels)

% numClasses - the number of classes 
% inputSize - the size N of the input vector
% lambda - weight decay parameter
% data - the N x M input matrix, where each column data(:, i) corresponds to
%        a single test set
% labels - an M x 1 matrix containing the labels corresponding for the input data
%

% Unroll the parameters from theta
theta = reshape(theta, numClasses, inputSize);

numCases = size(data, 2);
%full函数是将sparse稀疏矩阵转换为全矩阵,稀疏矩阵是为了节省存储空间(只记录非0的)
%而全矩阵则是连同0项也一同记录了,全矩阵就是matlab里面一般的矩阵,两者的目的不一样
%全矩阵是为了计算方便,稀疏矩阵是为了节省存储空间
groundTruth = full(sparse(labels, 1:numCases, 1));
cost = 0;

thetagrad = zeros(numClasses, inputSize);

%% ---------- 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.
%size(theta) 10x8
%size(data) 8x100
%size(groundTruth) 10x100
%thetagrad  10x8

%第一步
M=theta*data;
%第二步,减去每一列M中的最大值,防止内存溢出
M=bsxfun(@minus,M,max(M,[],1));
%第三步
M=exp(M);
%计算p矩阵
p = bsxfun(@rdivide, M, sum(M));
%计算代价函数,别忘了权重衰减项
cost=-sum(sum(groundTruth.*log(p)))/numCases+lambda*sum(theta(:).^2)/2;
%计算梯度
thetagrad=(-1/numCases)*(groundTruth-p)*data'+lambda*theta;
% ------------------------------------------------------------------
% Unroll the gradient matrices into a vector for minFunc
grad = [thetagrad(:)];
end
第3步:梯度检验
做这一步的时候,我们得把SoftmaxExercise.m文件里面的Debug改成false,意思是不再调试。(否则会出错)
梯度检验这一代码,SoftmaxExercise.m里面已经帮我们写好。

第4步:学习的系数
其实这里的系数,SoftmaxExercise.m里面默认已经帮你弄好了。

第5步:测试
我们将会用MNIST的训练集来进行测试。我们先来改一下
function [pred] = softmaxPredict(softmaxModel, data)

% softmaxModel - model trained using softmaxTrain
% data - the N x M input matrix, where each column data(:, i) corresponds to
%        a single test set
%
% Your code should produce the prediction matrix 
% pred, where pred(i) is argmax_c P(y(c) | x(i)).
 
% Unroll the parameters from theta
theta = softmaxModel.optTheta;  % this provides a numClasses x inputSize matrix
pred = zeros(1, size(data, 2));

%% ---------- YOUR CODE HERE --------------------------------------
%  Instructions: Compute pred using theta assuming that the labels start 
%                from 1.

%p不是概率,但是和概率是正相关的
p = theta*data;
%得到p最大的位置的所在下标
[junk, idx] = max(p, [], 1);

pred = idx;






% ---------------------------------------------------------------------

end
这时候,我们就可以来运行一下程序了。
运行结果


我运行了几次,差不多每次都是92%到92.6%之间,如果你的数据在99%以上,或者明显小于90%,那你应该好好检查一下代码有没有问题。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值