はじめてのpython&Tensorflowその4・手牌枚数で畳み込みニューラルネット
2018-10-14(Sun)
前回で、Denseを直列つなぎしただけのちゃちなニューラルネットを組みましたが、
今回はそこから卒業してアルファ碁みたいに畳み込み計算をやってみようと思います。
大量のエラーメッセージの波をかき分けながら、なんとかモデルのコンパイルが通りました。
型変換するだけとか、ベクトルのサイズ変更するだけでもえらく大変でした。kerasたん、ツンデレすぎる…。
ググって調べる能力だけでなんとかやってきてます。
今回組んだニューラルネットの構造はこんな感じ↓。(TensorBoradのグラフ図)

入力は前回と同じで、37種牌の枚数を要素にもつ37次ベクトル。
まずは入力のベクトルをマンズ、ピンズ、ソーズ、字牌の4つに分割しています。
その4区分に対して、下のほうのlambda_〇みたいな層がいっぱいあるのは畳み込み計算ができる形に整形をするなどの下ごしらえ工程です。
マンズ、ピンズ、ソーズについては数牌フィルター(サイズ5×6、重みパラメータは共有)32枚を通す2次元畳み込み計算をしています。(conv2d_1層)
字牌については数牌とは別個のフィルター(サイズ1×6)32枚を通す2次元畳み込み計算をしています。(conv_2d_2)
で、出力がshape9×32が3つと7×32が1個出てきたのを統合してるのが、その上のconcatenateの層。
そこからは前回と同じ感じで全結合3回を直列させてるのを計算してます。
なんかすんごいぐっちゃぐっちゃにかき回してるだけの汚いニューラルネットですね。
それで上記のようなニューラルネットで学習させたのがこんな感じ↓。(1万試合分の手牌で、10epoch)

前回の正解率44%から、今回は57%くらいへと評価値がだいぶ向上してます。
汚くても結果が出ればええねん、みたいな。
テストデータ(手牌+正解ラベル)による検証がこちら↓。(サイズがでかすぎるとエクセルでの取り回しが効きにくいので、10000試合だけ抜き取った。)

2位的中率まで含めれば82%まで予測的中率が上がってます。だいぶいい感じです。
畳み込み計算によって当該牌の周囲の形を見ることができるようになったのが表れてるのかなーと思います。
〇現在困ってること
model.saveをしようとするとエラーが出る。
model.save_weghitsは通る。
model.to_jsonは通らないので、重みのセーブはできるけど、ニューラルネットの構造がセーブできない状況。(現在は訓練用と同じコードを予測用プログラムでもコピペすることで応急的に対応してる。)
おそらく、原因は、
kakou_manzu = Lambda(tf.cast,arguments={'dtype':tf.int32})(kakou_manzu)
の行(テンソルのdtypeをfloatからintに変えたい)で、kerasの関数でなくTensorflowの関数を使ってるため。
kerasの関数で型変換ができればたぶんmodel.saveも通るので、構造のセーブができると思うのだけど、何かいい方法はないだろうか?
次は、入力情報を増やす(畳み込み計算の入力チャンネル数を増やす)ことをやろうかと思っています。
入れようとしている情報として、
・巡目
・ドラ
・赤5牌
・役牌
・当該牌を切った時の面子手シャンテン数
・当該牌を切った時の対子数(七対子がらみ)
・当該牌を切った時のヤオ九牌種類数(国士がらみ)
また牌譜解析からcsvを取って、それをPythonで読み取ってうまいことNNの設計をして、…みたいなイメージ。
今回はそこから卒業してアルファ碁みたいに畳み込み計算をやってみようと思います。
大量のエラーメッセージの波をかき分けながら、なんとかモデルのコンパイルが通りました。
型変換するだけとか、ベクトルのサイズ変更するだけでもえらく大変でした。kerasたん、ツンデレすぎる…。
ググって調べる能力だけでなんとかやってきてます。
今回組んだニューラルネットの構造はこんな感じ↓。(TensorBoradのグラフ図)

入力は前回と同じで、37種牌の枚数を要素にもつ37次ベクトル。
まずは入力のベクトルをマンズ、ピンズ、ソーズ、字牌の4つに分割しています。
その4区分に対して、下のほうのlambda_〇みたいな層がいっぱいあるのは畳み込み計算ができる形に整形をするなどの下ごしらえ工程です。
マンズ、ピンズ、ソーズについては数牌フィルター(サイズ5×6、重みパラメータは共有)32枚を通す2次元畳み込み計算をしています。(conv2d_1層)
字牌については数牌とは別個のフィルター(サイズ1×6)32枚を通す2次元畳み込み計算をしています。(conv_2d_2)
で、出力がshape9×32が3つと7×32が1個出てきたのを統合してるのが、その上のconcatenateの層。
そこからは前回と同じ感じで全結合3回を直列させてるのを計算してます。
なんかすんごいぐっちゃぐっちゃにかき回してるだけの汚いニューラルネットですね。
それで上記のようなニューラルネットで学習させたのがこんな感じ↓。(1万試合分の手牌で、10epoch)

前回の正解率44%から、今回は57%くらいへと評価値がだいぶ向上してます。
汚くても結果が出ればええねん、みたいな。
テストデータ(手牌+正解ラベル)による検証がこちら↓。(サイズがでかすぎるとエクセルでの取り回しが効きにくいので、10000試合だけ抜き取った。)

2位的中率まで含めれば82%まで予測的中率が上がってます。だいぶいい感じです。
畳み込み計算によって当該牌の周囲の形を見ることができるようになったのが表れてるのかなーと思います。
〇現在困ってること
model.saveをしようとするとエラーが出る。
model.save_weghitsは通る。
model.to_jsonは通らないので、重みのセーブはできるけど、ニューラルネットの構造がセーブできない状況。(現在は訓練用と同じコードを予測用プログラムでもコピペすることで応急的に対応してる。)
おそらく、原因は、
kakou_manzu = Lambda(tf.cast,arguments={'dtype':tf.int32})(kakou_manzu)
の行(テンソルのdtypeをfloatからintに変えたい)で、kerasの関数でなくTensorflowの関数を使ってるため。
kerasの関数で型変換ができればたぶんmodel.saveも通るので、構造のセーブができると思うのだけど、何かいい方法はないだろうか?
次は、入力情報を増やす(畳み込み計算の入力チャンネル数を増やす)ことをやろうかと思っています。
入れようとしている情報として、
・巡目
・ドラ
・赤5牌
・役牌
・当該牌を切った時の面子手シャンテン数
・当該牌を切った時の対子数(七対子がらみ)
・当該牌を切った時のヤオ九牌種類数(国士がらみ)
また牌譜解析からcsvを取って、それをPythonで読み取ってうまいことNNの設計をして、…みたいなイメージ。
スポンサーサイト