上一篇講的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啊,看着那個轉置符號變成那樣很不爽。。。