暇人日記

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

Coursera Machine Learning Week4 課題 2周目⑩ -苦闘記憶-  Neural Network③

今回はNeural Networkの課題に取り組みます

 

前回までで

①ビデオの振り返り -->完了

②問題文を読む -->途中

③プログラム全体ex3_nnを読む -->やってない

④プログラム詳細predict.mを読む -->やってない

の状態でした。

 

今までで分かっている大事な点は構造が↓であることです。

f:id:omoshiroamericanews:20200407225414p:plain

もう1つ大事な点は最適thetaは既に与えられていて計算する必要がないことです。

 

問題文を読み進めます。

f:id:omoshiroamericanews:20200407225802p:plain

いつもの通りXに要素がすべて1のベクトルを足すようアドバイスされています。

aは縦一列のベクトルになるよう調整しなさいというヒントに見えます。

 

f:id:omoshiroamericanews:20200407230041p:plain

①Ove VS allの精度は94.9%だったのですが、

Neural Networkでは97.5%の精度が出ると書いてあります。

 

問題文を確認し終えたのでプログラム全体ex3_nnを読んでみます。

 

f:id:omoshiroamericanews:20200407230614p:plain

Input Layer/Hidden Layerの数が設定されています。

ここではoutput Layer = num_labelsになります。0-9の10種類の数字ですね。

 

f:id:omoshiroamericanews:20200407231001p:plain

 

One VS Allでもあった5000のうちランダムに100取り出して

10X10で表示すると書いています。

実行するとこうなりました↓

f:id:omoshiroamericanews:20200407231028p:plain

 

 

f:id:omoshiroamericanews:20200407231218p:plain

計算されている最適thetaのThata1とTheta2をLoadしています。

 

 

f:id:omoshiroamericanews:20200407231343p:plain

 

予測している場所ですが、プログラム詳細predict.mが大半の仕事をしている

ことがわかります。

 

ここで出る精度が97.5%になれば正解のはずです。

 

それではプログラム詳細predict.mを見てみます。

f:id:omoshiroamericanews:20200407231646p:plain

predict.mは

Theta1とTheta2とXがあれば、pを計算するという関数になっています。

 

f:id:omoshiroamericanews:20200408101836p:plain

ヒントがありました。

『max』を使えとあります。

これはOne VS Allを解いたときにも出てきました↓

 

Coursera Machine Learning Week4 課題 2週目⑥ -苦闘記憶- One vsALL④ - 暇人日記

 

これでプログラム詳細predict.mを読みました。

 

改めて目的を振り返ると、

手書きの数字0-9の5000のデータを機械学習で判定しなさいでした。

 

今回はNeural Networkで解きなさいという設定です。

 

Neural Networkは一般にこういう構造になっています↓

f:id:omoshiroamericanews:20200405224744p:plain

 

どうHidden Layerを設定するのかがキーですが、

今回は問題文全体に400-->25-->10と指示されています。

f:id:omoshiroamericanews:20200408103520p:plain

ので、

f:id:omoshiroamericanews:20200408103715p:plain

1つのデータに対してはこういう構造になっていることになります。

この考えを正しいことを裏付けるのがTheta1とTheta2が

f:id:omoshiroamericanews:20200408103902p:plain

と問題文で設定されていることです。

 

計算するのは1つのデータではなく、5000のデータなので

f:id:omoshiroamericanews:20200407225414p:plain

構造は↑になります。

 

最後のOutput Layerの5000X10はOne VS Allと同じ形で

『max』を使えということので、

f:id:omoshiroamericanews:20200328172148p:plain

これ↑をしたいということだと思います。

 

5000X10は↓の順番に作っていくはずです。

f:id:omoshiroamericanews:20200329122544p:plain

 

 

f:id:omoshiroamericanews:20200408105124p:plain

Xに要素がすべて1のベクトルを追加したらA1になるとあります。

m = size(X, 1)でmは5000になるので、それを利用して

A1 = [ones(m, 1) X]

とすると最初の行は完成です。

 

f:id:omoshiroamericanews:20200408105155p:plain

A1にTheta1をかけるとZ2になるとあります。

A1は5000X401でTheta1は25X401なので転置する必要があります。

 

 

f:id:omoshiroamericanews:20200408105346p:plain

Z2にSigmoidに入れて要素がすべて1のベクトルを追加したらA2になるとあるんで、


A2 = sigmoid(Z2)でSigmoidに入れます。

Z2 = [ones(m, 1) Z2]で1のベクトルを追加します。

 

このときA2は5000X26で0と1の間にいるはずです。

 

プログラムを見てみました。

f:id:omoshiroamericanews:20200408105940p:plain

5000X26でした。

 

0と1の間にいそうです。

f:id:omoshiroamericanews:20200408111144p:plain



 

A3/Z3は同じ事を繰り返しですね。

f:id:omoshiroamericanews:20200408110123p:plain

A3は5000X10になります。

 

A3で5000X10を作った後は『max』を使いますが、

それは↓にやったことと同じですね。

Coursera Machine Learning Week4 課題 2週目⑥ -苦闘記憶- One vsALL④ - 暇人日記

 

A3に『max』を使ってpを作ったので見てみました↓

 

f:id:omoshiroamericanews:20200408111332p:plain

最初の方がすべて10なのは実サンプルと同じですね。

気になっているのは精度です。

本当にOne VS Allよりいいのでしょうか!!?

 

精度の検証はこの式です↓

f:id:omoshiroamericanews:20200408111655p:plain

 

f:id:omoshiroamericanews:20200408111622p:plain

でやったところ、

f:id:omoshiroamericanews:20200408111738p:plain

でした。

 

精度97.5%なので

One VSALLの94.9%より良かったです!

 

今回はここまでです。次回頑張ります!