Pylearn2で三目並べのAIをつくってみる - モデルの保存と読み込み -


# はじめに
この記事は[「Pylearn2で三目並べのAIをつくってみる」](http://qiita.com/kanlkan/items/c8c537dbd55d38cb5084)の続編です。
使用しているMLPモデルや棋譜のフォーマットなどの情報が書いてあるので、前の記事をお読みいただいてから、この記事を読むことをお勧めいたします。

前の記事で
>
今後は一度のトレーニング結果を元に、任意の入力に対する次の一手を簡単に得られるようにして、三目並べのゲームに実装してみようと思います。まずは三目並べのゲームプログラムを作らねば。

と結んでいましたので、こちらを実現します。
そのために、トレーニング済みのモデルの保存と読み込みをする必要がありました。
その方法を紹介して、実際にwxPythonで三目並べを作成します。
ソースコードなどの必要なファイルは[GitHub](https://github.com/kanlkan/pylearn2-try-tic-tac-toe)に上げていますので、そちらから取得してください。

# Pylearn2でのモデルの保存と読み込み方法
分かってみれば、簡単でした。

```py
from pylearn2.utils import serial
...
...
ann = mlp.MLP([h0,out], nvis=9)
path = "./hoge.pkl"

# save model
serial.save(path, ann, on_overwrite='backup')

# load model
ann = serial.load(path)

```

'on_overwrite'は'ignore', 'backup' が選択できます。

 + ignore : 無視して上書き
 + backup : save前に .bak としてバックアップをし、saveが成功したら .bakファイルを削除します。saveが失敗したとき、復旧できます。

特に理由がない限り、'backup'でよいのではないかと思います。


# wxPythonによる三目並べ
## 動作確認環境
 + LinuxMint 17.3 (python2.7.6 + wxpython3.0.3)

wxPythonは2.8でも動作すると思います。
wxPythonのインストール手順は[こちら](http://qiita.com/kanlkan/items/5e6f2e63de406f46b3b1#wxpython%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)などをご覧ください。
WindowsではPylearn2のインストールが至難の業なので、Linuxで実行してください。Macでは...すいません、分かりません...

## 使い方
![tic-tac-toe.png](https://qiita-image-store.s3.amazonaws.com/0/127380/02276e6b-0996-4e2a-6192-a43cea366f01.png)

１. モデルのパラメータを設定し、学習したモデルをSaveする
右半分のパネルでモデルのパラメータを設定します。

 + h0 : Sigmoid
    + irange : 初期の重みの範囲。±irangeの範囲からランダムで設定されます。
    + init bias : 初期バイアス値
 + out : Softmax
    + irange : 初期の重みの範囲。±irangeの範囲からランダムで設定されます。 
 + open .csv
    + 読み込む棋譜ファイルの指定。tic_tac_toe.pyと同一フォルダから読み込まれます。
 + save .pkl
    + Saveするモデルファイル名。tic_tac_toe.pyと同一フォルダに作成されます。
 + term criterion
    + termination_criterion. 学習終了するEpochCounter値を設定します。

２. Game Modeの選択

 + Man vs Comp : 人が先攻、Computerが後攻
 + Comp vs Man : Computerが先攻、人が後攻

３．読み込むモデルファイルの指定してGame Start
４．マウスの左クリックで〇×を置きます。Computerは学習結果から自動で置きます。

一度モデルを保存すれば、それを指定するだけでそのモデルでゲームできます。

## 楽しむポイント
 + 読み込む棋譜ファイルを先攻が勝ったもの(records_1st_win.csv)、先攻が負けたもの(records_1st_lose.csv)、全部まとめたもの(records.csv)で変更すると挙動が変わります。先攻が勝った棋譜で学習させたモデルで、Computerに後攻で打たせる意地悪をすると...
 + termination_criterionを非常に小さい値にすると...
 + 自分で最善手を打っている棋譜を元にすると...

などパラメータを変えて、AIの挙動を見て楽しんでください。
また、以下のようなコンソール出力されるComputerが打つ手の自信の具合(と私は呼んでいます)を見ながらゲームするのもおススメです。

```
[ 0.1223754   0.07839377  0.1005455   0.09967972  0.0958171   0.05355689
  0.13877278  0.08772236  0.22313648]
[  1.69255291e-01   1.79474672e-01   6.59611187e-02   8.35728072e-02
   1.76704145e-01   5.69182580e-05   1.74977445e-01   1.48576416e-01
   1.42118607e-03]
[  3.94020768e-02   3.56583963e-03   9.39233627e-05   1.20089713e-01
   4.85647829e-01   2.05857441e-04   2.00150417e-01   1.50013023e-01
   8.31320404e-04]
[  3.55036488e-01   8.74969597e-03   2.24572898e-04   7.35919590e-04
   1.89100732e-02   3.48102279e-04   2.63566398e-01   3.48737495e-01
   3.69125555e-03]
```
[ ]で囲まれた９つの数字は合計で1になります。９つの数字は９つのマスに対応します。
この中で最大の値を取っているマスにAIは打ちます。
この数字を確率のように考えると、

 + どの数字もあまり大差がない場合　→　あまり自信なし。
 + ひとつだけ圧倒的に値が大きい場合 →　自信満々

自信満々に変なマスに打つと、ちょっと愛らしい。

ぜひ、いろいろと試して遊んでみてください。

# 参考
[https://github.com/lisa-lab/pylearn2/blob/master/pylearn2/train.py](https://github.com/lisa-lab/pylearn2/blob/master/pylearn2/train.py)
[http://fastml.com/how-to-get-predictions-from-pylearn2/](http://fastml.com/how-to-get-predictions-from-pylearn2/)
[http://deeplearning.net/software/pylearn2/library/utils.html](http://deeplearning.net/software/pylearn2/library/utils.html)