utsurigi.net

dvorak練習中: e-typing Good! 284pt 300kpm 3日休んだら大分落ちた

憂鬱気分

著者近影

あわせて読みたい

カレンダー

2010 年 9 月
« 8 月    
 1234
567891011
12131415161718
19202122232425
2627282930  

カテゴリー

アニメ公式

ボードゲーム

PythonでANN…?

2009/8/28 金曜日
カテゴリー: Python, プログラミング, 雑記 — utsurigi @ 5:22:41

ここ数日はまだ8月というのに日中30度に達しないことが多く、やけに涼しい。夜はひょっとすると肌寒いくらいで、暑さボケした脳味噌もクールダウンする季節に近づきつつある。
広がりだしたらしい新型インフルエンザとかが俄然蔓延しそうなのが怖いが。

過ごしやすい季候になったのもあって、修論をクリアするだけの頭脳に到達すべく細々と勉強中。
高校卒業以来ろくに頭を回していないせいか、もう神経が死に絶えて取り返しがつかないことになっている気がするけど…

で、勉強の一貫としてちょっとRNNとかやってみちゃおうかな、と思ってPythonのANNライブラリを探してみた。ニューラルネット自体もそうだけど、反復処理が高速化するとかいうpyscoを使ったことがなかったので、ちょうど良い練習台になりそう。

しかしどうも微分方程式で挙動を設定できる凄そうなライブラリは一杯あるけど、単純な用途にはどれが良いのかよく分からん。

PyNN - Tracというのが複数のNNシミュレータを透過的に扱えるAPIで、実装としてはBrianとかNEURON、NESTなどがあるとか。
これらは妙に精巧なモデルを使ったシミュレーションに力を入れているようで、単純化した機械学習用には重い気がする。BPといった学習アルゴリズムも実装されてなさそうだし。(自分で書けば良いんだが)

単なる3層フィードフォワードネットワーク+BPならbpnn.pyというのがあるようだし、それこそ自分で即書けるけど、RNNにそのまま適用できるんだろうか。
FANNというのは多くの言語でラッパーがあるらしいし、ちょうど良いかもしれない。

でも学習なんて計算量の多いことをするには現在のAthlon64X2 5200+(しかも兼NAS/VMware host)には荷が重そうだ。PhenomIIとかで計算用マシン組みたいなあ。

GPちょっとよくなった

2009/7/27 月曜日
カテゴリー: プログラミング — utsurigi @ 1:19:11

部分木の入れ替えミスってた。
直したら3次関数を40回くらいでだいたい同定できるように。


最大ノード長で一律に切ってるので、これ以上続けてもたいして変わらない感じ。

でもsinとかだとなかなか収束しない。84回でこれ。

あとゲーム(ブラフ)のコンピュータ・人対戦を書いた。これってどうやってGPに落とし込めるんだろう…

行動を要素にしてif的に書くか、あるいは可能な行動に対するスコア関数の最適化かで大きく違いそう。ブラフってのはプレーヤ数n人とすると、最大で6*n*5通りくらいしか可能な行動がないのでやりやすいと思っていたんだが、そうでもないかも…

関数の値は行動とする場合だとこんな感じか:
末端ノード: (目, 数)を取り敢えず(x, y)とする, 目を増やす/減らす、数を増やす/減らす
非末端ノード: p人前の宣言した目がxであり自分がxをm個以上持っている, p人前の宣言した目がxであり、自分がx+x’をm個以上持っている、if A then B else C、A then B、…

なんか無茶だ。というかコレで不可能な手を提案されたらやり直すのも困る。やはり可能な行動に対して価値をつける方向でやるべきかな。それなら強化学習で良いような気もするが…

そうすると関数の値はその手を選ぶ価値。
末端ノード: 目、数、定数、p人前の目、p人前の数、p人前のダイス数、自分のダイス数、自分の目xの数、…
非末端:四則演算と、おまけによく使いそうなステップ関数くらい
でいけるかな?

今Pythonで書き殴ったGPライブラリがあまりに非効率かつ汚いので、綺麗にしてから考えよう。

Python+(py)Graphviz+GeneticProgramming

2009/7/26 日曜日
カテゴリー: Linux, Python, プログラミング — utsurigi @ 20:32:03

グラフ描画ライブラリGraphvizの練習中。
dot言語(vimのsyntaxに含まれている!)で簡単にグラフが書ける。


