このエントリーをはてなブックマークに追加

2017年1月23日月曜日

配牌からあがれる可能性を予測する!(その3 学習の実装)



前回の訂正


CSVファイルからの読み込み時、String型になってしまうので、Int型にキャストしなければなりませんでした。
差分はこちらになりますが、その中でリスト内包記述というfor文を1行で書くように修正しております。
# 修正前
tmp_hand = []
for tile in range(0, 12):
tmp_hand.append(row[tile])

# 修正後
tmp_hand = [int(tile) for tile in row]

学習の実装開始


今回より学習機能をつけていきたいと思います。
基本的には、「ゼロから作るディープラーニング」の手順で論理を進めています。
(誤差を求め、その誤差の微分値からパラメータを求める。)
ソースコードはこちらになります。
https://github.com/naoki85/python_mahjong

matplotlib について


その前に、グラフを描画する便利ライブラリであるmatplotlibの準備をしておきます。
まだそこまで複雑なグラフはいらないので、基本的な書き方で大丈夫そうです。
今回はX軸はループの回数、Yは誤差(教師データとの誤差とします。)
# xの値を1ずつ定義
x = range(0, 100)
# ループごとに誤差を格納しておく
y = loss_array
plt.xlabel("x")
plt.ylabel("loss")
plt.plot(x, y)
plt.show()
ためしに作ってみた図はこちらです。


ループ回数を重ねるごとに、誤差がちいさくなっていることが分かります。
ただし、こちらの正当性はまだ確認できていないので、実際に次回は学習後の重み、バイアスを使用してテストしてみます。

学習結果の保存について(pickleモジュール)


学習結果はpickle形式で保存しました。
pickleは「漬物」という意味で、オブジェクトをそのまま保存してくれます。(ピクルスのことか、と覚えました。)
はじめはCSV形式にしようと思ったのですが、いちいち分解して保存するのも、取り出すときに再度辞書型にするのも面倒です。
例えば、下記の結果を保存するとします。
{'W': [1, 2, 3], 'b': [4, 5]}
これを特に前処理なしで下記のように保存(漬物)にしてしまいます。(基本的なファイルの読み書きと同じ感じです。)
with open(pickle_filepath, 'wb') as f:
    writer = pickle.dump(results, f)
取り出すときも下記のようにかけば、なんとびっくりそのまま取り出せます。
with open(pickle_filepath, 'rb') as f:
    params = pickle.load(f)

{'W': [1, 2, 3], 'b': [4, 5]}
そのため、重み、バイアスの値は教師データとは異なりpickleで管理することとしました。

おわりに


まだ私自身、微分して最適な重みを求める「勾配法」について、 腑に落ちていないところがあるので、
そちらを理解して、実装を踏まえて書きたいと思います。

0 件のコメント:

コメントを投稿