前提・実現したいこと
Google Colaboratory上でpythonによる深層学習のコードを書いています。肯定的、否定的という二値のラベルが付いた映画レビューをリストにまとめるコードです。
具体的に言うと、IMDb(Internet Movie Database)データをテキストとしてダウンロードして展開し、個々の映画レビューを文字列のリスト(texts)にまとめ、映画レビューのラベル(肯定的、否定的)をlabelsリストにまとめます。
しかし、参考書に書いてある通りにコードを実行するのですが、エラーが出るか、実行中状態が続き、完了しません。同じ操作を何度か実行するのですが、完了はしません。コードをどう改造すれば良いですか?
恐らく参照するファイルが25000個(1フォルダに12500個。それが2フォルダあります)あり、数が膨大なためだと思います。GoogleColaboratoryのよくある質問に「Google ドライブのオペレーションは、フォルダ内のファイル数やサブフォルダ数が増えすぎるとタイムアウトすることがあります。」と書いてありました。
しかし今後、大量のファイルを使った深層学習をGoogle Colaboratory上で行いたいと考えています。研究や業務でGoogle Colaboratryを使い、大量のファイルを操作している人もいるはずです。どうすれば、それが可能になるか教えてください。
発生している問題・エラーメッセージ
エラーの場合、以下のような文言が出ます。
OSError: [Errno 5] Input/output error: 'drive/My Drive/Colab Notebooks/aclImdb/train/neg/' site:stackoverflow.com
該当のソースコード
python
1from google.colab import drive 2drive.mount('/content/drive') 3 4import os 5 6imdb_dir = 'drive/My Drive/Colab Notebooks/aclImdb' 7train_dir = os.path.join(imdb_dir, 'train') 8 9labels = [] 10texts = [] 11 12for label_type in ['neg', 'pos']: 13 dir_name = os.path.join(train_dir, label_type) 14 for fname in os.listdir(dir_name): 15 if fname[-4:] == '.txt': 16 f = open(os.path.join(dir_name, fname)) 17 texts.append(f.read()) 18 f.close() 19 if label_type == 'neg': 20 labels.append(0) 21 else: 22 labels.append(1)
試したこと
■「よくある質問」に以下のことが書いていました。(https://research.google.com/colaboratory/faq.html#drive-timeout)
Google ドライブのオペレーションは、フォルダ内のファイル数やサブフォルダ数が増えすぎるとタイムアウトすることがあります。数千件ものアイテムが最上位の「マイドライブ」フォルダの直下にあると、ドライブのマウント処理がタイムアウトする可能性が高くなります。
そこで、最上位のマイドライブフォルダ直下には計10個のフォルダとファイルしか置いていません。その状態でコードを実行しましたが、症状は改善されませんでした。
■一気に12500ファイルに順番にアクセスするコードが駄目なのかと思い、ファイルを1個ずつの束にして、1束ずつアクセスするように、コードを下記のように書き直しました。しかし、失敗しました。
ただし、1フォルダ当たりの中身をファイル500個に減らして(つまり2フォルダでファイル1000個)、下記のコードを実行すると成功しました。(ちなみに、最初に書いたコードを実行すると失敗。つまり、1個ずつの束にすることに、意味はあったのかなと考えています)
python
1from google.colab import drive 2drive.mount('/content/drive') 3 4import os 5import math 6 7def split_list(l, n): 8 for idx in range(0, len(l), n): 9 yield l[idx:idx + n] 10 11imdb_dir = 'drive/My Drive/Colab Notebooks/aclImdb' 12train_dir = os.path.join(imdb_dir, 'train') 13 14labels = [] 15texts = [] 16dir_name = [] 17result = [] 18 19for label_type in ['neg', 'pos']: 20 dir_name = os.path.join(train_dir, label_type) 21 #dir_nameを1fileずつのbatchに加工します 22 result = list(split_list(os.listdir(dir_name), 1)) 23 for x in result: 24 for fname in x: 25 # print(fname) 26 if fname[-4:] == '.txt': 27 f = open(os.path.join(dir_name, fname)) 28 texts.append(f.read()) 29 f.close() 30 if label_type == 'neg': 31 labels.append(0) 32 else: 33 labels.append(1)
補足情報(FW/ツールのバージョンなど)
参考書は『PythonとKerasによるディープラーニング』。コードは下記URLのIn [6]です。タイトルは「Download the IMDB data as raw text」
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。