【쇼기 AI】「쇼기 AI에서 배우는 딥 러닝」을 읽는다♪~소스 코드의 구성과 기보 준비


넷째 밤은 프로젝트의 디렉토리 구성과 기보 다운로드에 대해 설명합니다.

설명하고 싶은 것



(1) 프로젝트의 디렉토리 구성
(2) 기보 다운로드
(3) 기보를 청소한다

(1) 프로젝트의 디렉토리 구성



디렉토리 구성은 다음과 같습니다. 이러한 구성으로 디렉토리를 작성합니다.
PJのディレクトリ
| setup.py
| train_policy.py
| kiflist_train.txt
| kiflist_test.txt
| kiflist_train_1000.txt
| kiflist_test_100.txt
├── model
|     model_policy
|── pydlshogi
|   |common.py
|   |features.py
|   |read_kifu.py
|   └── network   
|         policy.py
└── utils            
      filter_csa.py
      make_kifu_list.py
      plot_log.py

각 리소스를 각 디렉터리에 저장합니다.
그리고 다음의 코드를 실행하는 것으로, 프로그램에 import 할 수 있게 됩니다.
pip install --no-cache-dir -e .
import setuptools

setuptools.setup(
    name = 'python-dlshogi',
    version = '0.0.1',
    author = '',
    packages = ['pydlshogi'],
    scripts = [],
)

(2) 기보 다운로드



컴퓨터 도장 대국장 에서 2016년 기보를 다운로드합니다.

다운로드한 파일은 7z 형식으로 압축되어 있으므로 7-Zip 에서 압축을 풉니다.

(3) 기보를 청소한다



다음 프로그램에서 조건 이외의 기보를 삭제하는 프로그램을 실행합니다.
※본서에서는 예로서 이하의 조건으로 기보를 추출하고 있습니다
・投了で終了
・手数50手以上
・対局プログラムのRatingが2500以上

​​

filter_csa.py
import argparse
import os
import re
import statistics
parser = argparse.ArgumentParser()
parser.add_argument('dir', type=str)
args = parser.parse_args()

def find_all_files(directory):
    for root, dirs, files in os.walk(directory):
        for file in files:
            yield os.path.join(root, file)

ptn_rate = re.compile(r"^'(black|white)_rate:.*:(.*)$")
kifu_count = 0
rates = []
for filepath in find_all_files(args.dir):
    rate = {}
    move_len = 0
    toryo = False
    for line in open(filepath, 'r', encoding='utf-8'):
        line = line.strip()
        m = ptn_rate.match(line)
        if m:
            rate[m.group(1)] = float(m.group(2))
        if line[:1] == '+' or line[:1] == '-':
            move_len += 1
        if line == '%TORYO':
            toryo = True
    if not toryo or move_len <= 50 or len(rate) < 2 or min(rate.values()) < 2500:
        os.remove(filepath)
    else:
        kifu_count += 1
        rates.extend([_ for _ in rate.values()])
print('kifu count :', kifu_count)
print('rate mean : {}'.format(statistics.mean(rates)))
print('rate median : {}'.format(statistics.median(rates)))
print('rate max : {}'.format(max(rates)))
print('rate min : {}'.format(min(rates)))

실행 결과는 다음과 같습니다.
>python utils\filter_csa.py D:\wdoor2016
kifu count : 29758
rate mean : 3063.189260030916
rate median : 3066.0
rate max : 3825.0
rate min : 2502.0

추출 조건을 조금 바꾸면 다음과 같은 결과가 얻어졌다.
>python utils\filter_csa.py D:\wdoor2016
kifu count : 13990
rate mean : 3228.983166547534
rate median : 3216.0
rate max : 3825.0
rate min : 3000.0

훈련 데이터와 테스트 데이터로 분할



훈련 데이터와 테스트 데이터를 다음과 같이 분할합니다.
분할 비율은 다음 입력으로 제공됩니다.
parser.add_argument('--ratio', type=float, default=0.9)
import argparse
import os
import random

parser = argparse.ArgumentParser()
parser.add_argument('dir', type=str)
parser.add_argument('filename', type=str)
parser.add_argument('--ratio', type=float, default=0.9)
args = parser.parse_args()

kifu_list = []
for root, dirs, files in os.walk(args.dir):
    for file in files:
        kifu_list.append(os.path.join(root, file))

# シャッフル
random.shuffle(kifu_list)

# 訓練データとテストデータに分けて保存
train_len = int(len(kifu_list) * args.ratio)
with open(args.filename + '_train.txt', 'w') as f:
    for i in range(train_len):
        f.write(kifu_list[i])
        f.write('\n')

with open(args.filename + '_test.txt', 'w') as f:
    for i in range(train_len, len(kifu_list)):
        f.write(kifu_list[i])
        f.write('\n')

print('total kifu num = {}'.format(len(kifu_list)))
print('train kifu num = {}'.format(train_len))
print('test kifu num = {}'.format(len(kifu_list) - train_len))

읽은 기보를 셔플하고 나서 분할하고 있습니다.
실제로 움직여 보면 다음과 같은 결과가 출력되고,

make_kifu_list.py
>python utils\make_kifu_list.py D:\wdoor2016 kifulist3000
total kifu num = 13990
train kifu num = 12591
test kifu num = 1399


그래서 kifulist3000_test.txt와 kifulist3000_train.txt라는 두 개의 파일이 새로 만들어졌습니다.

요약



· 프로그램 등의 디렉토리 구성을 작성했습니다.
· 기보를 Floodgate에서 다운로드했습니다.
・기보를 조건을 설정하여 훈련 데이터와 테스트 데이터를 작성했다

좋은 웹페이지 즐겨찾기