LoginSignup
4
4

More than 5 years have passed since last update.

メモ(MFT2016 自動運転)

Last updated at Posted at 2016-08-11

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 を用いた機械学習チュートリアル

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4