上一篇讲的Softmax regression,当时时间不够,没把练习作完。这几天学车有点累,又特别想动动手本身写写matlab代码php
因此等到了如今,这篇文章就当作上一篇的续吧。编程
回顾:框架
上一篇最后给出了softmax regression的代价函数和其偏导数,固然要实现的话基本也就是这两个函数的实现,为方便查看,这里再写一遍:ide
代价函数:函数
偏导数:spa
实现:code
实现过程就是对MNIST手写数字库进行的分类(数字从0~9共10个)。blog
说实话,上面代价函数对于我这matlab用的不熟的人来讲,着实吓了一跳,好在看了讲义,里面真是深刻浅出啊,至关于手把手教咱编程啊,太赞了~ci
讲义里给出了代码的基本框架,咱们只需填几个地方就行,主要就是上面代价函数和偏导数部分的实现,并且这部分实现的一些小技巧讲义里面也告诉咱们了。io
上面这两个函数的代码实现就几行,是在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 = theta*data; NorM = bsxfun(@minus, M, max(M, [], 1)); %归一化,每列减去此列的最大值,使得M的每一个元素不至于太大。 ExpM = exp(NorM); P = bsxfun(@rdivide,ExpM,sum(ExpM)); %几率 cost = -1/numCases*(groundTruth(:)'*log(P(:)))+lambda/2*(theta(:)'*theta(:)); %代价函数 thetagrad = -1/numCases*((groundTruth-P)*data')+lambda*theta; %梯度
关于其中bsxfun的用法,是讲义给出的,果真好用的多。
另一个须要咱们本身填写的地方就是softmaxPredict.m:
%% ---------- YOUR CODE HERE -------------------------------------- % Instructions: Compute pred using theta assuming that the labels start % from 1. M = theta*data; %pred = max(M,[],1); [Y,pred] = max(M,[],1);
这里一开始写错了,pred取的是每一列的最大值了(pred = max(M,[],1)),应该取行号(表明的是10个数字中几率最大的那个数字)而后跟label对比求正确率。
而后就是结果:
迭代了100次达到上限,结束,最后的正确率是92.250%。
ps:
讲义地址:http://deeplearning.stanford.edu/wiki/index.php/Exercise:Softmax_Regression
里面有手写数字库等须要下载。
另外,这代码选项里怎么没有matlab啊,看着那个转置符号变成那样很不爽。。。