🔙 Back to Top

Wed Oct 16 10:10:52 JST 2013

日記

研究室に MacBook Pro 買ってもらった.すばらしく思った点は,lidを開いてから操作できるように なるまでの時間が本当に数秒だということと,ディスプレイの解像度の高さ.他はWindowsとは方向は違うものの 大きさは同じだ.Linuxを原点とした二次元平面上の話だけど.

新しいPC,殊,綺麗なディスプレイだととにかく何でも良いからプログラミングがしたくなる.

/js/neuralNetwork.js.txt

PRML上巻を少しずつ読み進めている.最も単純なニューラルネットワークだけどいろいろ解けて大変面白い

new NNするときに学習データのセット(Array)を渡して,test関数で未知データを実験する

// 学習データのセットdtを作ります
var dt = [];
for (var i=0; i<200; i++) {
  var x = Math.random()*2-1 
    , y = Math.random()*2-1;
  dt.push({xs : [x,y], t : (x*x+y*y<1 ? 1 : 0) });
  // ランダムな二次元[-1,1]*[-1,1] 上の点 がなんか円の中にあるかどうか
}
var h = new NN(2, 3, dt);
// 2入力隠れ層に3ユニットのニューラルネットワークでdtを学習

// 6つの点で実験
console.log(h.test([ 1, 1]));
console.log(h.test([-1, 1]));
console.log(h.test([1, -1]));
console.log(h.test([-1,-1]));
console.log(h.test([0,0]));
console.log(h.test([0,.5]));

これは全然うまくいかなかった
試しに隠れ層ユニットの数を増やしてみる

var h = new NN(2, 20, dt);

console.log( Math.round( h.test([ 1, 1])) );
console.log( Math.round( h.test([-1, 1])) );
console.log( Math.round( h.test([1, -1])) );
console.log( Math.round( h.test([-1,-1])) );
console.log( Math.round( h.test([0,0])) );
console.log( Math.round( h.test([0,.5])) );

// 0
// 0
// 0
// 0
// 1
// 1

これでもう巧く行った (すごい)

8個くらいでもたまに巧くいけたけど珠になんだよね

今の場合は,恣意的に学習データを作ってる以上,未知データについても 答えが自分の頭でわかるために,「うまくいかなかった」とか「うまくいった」とか 判断できるんだけど

実際の場合はどう判断してユニットの数を調整すればいいのだろうか 可視化して滑らかな曲線を描くトコロを探せばいいのかな

研究室の先輩のアドバイス ユニットの数は 入力数足す出力数の半分