質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.36%

  • Python

    9104questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    7315questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

colaboratoryでのファイル読み込みについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 479

hershel

score 4

将棋AIの作成のためgoogle colaboratoryで以下のコードを動かしました。
ディレクトリはgoogle drive内に作ったファイルで、その中に棋譜のパスが書かれたテキストファイル(kifulist_train_1000.txt kifulist_test_100.txt)と、棋譜が書かれたcsaが入っている2016という名前のファイルがあります。

コード

import numpy as np
import chainer
from chainer import cuda, Variable
from chainer import optimizers, serializers
import chainer.functions as F

from pydlshogi.common import *
from pydlshogi.network.policy import PolicyNetwork
from pydlshogi.features import *
from pydlshogi.read_kifu import *

import argparse
import random
import pickle
import os
import re

import logging



import easydict
args = easydict.EasyDict({
     'kifulist_train':'kifulist_train_1000.txt',
     'kifulist_test':'kifulist_test_100.txt',
     'batchsize':32,
     'test_batchsize':512,
     'epoch':1,
     'model':'model/model_policy',
     'state':'model/state_policy',
     'initmodel':'',
     'resume':'',
     'log':None,
     'lr':0.01,
     'eval_interval':100
})


logging.basicConfig(format='%(asctime)s\t%(levelname)s\t%(message)s', datefmt='%Y/%m/%d %H:%M:%S', filename=args.log, level=logging.DEBUG)

model = PolicyNetwork()
model.to_gpu()

optimizer = optimizers.SGD(lr=args.lr)
optimizer.setup(model)

# Init/Resume
if args.initmodel:
    logging.info('Load model from {}'.format(args.initmodel))
    serializers.load_npz(args.initmodel, model)
if args.resume:
    logging.info('Load optimizer state from {}'.format(args.resume))
    serializers.load_npz(args.resume, optimizer)

logging.info('read kifu start')
# 保存済みのpickleファイルがある場合、pickleファイルを読み込む
# train date
train_pickle_filename = re.sub(r'\..*?$', '', args.kifulist_train) + '.pickle'
if os.path.exists(train_pickle_filename):
    with open(train_pickle_filename, 'rb') as f:
        positions_train = pickle.load(f)
    logging.info('load train pickle')
else:
    positions_train = read_kifu(args.kifulist_train)

# test data
test_pickle_filename = re.sub(r'\..*?$', '', args.kifulist_test) + '.pickle'
if os.path.exists(test_pickle_filename):
    with open(test_pickle_filename, 'rb') as f:
        positions_test = pickle.load(f)
    logging.info('load test pickle')
else:
    positions_test = read_kifu(args.kifulist_test)

# 保存済みのpickleがない場合、pickleファイルを保存する
if not os.path.exists(train_pickle_filename):
    with open(train_pickle_filename, 'wb') as f:
        pickle.dump(positions_train, f, pickle.HIGHEST_PROTOCOL)
    logging.info('save train pickle')
if not os.path.exists(test_pickle_filename):
    with open(test_pickle_filename, 'wb') as f:
        pickle.dump(positions_test, f, pickle.HIGHEST_PROTOCOL)
    logging.info('save test pickle')
logging.info('read kifu end')

logging.info('train position num = {}'.format(len(positions_train)))
logging.info('test position num = {}'.format(len(positions_test)))

# mini batch
def mini_batch(positions, i, batchsize):
    mini_batch_data = []
    mini_batch_move = []
    for b in range(batchsize):
        features, move, win = make_features(positions[i + b])
        mini_batch_data.append(features)
        mini_batch_move.append(move)

    return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))),
            Variable(cuda.to_gpu(np.array(mini_batch_move, dtype=np.int32))))

def mini_batch_for_test(positions, batchsize):
    mini_batch_data = []
    mini_batch_move = []
    for b in range(batchsize):
        features, move, win = make_features(random.choice(positions))
        mini_batch_data.append(features)
        mini_batch_move.append(move)

    return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))),
            Variable(cuda.to_gpu(np.array(mini_batch_move, dtype=np.int32))))

