教師局面を生成する方法は知っていても(gensfenとか)
sfenファイルを教師局面に変換する方法を知っている人はそれほどいないのではないだろうか
というわけで今回はsfenファイルを教師局面に変換してみた。
今回はやねうらおう氏のあやねるを使わせていただく。
そのため、今回はPythonを用いて教師局面にsfenファイルを変換する。
Pythonの導入方法については、他のクソわかりやすいサイトに任せる。
「Python 導入方法」とかでググれ
まずはやねうらおうのlearn版が入ったzipファイルをインストールしよう
実行ファイル詰め合わせの中に
YaneuraOu_NNUE_learn_avx2.exe
YaneuraOu_NNUE_learn_zen2.exe
YaneuraOu_NNUE_learn_sse42.exe
YaneuraOu_NNUE_learn_zen1.exe
といったものがあると思うのでcpuにあったものを選ぶ。
Ryzen(第二世代)シリーズ>>>>zen2
Ryzen(第一世代)シリーズ>>>>zen1
Intel Coreシリーズ>>>>avx2
上記以外 sse42
次はあやねるのダウンロード。
緑色の「Code」と書かれたボタンをクリックして「Download ZIP」からダウンロード
これを展開する。
sfenを教師局面に変換するのは、少々プログラミングの知識がいる。
そもそもプログラミングできないとある程度強いソフトはできないと思うのだが
Ayaneの概要は、上記のやねうらおうのページから詳細を確認してほしい
Pythonもある程度プログラミングに慣れてる人なら知らないところを調べればすぐにわかる
このソースコードをコピペして、~~.pyという名前で保存。
拡張子表示してないと、~~.py.txtとなることもあるので表示してるか確認すること
~~.exeのところとかを書き換えてほしい。
主にyaneuraouのオプションらへんとか。
ちなみに自作です。無保証無責任なのでご了承を。
オープンソースにしときます。
でも製品にするとかソフトに搭載するとかだったら言ってっくれると嬉しい。
需要無いけど。
11/26 plyがうまくでないバグを修正
import shogi.Ayane as ayane
usi = ayane.UsiEngine()
eval = ayane.UsiEvalValue()
usi.debug_print = False
#logを書き出すか
usi.connect("exe/YaneuraOu_NNUE_zen2.exe")
usi.send_command("multipv 1\nthreads 16\nusi_hash 4096\nbookfile user_book2.db\nbookmoves 32\nsetoption name DepthLimit value 3\n")
save_b=[[""]]
sfen=""
output=[]
position = ""
res = "-1"
cp = ""
turn=""
teban=""
m=""
print("read1を開きます")
with open("a.db") as position:
#sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1
print("generating start")
for a in position:
if "sfen" in a:
sfen=a
#kifu_each
usi.usi_position(sfen)
#for i in log:
# if i in "sfen":
# sfen = log[6:]
n=a.split()
for Y in n:
if Y.isdecimal()==True:
m=Y
result = ayane.UsiThinkResult()
usi.usi_go_and_wait_bestmove("depth 3")
usi.think_result.to_string()
result.to_string()
String_UsiThinkResult = usi.think_result.to_string().split()
s = 0
bestmove = ""
for q in String_UsiThinkResult:
if {q in 'bestmove'} and {s==0}:
s=1
if s==1:
bestmove = q
s = 2
p=0
t=0
s=0
mate=0
for k in String_UsiThinkResult:
if "cp" in k:
p=k
t=1
elif t==1:
p=k
t=2
elif "mate" in k and mate==0:
mate=1
if mate==1 and k not in "mate":
p = "mate"
elif k in "pv":
s=1
elif t==2 and s==1 and bestmove not in k:
t=0
s=0
cp = p
sp=sfen.split()
for t in sp:
if t=="b":
res = "1"
elif t=="w":
res = "-1"
"""
独自設定欄.....教師局面の評価値をいじる
"""
if bestmove == "2h7h" and int(m) < 11 and res=="1":
cp = int(cp)
cp += 100
cp = str(cp)
elif bestmove == "8b3b" and int(m) <12 and res=="-1":
cp = int(cp)
cp += 100
cp = str(cp)
if cp=="mate":
cp = "-99999"
"""
盤表示
for P in board:
print(P)
"""
if int(cp) < -300 and "BLACK" in str(turn):
print("not")
elif int(cp)>300 and "WHITE" in str(turn):
print("not")
elif int(cp)>6000 or int(cp)<-6000:
print("over")
else:
"""
独自設定欄.....教師局面の評価値をいじる
"""
fen=sfen.split("/")
if "1BR6" in fen and res==1:
cp = int(cp)
cp += 100
cp = str(cp)
elif "6rb1" in fen and res==-1:
cp = int(cp)
cp += 100
cp = str(cp)
k=sfen.split()
T=""
for i in range(len(k)-1):
T+=k[i]+" "
T+="0"
file_data = (T + "\n" + "move " + bestmove + "\n" + "score " + cp + "\n" + "ply " + m + "\n" + "result " + res + "\ne\n")
with open("db_teacher.txt",mode='a') as f:
f.write(file_data)
print("End")
usi.disconnect()
usi.engine_state, ayane.UsiEngineState.Disconnected
learn版YaneuraOuに、次のコマンドを打ってdbに変換します
makebook from_sfen a.db moves 320
これでa.dbというファイルに変換したいsfenファイルを変換できた。
Ayaneに先ほどのa.dbを置いて、exeフォルダを作成して適当なYaneuraOu(learnでなくてよい)をその中におく。
そして、先ほどのソースコードをコピペしたものを、おく。ファイルの配置はこんなかんじ
/はフォルダ内にあるという意味
a.db
コピペしたもの.py
shogi(フォルダ) / Ayane.py
exe(フォルダ) / YaneuraOu~~~.exe
Win10のタスクバーの検索欄から、
「cmd」
と入力して起動、Step2.のフォルダに移動します。
cd /
と打ってから、Step2.のフォルダを右クリックしてプロパティから場所を調べて、
cmdで
cd 場所(一番最初のC:みたいなのはつけない)
のコマンドで移動すればおけ。ドライブが別な人は、ドライブ名「D:」とかって打ってからやるといいです。
Step2.のフォルダに移動したら、
python コピペしたもの.py
と打ってください。Pythonのセッティングできてればこれで変換できます。
変換ファイル名は「db_teacher.txt」
Pythonうまくいってなかったら、
Pathがうまく通ってるか確認して、通ってるのを確認したら再起動するといいです
learn版のやねうらおうで、
learn convert_bin output_file_name generated_kifu.bin db_teacher.txt
というコマンドを打つとbin形式の教師局面に変換できます。
あとはlearn ~~.binとするだけで評価関数がつくれちゃう!
ちなみにlearnコマンドの際は1000万局面くらいないとエラーで評価関数できないので注意
もうちょいソースを改良して、だれでも扱いやすいものにしたいですね。
VBは勉強してないし、もうすぐ大学受験なもんで…
一応オープンソースということにします。
というかまぁみんなもう自作して使ってると思いますが、
自分が調べてもこういったツールが見当たらなかったもので、公開することにしました
(もしかしたらもうあったかもしれないけど)