メモ(MFT2016 自動運転)

  • 4
    いいね
  • 0
    コメント

Maker Faire Tokyo2016 機械学習を用いた自動運転についてのメモ

概要 (動画)
https://drive.google.com/open?id=0B_o9vkhBpXoYUEdaMzBiR2pMMUk

当日掲示していた資料
ppt
https://drive.google.com/open?id=0B_o9vkhBpXoYZWV0d1dsSTF3cUE

ソースコード
https://github.com/AAmmy/MFT2016
(当日使用したものは後日アップロード)

ニューラルネットワーク

前提

入力 X : 50×50 の画像を 1×2500 にしたもの
つまり $X = \{x_0, x_1, ・・・, x_{2499}\}$
$0 \leq x_i \leq 255$ は画像のそれぞれのピクセルの値 (輝度値)

出力 Y : 直進 ⇒ 0, 左 ⇒ 1, 右 ⇒ 2
つまり $Y = \{y_0, y_1, y_2\} = \{0, 1, 2\}$

重み W:ネットワークの大きさによって要素数が異なる
$\hat{y}$:作成したモデルによって予測される値

最も単純な場合

wxb

$\hat{y} = argmax(WX + b)$

W:今回は入力 2500, 出力 3 であるから, W は 2500×3 の2重配列
b:バイアス, 今回は出力 3 であるから, b はサイズ 3 の配列
WX:W と X の内積, 出力は3つ

dot
float[] WX = new float[w[0].size] // 出力の数(3つ)
for(j = 0; j < WX.size; j++)      // 3回
    for(i = 0; i < x.size; i++)   // 2500回
        WX[i] += x[i] * w[i][j]   // 積の和が内積

argmax():もっとも最大の要素を含むインデックスを求める
内積によって得られた3つの値のうち最大のものが予測される操作となる.

 argmax([3, 2, 1, 0]) ⇒ 0 (0番目の要素の3が最も大きい)
 argmax([0, 3, 2, 1]) ⇒ 1 (1番目の要素の3が最も大きい)

argmax
max = a[0]
argmax = 0
for(i = 0; i < a.size, i++)  // a をすべて見る
    if(max < a[i]){          // 現在のmaxよりも今見ているa[i]が大きいとき
        max = a[i]           // maxを更新
        argmax = i           // argmaxを更新
    }

まとめると

y_pred = argmax(dot(X, W) + b)

実際にmnistのデータとpythonで実行すると次のようになる.
ソースコード

$ ./wxb
91.64%
$ python wxb.py
92.25 %

(Cを普段書かないので全部グローバル変数なのはご了承ください)

ソースコードについて
mnist:手書き数字のデータセット.手書きの数字のデータとそれが何の数字かというラベルデータが大量に入っている.
これと学習済みの重みとバイアスを用いて WX + b により 10000 のテストデータに対して数字の予測を行った結果を表示している.
C と python での結果が微妙に異なるのは精度が異なるため(だったと思う).
重みの学習は
http://deeplearning.net/tutorial/
の Logistic Regression や Multilayer perceptron のコードを用いた.

中間層を1つつける場合

$\hat{y} = argmax(tanh(W1X + b1)W2 + b2)$
層が一つ増えるので重み W とバイアス b も増える
W1:中間層の出力数を適当に 100 とすると, 入力 2500 であるから, W1は 2500×100 の 2 重配列
b1:入力は中間層の出力 100 となるため, b1はサイズ 100 の配列
W2:入力は中間層の出力 100 , また,出力 3 となるため. W2 は 100×3 の 2 重配列
b2:入力は中間層の出力 100 となるため, b1 はサイズ 3 の配列

tanh:ハイパボリックタンジェント,

tanh = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
tanh
tanh = Math.tanh(x)
tanh(W1X+b1)
i for all input elements index     // すべての入力の要素に対して
    output[i] = tanh(input[i])     // 単純にtanhの値を求める

学習済みの重みを用いてテストデータを識別すると,
ソースコード

mlpWXb
$ python mlpWXb.py
97.97 %

参考

https://www.coursera.org/learn/machine-learning
–機械学習の講義 (日本語字幕あり)
http://deeplearning.net/tutorial/
–Theano を用いた機械学習チュートリアル