Deep LearningでぷよぷよAIを作ってみる
https://github.com/mizusearchdemon/DeepuyoLearning
chainerrlのquickstartのネットワークそのままで試したら、やたらと2個組みを作りたがる子になってしまった。。
やるべき事は、
- 盤面を色別に分ける
- 数手前の盤面を入力に含める
- QFunctionのネットワーク構成を検討する
- GPUを使ってくれない原因を調べる
あたりかな。
強い、弱いは後回しで、とりあえず大連鎖を組ませたい。
Deep Learning: chainer環境の構築 on 64bit Windows
参考情報
公式QuickStart: Chainer: A flexible framework of neural networks
Python, gitのインストール
chainerのクローン作成
SourceTree上でクローンを作成。
- "新規/クローンを作成する"をクリック
- "元のパス/URL"に https://github.com/pfnet/chainer を入力
- "保存先のパス"に保存したいディレクトリを指定 (ここではD:\chainer)
- "クローン"をクリック
コマンドラインで以下を実行
C:\Users\****>d: D:\>cd chainer D:\chainer>python setup.py install
Microsoft Visual C++ が無いって怒られる。表示されたURLにアクセスしてインストール。
もう一度
D:\chainer>python setup.py install (snip) Installed d:\python27\lib\site-packages\numpy-1.9.2-py2.7-win-amd64.egg Finished processing dependencies for chainer==1.0.0
終わるまでに10分弱かかる。必要なモジュールも全部入れてくれる・・・と思ったけどそうでも無かった。追加で以下のモジュールをインストールする。
- Python Extension Packages for Windows - Christoph Gohlke
scipy‑0.16.0b2‑cp27‑none‑win_amd64.whl
numpy‑1.9.2+mkl‑cp27‑none‑win_amd64.whl- pip でインストール。pipの新しいバージョンがあるといわれたのでついでにupgradeしておく。
D:\>pip install --upgrade pip D:\>pip install numpy-1.9.2+mkl-cp27-none-win_amd64.whl
D:\>pip install scipy-0.16.0b2-cp27-none-win_amd64.whl
exampleの実行
chainerについてくるexampleを実行する。sklearn.datasetsモジュールが必要といわれるのでscikit-learnをインストール。
D:\chainer>pip install scikit-learn Collecting scikit-learn Downloading scikit_learn-0.16.1-cp27-none-win_amd64.whl (3.1MB) 100% |################################| 3.1MB 119kB/s Installing collected packages: scikit-learn Successfully installed scikit-learn-0.16.1
準備が整ったので実行する。
D:\chainer>python examples\mnist\train_mnist.py
裏でデータをダウンロードしているので初回は少し時間がかかる。"epoch 1"と表示される前に間違ってキャンセルすると、"IOError: could not read bytes"とエラーが出る。 中途半端なキャッシュデータが残っているので削除する。
C:\Users\****\scikit_learn_data\mldata\mnist-original.mat
2回目を実行すると、Core 2 Quad (Q9650)で1410秒程度、Core i5-4590で643秒程度だった。
GPU対応
グラフィックボードがかなり古いけど一応CUDA使えるので対応させる。
まずはCUDAをインストール
CUDA 7 Downloads または CUDA Toolkit 6.5- Python Extension Packages for Windows - Christoph Gohlke pycuda‑2015.1+cuda7028‑cp27‑none‑win_amd64.whl (CUDA 7.0の場合)
または
pycuda‑2014.1+cuda6514‑cp27‑none‑win_amd64.whl (CUDA 6.5の場合)D:\chainer>pip install pycuda-2015.1+cuda7028-cp27-none-win_amd64.whl または D:\chainer>pip install pycuda-2014.1+cuda6514-cp27-none-win_amd64.whl- 依存パッケージをインストール
D:\chainer>pip install chainer-cuda-deps- example実行
D:\chainer>python examples\mnist\train_mnist.py --gpu 0nvccのエラーが出る場合は このあたりを参照。
こちらの初回実行はnvccでのコンパイルなどの処理が入るので、"epoch 1"が表示されてから一度キャンセル。
実行時間は8800GT(古い!)で375秒程度だった。ちなみにCUDA 6.5までしか対応しておらず、間違ってCUDA 7.0を入れるといろいろとエラーが出る。
[7/29追記] CUDA 7 対応
8800GTがお亡くなりになったので、750Tiを購入。CUDA6.5からCUDA7の環境へ更新する。
CUDAはここから: CUDA 7 Downloads
あとは、CUDA6.5用のPyCUDAを消して、CUDA7用をインストールする。バージョン2015.1.2が出ていたのでそれを使う。 Python Extension Packages for Windows - Christoph Gohlke
D:\chainer>pip uninstall pycuda-2014.1+cuda6514-cp27-none-win_amd64.whl D:\chainer>pip install pycuda-2015.1.2+cuda7028-cp27-none-win_amd64.whl D:\chainer>pip install chainer-cuda-deps
実行!
D:\chainer>python examples\mnist\train_mnist.py --gpu 0
CUDA7でリコンパイルされるので初回は遅い。2回目を実行すると192秒で、8800GTの約半分に。
NVIDIA Inspector で見ていると、GPU Loadが大体40~45%までしか上がらない。
元々そのくらいしか出ないのか、まだ本気出していないのかは調べてない。
SWF関係のメモ
QWOPとか現状TASれないので、なんとかならないかなーと思い(これから)少しお勉強。
SWF File Format Specification [Adobe]
↑の日本語訳 Flash SWF Spec
ぷよぷよAI(2)
難しく考えすぎてたかな?
総当たりとか、TASっぽい思考になってた。人間的に考えよう。発火点からの計算で。
とりあえず実装してみる。
ぷよぷよAI(1)
AI=リアルタイムTAS
という流れ?で、AIにも手を出し始める。
とりあえず今の状態
まだ何も出来ないな。操作系が出来たら積み込みかな。
連鎖自体はTAS作成時にそこそこ速く処理できるようになったので、
あとは評価関数をどう作るか・・・
流れはこんな感じ?
- 設置前の状態
- 設置出来る場所
- 連鎖判定
- 評価
評価値は・・・連鎖組むためには仮想的に連鎖開始したあとの形で判定かな。。
どうやるんだろうって考えるのと同時に計算量が気になる
状態取得と操作だけの状態では30-100nsくらい。
凝視は必要だけどアルゴリズムは同じなのでおk。
後は3/4個ぷよへの対応、副砲、お邪魔処理、全消し戦、etc...
やること一杯だなw
とりあえずお勉強。
DirectX hooking
- 基本
-
- DLL injectionでd3d8.dllのexport関数をフック
-
- d3d8.hからIDirect3D8インターフェイスの関数定義の所を持ってきて、proxyクラスを作成
- フックしたDirect3DCreateの所で、オリジナル関数の返り値(IDirect3D8*)を保存しておき、代わりに自分(proxyクラス)を返す
- 同様に、IDirect3DDevice8もproxyクラス作成
- IDirect3D8のCreateDeviceでこれを作成する
ということをやってるサンプル
[C++] Direct3D hooking sample - DirectX and XNA - GameDev.net
DLLInjectionにはAPIHijackっていうソースを使ってる
APIHijackは解除はしてないので必要なら自分で
こっちにもサンプル
KENJI'S HOMEPAGE -Windows API Hooking Tutorial
Windows API Hooking Tutorial
上手く動かないことがあったんでAPIHijackの方使ってますが
- 直接フック
アセンブリ言語とデバッガを使える程度の能力が必要です
-
- d3d8.dllのメモリ空間に直書き
- 例:Presentメソッドはアドレス0x〜〜〜
- メモリのアクセス権限はVirtualQuery,VirtualProtectで変更
- 先頭5バイトをジャンプ命令で上書きし、自前のDLLの関数へジャンプさせる
- 自前関数では引数は+1個になっていて、最初の1個はselfポインタ
- 例:Present(IDirect3DDevice8* self, あと4個);
- d3d8.dllのメモリ空間に直書き
-
- 自前の関数では、とりあえずPUSHAD
- やりたい処理をする
- POPADしてからオリジナル関数の引数をPUSH(後ろからPUSHですよ)
- PUSH RETURN (次のjmpの先のラベル)
- jmp oritinal_function
- RETURN:
- MOV hReturn, EAX // 返り値を保存
- やりたい処理をする
-
- で、selfを使えばいろいろとやり放題な訳です:)