※この記事は2020年に作成しました
#概要
タンヤオのみを狙っていくエージェントから河のデータを取った。聴牌の時の河のデータ5000個と、ノーテンの時の河のデータ5000個の計10000個取った。
このデータ18個のデータを18×34の630個のワンホットベクトルにして3層ニューラルネットワークで聴牌YNの判定を行った。
中間層は315次元、validation_split=0.2とした。
以下に作成した3層ニューラルネットワークの図を示す。
#結果
テストデータに対する正解率は約52%になった。聴牌とノーテンのデータが5000個ずつなので、ランダムに選んだとしても50%の確率で当たる。よって、ほとんど学習できてないことがわかる。
#作成したプログラム
# coding: UTF-8
import csv
import numpy as np
from keras.utils import to_categorical
from keras.models import Sequential,Model
from keras.layers import Dense,Conv2D,MaxPooling2D,Dropout,Flatten,Activation,BatchNormalization
from keras.optimizers import Adam
from keras.layers import Dense,Input
from keras.callbacks import TensorBoard
from keras import optimizers,regularizers
np.set_printoptions(threshold=100000)
data = 5000#5000
x_trainTP = np.loadtxt("C:/sqlite/tanyao_TPkawa.csv",delimiter=",")
x_trainTP = np.delete(x_trainTP,slice(data,None),0)
x_trainNT = np.loadtxt("C:/sqlite/tanyao_NTkawa.csv",delimiter=",")
x_trainNT = np.delete(x_trainNT,slice(data,None),0)
kawa = np.vstack((x_trainTP,x_trainNT))
kawa630 = np.zeros((data*2,630))
for i in range(data*2):
for j in range(18):
kawa630[i,(j*35)] += 1
for i in range(data*2):
for j in range(18):
if kawa[i,j]!=0:
hai = int(kawa[i,j])
kawa630[i,((j*35)+hai-1)] += 1
kawa630[i,(j*35)] -= 1
#print(kawa630.shape)
label = np.zeros((data*2,1))
for i in range(data):
label[i] += 1
label = to_categorical(label,2)
#print(label)
#前処理ここまで
model = Sequential()
input_data = Input(shape=(630,))#入力層
hidden_layer = Dense(315, activation='relu')(input_data)#中間層
output_layer = Dense(2, activation='softmax',kernel_regularizer=regularizers.l2(1e-4))(hidden_layer)#出力層
#Hidden_output = Model(input = input_data , output = hidden_layer) #中間出力用
model = Model(input = input_data , output = output_layer)#入力から出力
#最適化アルゴリズムAdam、損失関数
model.compile(
optimizer=Adam(lr=0.01),
loss='categorical_crossentropy',
metrics=['accuracy'],
)
#http://localhost:6006/
#tensorboard --logdir=./logs
#tsb = TensorBoard(log_dir='./logs')
history_adam=model.fit(
kawa630,
label,
batch_size=256,
epochs=100,
verbose=1,
shuffle = True,
validation_split=0.2,
#callbacks=[tsb]
)