🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

2回答

6277閲覧

HDF5ファイルについて(画像データ)

spider-man

総合スコア94

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

1グッド

1クリップ

投稿2019/09/12 16:07

編集2019/09/13 05:34

前提・実現したいこと

 Google Colaboratory上でGPUを使ったCNNの学習を行いたいと思っています。しかし、手元にある画像ファイル3万枚について、正常に読み込めずセッションタイムアウトになってしまいます。

試したこと

 色々調べてみた結果、GoogleColaboratoryのよくある質問に「Google ドライブのオペレーションは、フォルダ内のファイル数やサブフォルダ数が増えすぎるとタイムアウトすることがあります。」と書いてありました。そこで、ローカルにある画像データを下記質問参考にHDF5ファイルとしてまとめようとしましたが、いまいちやり方が分からず質問させていただきました。
HDFファイルへの書き込み&HDFファイル化したものから元の画像ファイルとしての読み込み。両方の処理を教えていただければと思います。

https://teratail.com/questions/182393

補足情報(FW/ツールのバージョンなど)

  • 実装の際の言語はPython3で考えています。
  • 使用ライブラリはh5pyで考えています。
  • フォルダ直下の画像ファイルのみをHDFファイルにするプラス正解ラベルについてもgroup化したいと思います。尚、回帰問題ですので正解ラベルがfloat型で数字1つになります。
  • 正解ラベルについては、後ほど自分で
  • 画像ファイルの格納場所は ./train_images(相対パス)です。
  • 正解ラベルの格納場所は ./train.csv(相対パス)です。
KotaYoneda👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakame

2019/09/13 03:25

> しかし、手元にある画像ファイル3万枚について、正常に読み込めずセッションタイムアウトになってしまいます。 どのタイミングでセッションアウトされるのでしょうか。質問者さんのGoogle Colaboratoryを公開しても問題ないものであるならば、共有リンクをこちらに貼ってもらえるとすぐ問題を共有できるかなと思いました。
spider-man

2019/09/13 05:06

wakameさん ご丁寧にありがとうございます!実は仕事の関係上、ノートブックの公開は厳しいかもしれません。。。(本当は詳しい方にチェックして頂きたい気持ちはあるのですが) 具体的な症状は以下の通りです。 1. erroeがでるタイミング dataloaderからデータを取ってくるところ。尚、該当コードは他の環境では動いている次第です。 ```python for images, targets in dataloader: ``` 2. エラーメッセージ ``` AttributeError: Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/torch/utils/data/_utils/worker.py", line 99, in _worker_loop samples = collate_fn([dataset[i] for i in batch_indices]) File "/usr/local/lib/python3.6/dist-packages/torch/utils/data/_utils/worker.py", line 99, in <listcomp> samples = collate_fn([dataset[i] for i in batch_indices]) File "<ipython-input-14-7108891d668a>", line 15, in __getitem__ augmented = self.transforms(image=img, mask=mask) File "/usr/local/lib/python3.6/dist-packages/albumentations/core/composition.py", line 171, in __call__ data = t(**data) File "/usr/local/lib/python3.6/dist-packages/albumentations/core/transforms_interface.py", line 28, in __call__ params = self.update_params(params, **kwargs) File "/usr/local/lib/python3.6/dist-packages/albumentations/core/transforms_interface.py", line 68, in update_params params.update({'cols': kwargs['image'].shape[1], 'rows': kwargs['image'].shape[0]}) AttributeError: 'NoneType' object has no attribute 'shape' ``` このメッセージを見て、おそらく正しく画像ファイルを読み込めてないのだろうと考えました。そこで色々調べたみたところ、上記のGoogleColaboratoryに良くある質問 GoogleColaboratoryのよくある質問に「Google ドライブのオペレーションは、フォルダ内のファイル数やサブフォルダ数が増えすぎるとタイムアウトすることがあります。」 に行き着いた次第です。試しに画像ファイズの数を100まで減らすとコードが上手く回ったので、ファイルが多すぎることが問題かと考えました。
guest

回答2

0

別回答で解決しなかったということで、HDF5ファイルに一旦書き出し、その後そのファイルの読み込みの手順はどうするのかという質問に回答します。

ローカルにある画像データを下記質問参考にHDF5ファイルとしてまとめようとしましたが、いまいちやり方が分からず質問させていただきました。