# train
logging.info('start training')
itr = 0
sum_loss = 0
for e in range(args.epoch):
    positions_train_shuffled = random.sample(positions_train, len(positions_train))

    itr_epoch = 0
    sum_loss_epoch = 0
    for i in range(0, len(positions_train_shuffled) - args.batchsize, args.batchsize):
        x, t = mini_batch(positions_train_shuffled, i, args.batchsize)
        y = model(x)

        model.cleargrads()
        loss = F.softmax_cross_entropy(y, t)
        loss.backward()
        optimizer.update()

        itr += 1
        sum_loss += loss.data
        itr_epoch += 1
        sum_loss_epoch += loss.data

        # print train loss and test accuracy
        if optimizer.t % args.eval_interval == 0:
            x, t = mini_batch_for_test(positions_test, args.test_batchsize)
            y = model(x)
            logging.info('epoch = {}, iteration = {}, loss = {}, accuracy = {}'.format(optimizer.epoch + 1, optimizer.t, sum_loss / itr, F.accuracy(y, t).data))
            itr = 0
            sum_loss = 0

    # validate test data
    logging.info('validate test data')
    itr_test = 0
    sum_test_accuracy = 0
    for i in range(0, len(positions_test) - args.batchsize, args.batchsize):
        x, t = mini_batch(positions_test, i, args.batchsize)
        y = model(x)
        itr_test += 1
        sum_test_accuracy += F.accuracy(y, t).data
    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))

    optimizer.new_epoch()

logging.info('save the model')
serializers.save_npz(args.model, model)
logging.info('save the optimizer')
serializers.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 というファイルを探し出そうとしています。
正しいパスを読み込ませようと考えましたが方法がわかりません。
もしよければご教授いただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

表示がエスケープされているだけで文字列自体は正しい可能性もあります。エラーメッセージでどっちになるか(エスケープされるかどうか)はちょっとわからないので、エラー箇所直前(13行に挿入)でprint(filepath)してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/14 00:34

    返信ありがとうございます。
    read_kifu.pyの13行目にprint(filepath)としたところエラーメッセージは以下のようになりました。

    2018/05/13 15:29:05 INFO read kifu start
    2016\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csa
    ---------------------------------------------------------------------------
    FileNotFoundError Traceback (most recent call last)
    <ipython-input-9-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)
    12 filepath = line.rstrip('\r\n')
    13 print(filepath)
    ---> 14 kifu = shogi.CSA.Parser.parse_file(filepath)[0]
    15 win_color = shogi.BLACK if kifu['win'] == 'b' else shogi.WHITE
    16 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

    FileNotFoundError: [Errno 2] No such file or directory: '2016\\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csa'

    文字列自体は正しく認識されているという事でしょうか?
    そしてエラーメッセージのError5がError2に変化していますがよくわかりません。

    キャンセル

  • 2018/05/14 00:41

    2016\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csaがprintの出力ですか? それなら、文字列としては正しいのでしょう
    No such file or directoryになったのは、カレントディレクトリでも変わったのでは?

    キャンセル

  • 2018/05/14 13:57

    カレントディレクトリが変わってました。
    戻したらもとのエラーに戻りました。
    ファイル名は正しく読み込まれているのに探せないというのはどういうことなのでしょうか?
    Windowsでは動いただけにcolaboratoryでの挙動の理由がわかりません。

    キャンセル

  • 2018/05/14 14:13

    colaboratoryでのファイル読み書きはなんか色々面倒くさい作法があるみたいなので、この辺りでミスってるんですかねぇ・・・
    https://qiita.com/uni-3/items/201aaa2708260cc790b8
    https://qiita.com/yoshizaki_kkgk/items/bf01842d1a80c0f9e56c

    キャンセル

  • 2018/05/14 17:39

    情報ありがとうございます。
    driveをディレクトリとしてマウントすることには成功していたようで、
    ’# drive mean root directory of google drive
    !mkdir -p drive
    !google-drive-ocamlfuse drive
    !ls drive/csaがあるファイルパス’
    としたところcsaファイルがアップデートされていることが確認できました。

    このcsaファイルが入っているディレクトリに移動してkifu=shogi.CSA.Parser.parse_file('ファイル名)[0]としたところ棋譜を読み込めました。
    しかし一つ上のディレクトリからファイル名を'フォルダ\ファイル名'として同様に棋譜を読み込んだ場合は上のエラーが発生しました。
    一度コードやテキスト内のファイル名を書き換え、ディレクトリの位置をいろいろ変えることで動かしてみます。

    キャンセル

  • 2018/05/14 23:08

    棋譜が入っているディレクトリに全てのコードを移動することで無事にcolaboratoryでの学習を行うことができました。
    パスがファイル名のみの場合では読み込みができてもディレクトリを含めたパスだと読み込めないという状況だったようです?
    なんにせよ解決できたので良かったです
    hayataka2049さんありがとうございました。
    行動の指針がわかりやすくなり非常に助かりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    9104questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    7315questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。