将棋AIの作成のためgoogle colaboratoryで以下のコードを動かしました。
ディレクトリはgoogle drive内に作ったファイルで、その中に棋譜のパスが書かれたテキストファイル(kifulist_train_1000.txt kifulist_test_100.txt)と、棋譜が書かれたcsaが入っている2016という名前のファイルがあります。
コード
lang
1 2import numpy as np 3import chainer 4from chainer import cuda, Variable 5from chainer import optimizers, serializers 6import chainer.functions as F 7 8from pydlshogi.common import * 9from pydlshogi.network.policy import PolicyNetwork 10from pydlshogi.features import * 11from pydlshogi.read_kifu import * 12 13import argparse 14import random 15import pickle 16import os 17import re 18 19import logging 20 21 22 23import easydict 24args = easydict.EasyDict({ 25 'kifulist_train':'kifulist_train_1000.txt', 26 'kifulist_test':'kifulist_test_100.txt', 27 'batchsize':32, 28 'test_batchsize':512, 29 'epoch':1, 30 'model':'model/model_policy', 31 'state':'model/state_policy', 32 'initmodel':'', 33 'resume':'', 34 'log':None, 35 'lr':0.01, 36 'eval_interval':100 37}) 38 39 40logging.basicConfig(format='%(asctime)s\t%(levelname)s\t%(message)s', datefmt='%Y/%m/%d %H:%M:%S', filename=args.log, level=logging.DEBUG) 41 42model = PolicyNetwork() 43model.to_gpu() 44 45optimizer = optimizers.SGD(lr=args.lr) 46optimizer.setup(model) 47 48# Init/Resume 49if args.initmodel: 50 logging.info('Load model from {}'.format(args.initmodel)) 51 serializers.load_npz(args.initmodel, model) 52if args.resume: 53 logging.info('Load optimizer state from {}'.format(args.resume)) 54 serializers.load_npz(args.resume, optimizer) 55 56logging.info('read kifu start') 57# 保存済みのpickleファイルがある場合、pickleファイルを読み込む 58# train date 59train_pickle_filename = re.sub(r'..*?$', '', args.kifulist_train) + '.pickle' 60if os.path.exists(train_pickle_filename): 61 with open(train_pickle_filename, 'rb') as f: 62 positions_train = pickle.load(f) 63 logging.info('load train pickle') 64else: 65 positions_train = read_kifu(args.kifulist_train) 66 67# test data 68test_pickle_filename = re.sub(r'..*?$', '', args.kifulist_test) + '.pickle' 69if os.path.exists(test_pickle_filename): 70 with open(test_pickle_filename, 'rb') as f: 71 positions_test = pickle.load(f) 72 logging.info('load test pickle') 73else: 74 positions_test = read_kifu(args.kifulist_test) 75 76# 保存済みのpickleがない場合、pickleファイルを保存する 77if not os.path.exists(train_pickle_filename): 78 with open(train_pickle_filename, 'wb') as f: 79 pickle.dump(positions_train, f, pickle.HIGHEST_PROTOCOL) 80 logging.info('save train pickle') 81if not os.path.exists(test_pickle_filename): 82 with open(test_pickle_filename, 'wb') as f: 83 pickle.dump(positions_test, f, pickle.HIGHEST_PROTOCOL) 84 logging.info('save test pickle') 85logging.info('read kifu end') 86 87logging.info('train position num = {}'.format(len(positions_train))) 88logging.info('test position num = {}'.format(len(positions_test))) 89 90# mini batch 91def mini_batch(positions, i, batchsize): 92 mini_batch_data = [] 93 mini_batch_move = [] 94 for b in range(batchsize): 95 features, move, win = make_features(positions[i + b]) 96 mini_batch_data.append(features) 97 mini_batch_move.append(move) 98 99 return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))), 100 Variable(cuda.to_gpu(np.array(mini_batch_move, dtype=np.int32)))) 101 102def mini_batch_for_test(positions, batchsize): 103 mini_batch_data = [] 104 mini_batch_move = [] 105 for b in range(batchsize): 106 features, move, win = make_features(random.choice(positions)) 107 mini_batch_data.append(features) 108 mini_batch_move.append(move) 109 110 return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))), 111 Variable(cuda.to_gpu(np.array(mini_batch_move, dtype=np.int32)))) 112 113# train 114logging.info('start training') 115itr = 0 116sum_loss = 0 117for e in range(args.epoch): 118 positions_train_shuffled = random.sample(positions_train, len(positions_train)) 119 120 itr_epoch = 0 121 sum_loss_epoch = 0 122 for i in range(0, len(positions_train_shuffled) - args.batchsize, args.batchsize): 123 x, t = mini_batch(positions_train_shuffled, i, args.batchsize) 124 y = model(x) 125 126 model.cleargrads() 127 loss = F.softmax_cross_entropy(y, t) 128 loss.backward() 129 optimizer.update() 130 131 itr += 1 132 sum_loss += loss.data 133 itr_epoch += 1 134 sum_loss_epoch += loss.data 135 136 # print train loss and test accuracy 137 if optimizer.t % args.eval_interval == 0: 138 x, t = mini_batch_for_test(positions_test, args.test_batchsize) 139 y = model(x) 140 logging.info('epoch = {}, iteration = {}, loss = {}, accuracy = {}'.format(optimizer.epoch + 1, optimizer.t, sum_loss / itr, F.accuracy(y, t).data)) 141 itr = 0 142 sum_loss = 0 143 144 # validate test data 145 logging.info('validate test data') 146 itr_test = 0 147 sum_test_accuracy = 0 148 for i in range(0, len(positions_test) - args.batchsize, args.batchsize): 149 x, t = mini_batch(positions_test, i, args.batchsize) 150 y = model(x) 151 itr_test += 1 152 sum_test_accuracy += F.accuracy(y, t).data 153 logging.info('epoch = {}, iteration = {}, train loss avr = {}, test accuracy = {}'.format(optimizer.epoch + 1, optimizer.t, sum_loss_epoch / itr_epoch, sum_test_accuracy / itr_test)) 154 155 optimizer.new_epoch() 156 157logging.info('save the model') 158serializers.save_npz(args.model, model) 159logging.info('save the optimizer') 160serializers.save_npz(args.state, optimizer)
下のようなエラーが出ました
2018/05/13 14:21:43 INFO read kifu start --------------------------------------------------------------------------- OSError Traceback (most recent call last) <ipython-input-32-371f8040b06a> in <module>() 75 logging.info('load train pickle') 76 else: ---> 77 positions_train = read_kifu(args.kifulist_train) 78 79 # test data /content/drive/shogi-1/pydlshogi/read_kifu.py in read_kifu(kifu_list_file) 11 for line in f.readlines(): 12 filepath = line.rstrip('\r\n') ---> 13 kifu = shogi.CSA.Parser.parse_file(filepath)[0] 14 win_color = shogi.BLACK if kifu['win'] == 'b' else shogi.WHITE 15 board = shogi.Board() /usr/local/lib/python3.6/dist-packages/shogi/CSA.py in parse_file(path) 64 @staticmethod 65 def parse_file(path): ---> 66 with open(path) as f: 67 return Parser.parse_str(f.read()) 68 OSError: [Errno 5] Input/output error: '2016\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csa'
棋譜のパスが書かれたファイルには2016\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csa
としているのですが読み込む際2016\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csa
というファイルを探し出そうとしています。
正しいパスを読み込ませようと考えましたが方法がわかりません。
もしよければご教授いただけると幸いです。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/13 15:34
2018/05/13 15:41
2018/05/14 04:57
2018/05/14 05:13
2018/05/14 08:39
2018/05/14 14:08