HDFファイルへの書き込み&HDFファイル化したものから元の画像ファイルとしての読み込み。両方の処理を教えていただければと思います。

下記コードはMNISTを10枚ほど切り出してh5ファイルに変換、書き込みその後読み取るものになります。

下記条件に合うようにフォルダは作るようにしました。

  • 画像ファイルの格納場所は ./train_images(相対パス)です。
  • 正解ラベルの格納場所は ./train.csv(相対パス)です。

処理の流れは以下のようになっていますが1. create_datasetはMNIST用に加工する処理なので読み飛ばして構いません。

  1. create_dataset
  2. convert_to_h5format
  3. check_h5file

以下コードを質問者様用に変更するときに気をつける点として

  • MNIST用の処理になっているので適切なheight/widthに変更してほしい
  • 3万枚に対しての処理なので処理時間が結構かかるであろう
  • 画像ファイルを一気に読み出すのでメモリサイズを気にしてほしい

という3点でしょうか。

不明点あれば質問してください。

python

1from pathlib import Path 2 3import h5py 4import numpy as np 5import pandas as pd 6from PIL import Image 7from tensorflow.python.keras.datasets import mnist 8 9h5_path = "train.h5" 10label_path = "train.csv" 11dataset_path = Path("train_images") 12 13if not dataset_path.exists(): 14 dataset_path.mkdir() 15 16 17def check_h5file(): 18 with h5py.File(h5_path, "r") as h5: 19 # H5pyDeprecationWarning: 20 # dataset.value has been deprecated. Use dataset[()] instead. 21 # print(h5["labels"].value) 22 labels = h5["labels"][()] 23 images = h5["images"][()] 24 # print(images) 25 print(labels) 26 print(type(images)) 27 print(type(labels)) 28 print(images.shape) 29 print(labels.shape) 30 31 32def convert_to_h5format(): 33 df = pd.read_csv(label_path) 34 labels = [] 35 image_shape = (len(list(dataset_path.glob("*.jpg"))), 28, 28) 36 images = np.empty(image_shape) 37 for idx, (img_path, label) in enumerate(zip(df["path"], df["label"])): 38 labels.append(label) 39 images[idx] = Image.open(img_path) 40 41 with h5py.File(h5_path, "w") as h5: 42 h5.create_dataset("labels", data=labels) 43 h5.create_dataset("images", data=images) 44 45 46def create_dataset(): 47 (x_train, y_train), (_, _) = mnist.load_data() 48 print(x_train.shape) 49 print(y_train.shape) 50 assert x_train.shape == (60000, 28, 28) 51 assert y_train.shape == (60000,) 52 53 length = 10 54 55 for idx, x in enumerate(x_train): 56 if idx == length: 57 break 58 img = Image.fromarray(np.uint8(x), "L") 59 img.save(dataset_path / "train_{}.jpg".format(idx)) 60 61 pd.DataFrame({"path": [str(dataset_path / "train_{}.jpg".format(idx)) for 62 idx in range(length)], 63 "label": y_train[:length]}).to_csv(label_path, index=False) 64 65 66if __name__ == '__main__': 67 # ① 68 create_dataset() 69 # ② 70 convert_to_h5format() 71 # ③ 72 check_h5file() 73

投稿2019/09/24 03:56

wakame

総合スコア1170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spider-man

2019/09/24 07:55

ありがとうございます!メモリを気にする必要は確かにありそうでしたが、うまく行きそうです。
guest

0

ベストアンサー

試しに画像ファイルの数を100まで減らすとコードが上手く回ったので、ファイルが多すぎることが問題かと考えました。

Googleドライブをマウントして問題が発生するのであれば

  1. 一旦3万枚が格納されている画像フォルダをzipにする(自PCでの作業)
  2. そのzipファイルをGoogleドライブにアップロードし直す
  3. 再度Googleドライブをマウント
  4. マウント後のファイルパス(My Drive/...)からGoogleColab側のパス(/content/...)にzipファイルをコピー(cpコマンド)

その後zipファイルを解凍して解凍後のファイルパスを参照して同様のオペレーションをやってみるのはいかがでしょうか。

投稿2019/09/13 06:06

wakame

総合スコア1170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spider-man

2019/09/22 13:28

>> wakameさん お返事遅くなってしまい申し訳ございませんでした。(中国にいた関係でGoogle Colaboratoryを操作することができませんでした。) 上記方法を試したところ、やはり同様のエラーが起こってしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問