暇人日記

アラフォーおっさんのコーセラの機械学習の課題を解こうと頑張っています!

Week3の課題をNeural Networkで解いてみる 前半

Week3の課題はTEST1とTEST2の点数と合否がデータセットで100個与えられていて、

合否の予測線を作りなさいというものでした。

 

f:id:omoshiroamericanews:20200615205330p:plain

まずNeural Networkで解くので構造を考えてみます。

 

Input layerはTest1とTest2のなので「2」ですね。

 

Output Layerは合格か不合格なので「2」としようと思いましたが、

「1」にします。

合格でなければ不合格なので「1」についての的中率の裏返しが

不合格の的中率と考えました。

 

Hidden layerは1つとして5個の要素がある設定にします。

 

絵にするとこうです↓

 

f:id:omoshiroamericanews:20200617215131p:plain

 

Theta1は3X5です。

Theta2は6X1です。

 

Yは100x1のベクトルで、output layerを「1」にしているので

このままでいいです。  

 

これとfeed forwardで計算した100x1の予測を突き合わせてNeural Networkしてみたいと思います。

 

まず、Week3のデータをロードします。

data = load('ex2data1.txt')
X = data(:,[1 2])
y = data(:,3)

m = size(X, 1)

 

FeedforwardのTheta1とTheta2を作ります。

Theta1とTheta2を1直線にしたnn_paramsは5X3=15と6X1=6の

合計の21になるようします。


X= [ones(m, 1) X]

nn_params=rand(1,size(X,2)*hidden_layer_size +(hidden_layer_size +1)*num_labels)

Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
hidden_layer_size, (input_layer_size + 1))
Theta2 = reshape(nn_params*1

 

Theta1とTheta2があるのでFeedForwardでoutput layerを作ります↓

f:id:omoshiroamericanews:20200617215708p:plain

 

output layerは100X1,yも100X1です。

課題の順番でいえばここでCost Functionですが、

ここで挟まなくても大丈夫でした。

課題ではnnCostFunction.mを作っていたので、ここにCost Functionの式が

必要だったんだと思います。

今回はnnCostFunction,mを流用しようと思うのでここで挟まなくても大丈夫でした。

 

続いてBackpropagationの式を組みます。

こちらも課題の式を流用します。

 

grad = [Theta1_grad(:) ; Theta2_grad(:)]

 

でgradまで表記しました。

 

本当はGradinent Checkingですが課題の式を流用してるので

あってるとして前に進んでみます。

 

nnCostFucntion.mを流用するのでfmincgの式を組みに行きます。

 

@pとnnCostFunction.mを使ってfimncgの中のcostFunctionを作りに行きます。

 

costFunction = @(p) nnCostFunction(p, ...
input_layer_size, ...
hidden_layer_size, ...
num_labels, X, y, lambda)

 

 

optionとlambdaを設定します。

options = optimset('MaxIter', 100)

lambda = 1

 

 

fmincgに必要なinitialのThetaとnnparamsを作りに行きます。

 

initial_Theta1 = randInitializeWeights(input_layer_size, hidden_layer_size)
initial_Theta2 = randInitializeWeights(hidden_layer_size, num_labels)


initial_nn_params = [initial_Theta1(:) ; initial_Theta2(:)]

 

満を持してfmincgの登場です。

[nn_params, cost] = fmincg(costFunction, initial_nn_params, options)

 

これで最適化されたθがnn_paramsという形で表現されています。

 

このままではoutput layerの予測値を計算できないので

最適化されたnn_paramsをreshapeして最適化されたTheta1とTheta2を作ります。

 

Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
hidden_layer_size, (input_layer_size + 1))

 

Theta2 = reshape(nn_params*2

 

X かける Theta1 -->sigmoid -->かけるTheta2 -->sigmoidで予測値を出します。

 

B = [ones(m, 1) X]*Theta1'
predB = sigmoid(B)
C = [ones(m, 1) predB]*Theta2'
predC=sigmoid(C)

 

D = [y predC]

でyと予測結果を並べました!

 

f:id:omoshiroamericanews:20200617221422p:plain

パット見、約20個で3つも間違えているような。。。

 

error=mean(double(predC==y))

でみたところ、0.69

 

正答率69%!?

 

低い。。。

Neural Networkだからもっと高くなると思ったのに。。。

Week3 の時の解き方fminuncでは正答率89%だったのでかなり低く感じます。

 

 

何かの間違いかと思って違う式で検証してみましたが、

E = (predC-y).^2、

sum(E)

31

差分が31あるということなのでやはり正答率は69%です。

 

layerの構成が悪いか、lambdaが悪いか、Gradinent Checkingが悪いか、

何か原因がある気がします。

 

次回検証してみます!

*1:1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
num_labels, (hidden_layer_size + 1

*2:1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
num_labels, (hidden_layer_size + 1