2018-10-10(Wed)
Tensorflowよりもkerasというのを使うとわかりやすいらしいという情報をいただきまして、
調べてみていろいろいじくってみたところ、
Tensorflow…ほぼ無理→keras…なんとかなりそう、
くらいに理解度が改善しました。
今日書いたコードはこちら↓。
180810-02.txt
やったのは、
・mnistのkeras版サンプルコードをコピペして理解する。
・2次元散布図の2値分類問題について、先のサンプルコードを応用しながら自分でプログラムを書いた。
・計算された重みパラメータを使ってテストデータで予測値を出してcsvに吐き出す。あとはエクセルでてきとうにグラフ化。
です。
割と勉強は進んで、簡単なニューラルネットなら自力で応用できるようになりました。
1個目は、
[-1,1]×[-1,1]の2次元の一様乱数を200個発生させて(前者がx、後者をyとする)、y>x^2なら正解ラベル1を、y<=x^2なら正解ラベル0をつけたものを訓練データ&テストデータとしてニューラルネットの計算をやりました。
ニューラルネットは真の境界線y=x^2は知りませんが、与えられた(x,y)の組に対して0か1のどちらかで予測します。
200個の点のうち、100個ずつ訓練用とテスト用に分けて、前半100個の訓練データで散布図を描いたものがこちら↓です。

ニューラルネットの構造は
入力層:x,yの2個
隠れ層1:全結合でノード数10(活性化関数Relu)
隠れ層2:全結合でノード数10(活性化関数Relu)
出力層:0か1で2個(活性化関数ソフトマックス)
多層ニューラルネットの微分とか誤差逆伝搬を計算しなくてもよい喜びはひとしおです。
出力されたのは拡張子hdf5というファイル。この中にモデルの情報が全部詰まってるらしいです。
これを再度pythonで読み込みなおして、テストデータ100件から予測値(0か1)を出して散布図にしたのがこちら↓。

100件中予測値と正解ラベルが違うのは4件(オレンジ色の点)。正解率96%でした。
y=x^2だと簡単すぎたかなーと思って、もうちょっと変態な関数でやってみようかなーと思いました。
こんどはy=2(x-1)x(x+1)と三次関数にしてみました。
さっきはデータがすかすかだったので、データ数を5倍の500件+500件に増やしてみました。
ニューラルネットの構造はさっきと同じとします。
↓訓練データ散布図

↓テストデータによる予測の散布図

予測が外れているのは500件中6件。正解率98.8%。
データ数が増えたためか、より正解率は増えてくれました。
とりあえずこれで自分でPythonを使って機械学習を応用できる目途がたちました。
麻雀のケースへの応用を考えることができるフェーズに入れそうです。
まずは最初なんでできるだけ簡単にするため、
入力情報を「自分の手牌構成」だけにしようと思っています。
そのために訓練データの取り方として、
全員副露もリーチもしていない状況、という条件下で、(赤ナシ換算の)手牌情報34種のマスに枚数だけの情報+正解ラベルは(赤ナシ換算の)実際に切られた牌、を牌譜解析から収集、csv化して、
そこからはpythonとkerasでのお仕事でモデルを組んで重みパラメータを出す、という流れを想定しています。
単純な全結合とか畳み込み計算とかではできなさそうなので、その辺のモデルの組み方は腕の見せ所になりそうですが、
ほぼ無理なレベルから、なんとかなりそうレベルまで持って行けたのは非常にでかいです。
とりあえず今日はこんなところで。
調べてみていろいろいじくってみたところ、
Tensorflow…ほぼ無理→keras…なんとかなりそう、
くらいに理解度が改善しました。
今日書いたコードはこちら↓。
180810-02.txt
やったのは、
・mnistのkeras版サンプルコードをコピペして理解する。
・2次元散布図の2値分類問題について、先のサンプルコードを応用しながら自分でプログラムを書いた。
・計算された重みパラメータを使ってテストデータで予測値を出してcsvに吐き出す。あとはエクセルでてきとうにグラフ化。
です。
割と勉強は進んで、簡単なニューラルネットなら自力で応用できるようになりました。
1個目は、
[-1,1]×[-1,1]の2次元の一様乱数を200個発生させて(前者がx、後者をyとする)、y>x^2なら正解ラベル1を、y<=x^2なら正解ラベル0をつけたものを訓練データ&テストデータとしてニューラルネットの計算をやりました。
ニューラルネットは真の境界線y=x^2は知りませんが、与えられた(x,y)の組に対して0か1のどちらかで予測します。
200個の点のうち、100個ずつ訓練用とテスト用に分けて、前半100個の訓練データで散布図を描いたものがこちら↓です。

ニューラルネットの構造は
入力層:x,yの2個
隠れ層1:全結合でノード数10(活性化関数Relu)
隠れ層2:全結合でノード数10(活性化関数Relu)
出力層:0か1で2個(活性化関数ソフトマックス)
多層ニューラルネットの微分とか誤差逆伝搬を計算しなくてもよい喜びはひとしおです。
出力されたのは拡張子hdf5というファイル。この中にモデルの情報が全部詰まってるらしいです。
これを再度pythonで読み込みなおして、テストデータ100件から予測値(0か1)を出して散布図にしたのがこちら↓。

100件中予測値と正解ラベルが違うのは4件(オレンジ色の点)。正解率96%でした。
y=x^2だと簡単すぎたかなーと思って、もうちょっと変態な関数でやってみようかなーと思いました。
こんどはy=2(x-1)x(x+1)と三次関数にしてみました。
さっきはデータがすかすかだったので、データ数を5倍の500件+500件に増やしてみました。
ニューラルネットの構造はさっきと同じとします。
↓訓練データ散布図

↓テストデータによる予測の散布図

予測が外れているのは500件中6件。正解率98.8%。
データ数が増えたためか、より正解率は増えてくれました。
とりあえずこれで自分でPythonを使って機械学習を応用できる目途がたちました。
麻雀のケースへの応用を考えることができるフェーズに入れそうです。
まずは最初なんでできるだけ簡単にするため、
入力情報を「自分の手牌構成」だけにしようと思っています。
そのために訓練データの取り方として、
全員副露もリーチもしていない状況、という条件下で、(赤ナシ換算の)手牌情報34種のマスに枚数だけの情報+正解ラベルは(赤ナシ換算の)実際に切られた牌、を牌譜解析から収集、csv化して、
そこからはpythonとkerasでのお仕事でモデルを組んで重みパラメータを出す、という流れを想定しています。
単純な全結合とか畳み込み計算とかではできなさそうなので、その辺のモデルの組み方は腕の見せ所になりそうですが、
ほぼ無理なレベルから、なんとかなりそうレベルまで持って行けたのは非常にでかいです。
とりあえず今日はこんなところで。