digraph {
graph [bb="0,0,0,0"];
node [label="\N"];
147599756 [label="*"];
147599852 [label=X];
147599756 -> 147599852;
147599820 [label="+"];
147599756 -> 147599820;
147599916 [label=X];
147599820 -> 147599916;
147599884 [label="-"];
147599820 -> 147599884;
147599980 [label="C -3.232840"];
147599884 -> 147599980;
147600204 [label="+"];
147599884 -> 147600204;
147600300 [label="C 5.583178"];
147600204 -> 147600300;
147600268 [label="/"];
147600204 -> 147600268;
147600364 [label="*"];
147600268 -> 147600364;
147600332 [label=X];
147600268 -> 147600332;
147600460 [label=X];
147600364 -> 147600460;
147702604 [label="-"];
147600364 -> 147702604;
147703212 [label="/"];
147702604 -> 147703212;
147703340 [label="C -2.826460"];
147702604 -> 147703340;
147703244 [label=X];
147703212 -> 147703244;
147703276 [label="C -1.359222"];
147703212 -> 147703276;
}

これが

こんなのになる。

ちなみに上のグラフはGraphvizをPythonから操作するpyGraphvizを使って、遺伝的プログラミングでx*x-8*xの関数同定を行った結果を出力したもの。(打ち切りとかはまともにやらずに目算)

木を自動的にGraphvizに落とすには、ノードを一意に識別するためにPythonの組み込み関数idを使う。(要はポインタのアドレス)
今まであまり必要としたことがなかったので、調べるまで知らなかった。

ボードゲームのコンピュータ側の思考をGPで自動化しようと思って書き始めたものの、上の簡単な例でも結構重いので本格的に使うには不安…

C# 再び 能率の上がらない日々

2008/10/14 火曜日
カテゴリー: C#, 雑記 — utsurigi @ 0:11:44

秋も深まり、研究やら趣味のプログラミングやらが充実するかと思いきや、毎日だるくて寝てばかり。久々にC#を弄ったら全然書けなくなっていて驚きました。クラス・メソッド・メンバ変数・ローカル変数・引数の命名規則がごちゃごちゃで頭が痛い。

しばらく離れていたうちにC#もバージョンアップしたらしく、最近のはラムダ式まで使えて、(x, y) => x+yなんて表記で匿名関数が作れてしまうようです。
型推論が働いて、引数や戻り値の型を指定しなくてもだいたい上手く行くのが良い。

リハビリにと、以下の記事を読んでいます。
C# による L2 Lisp の実装
ぱっと見綺麗に実装されているようで、何かと参考になりそうです。

もう10年くらいプログラム書いててこの程度というのが笑えますが、趣味で勉強できる時間もそう残っていないので、色々効率よく進めたいところ。

OpenCVで視線検出 (虹彩検出編)

2008/10/13 月曜日
カテゴリー: Python, 画像処理 — utsurigi @ 2:56:20

せっかく割と高いウェブカメラを買ったので、視線検出でもしてみようと思い立ち、まずは虹彩を検出してみました。

(モノクロで見にくいですが、虹彩の周りの太い円が検出結果)

処理の流れとしては

  1. cvQueryFrameでキャプチャ
  2. 1/8縮小画像にてcvHarrDetectObjectsを用いて顔検出
  3. 最大の検出領域を顔と推定して、その矩形の左上1/4、右上1/4をそれぞれ左目、右目が含まれると推定
  4. 各々の目を含む画像でグレースケール化、cvAdaptiveThresholdの後ハフ変換で円を検出。cvHoughCirclesは半径の大きい方から列挙していくので、今回の目的からすれば不適当ですが、まあ実験ということで。
  5. 列挙された円でそれが完全に元画像に収まるもののうち、もっとも小さいものを虹彩輪郭と推定

パラメタは

cvAdaptiveThreshold(eye1, eye2, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 9, 15)
cvHoughCircles(eye2, storage, CV_HOUGH_GRADIENT, 1, 20, 20, 10, 4, 40)

でまあそこそこ上手く行っている。もちろん本当は顔のサイズから虹彩のあり得るサイズを推定して円のmax, minに入れるべきですが。

しかしこの程度の計算でCPUを60%くらい食う。実用的なアプリケーションは難しそうです。

久々のDLL

2007/12/6 木曜日
カテゴリー: プログラミング, 雑記 — utsurigi @ 3:02:52

久しぶりにWindowsのDLLを書いていて、エクスポートした関数は呼べるのに初期化に失敗する…と思ったらDllMainが呼ばれていませんでした。
extern “C”のつけ忘れのようで、なくてもgccだかldが余計な世話を焼いて作ってくれるので気づくのが遅れました。

MinGWでDLLの共有メモリを使う方法を調べたのでメモ。

static HHOOK hHook __attribute__((section("shared"), shared)) = 0;

LoadLibraryとGetProcAddressは序数値抜きで指定する方法がよく分からなかったのであきらめて-L./ -lmydll。

動画専用ディスプレイ快適です