Deep Learning 學習隨記(三)續 Softmax regression練習

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

相關文章
相關標籤/搜索