FC2ブログ

*All archives* |  *Admin*

<<09  2018/10  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  11>>
はじめてのpython&Tensorflowその3・他家攻撃なし、手牌枚数のみニューラルネット
前回で、Pythonの機械学習で自力での応用ができるようになった(多分)ので、
いよいよ麻雀におけるデータで試してみたいと思います。

まず最初は前回でも書いた通り、
他家攻撃なしかつ手牌の枚数情報のみを入力値にして、
てきとうなニューラルネットにぶちこんでみます。
本当に手牌の枚数情報のみなので、巡目もドラも役牌種類も全然考慮してません。

入力データは最初の1000試合分、約13万種類の手牌を訓練用に最初の6分の5の11万種類を充て、残りの6分の1の2万種類をテスト用(評価用)としました。
出力値は37種類の牌の切られる確率の予測値です。

ニューラルネットの構造
・入力層…37種類の牌の手持ち枚数
・隠れ層1…全結合でノード数64、活性化関数Relu
・隠れ層2…全結合でノード数64、活性化関数Relu
・出力層…全結合でノード数37、活性化関数ソフトマックス
・損失関数…クロスエントロピー

TensorBoardとやらでニューラルネットの構造を可視化というものをやってみたらこんな感じ↓。
181011-02.png
とりあえず今の私には理解が難しいことだけわかった。

正解率(おそらく予測切られ率で最も大きい牌番号が実際の正解ラベルと同じである確率と思われる。)と損失関数の推移もTensorBoradによるとこういう感じらしい↓。
181011-03.png
多分左側のvalがないほうが訓練用データの正解率(acc)と損失関数(loss)で、右側のvalがついてるほうがテスト用データの正解率と損失関数だと思われます。

学習が進むにつれ正解率は上昇し、損失関数は減少しているようなことがわかります。
10epoch回した結果、テストデータの正解率で44%くらいということです。
37種類の牌もしくは手牌にある牌のどれかを切れる中で、5回に2回は実際に切られた牌と同一の予測をできるのは、初回で適当に組んだだけで、役牌とかドラとかも考慮してないにしてはまずまずの結果じゃないかなーと思います。

結果をエクセルでまとめるとこんな感じ↓
181011-01.png
テスト用データについて、予測率が1番高い牌番号と2番目に高い牌番号を取ってきて、1位的中率と1位or2位の的中率を出してみました。
(牌番号1~10がマンズ、11~20がピンズ、21~30がソーズ、31~37が字牌)

特徴として、
予測1位や2位の牌はことごとく字牌や端寄りになってる感じです。
全員リーチも副露もしてないので、データが序巡に偏ってるためかなーと。
真ん中牌が切られるケースは外れデータみたいな扱いをされてるのかもしれないです。
まぁ、手持ちにない牌が予測1位や2位になるケースはほぼなさそうで安心。


次はニューラルネットの構造をもうちょっとましにして実用的にしようかと思います。
具体的には枚数と重みパラメータのテンソル積の全結合にするんじゃなくて、アルファ碁みたいに畳み込み計算を導入してパラメータの個数を減らして計算時間にかかる負荷を減らそうかと。

まだKerasについて十分理解していないので、全結合と単純な畳み込み計算以外の方法を知りませんが、調べたらどこかに載ってるかなぁ。
スポンサーサイト

コメントの投稿

Secret
(非公開コメント受付中)

コメント

プロフィール

nisi5028

Author:nisi5028
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
フリーエリア
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード