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

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

新規登録して質問してみよう
ただいま回答率
85.35%
データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

機械学習

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

Python

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

Q&A

0回答

623閲覧

大量データの読み込み

hanaaaa

総合スコア5

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

機械学習

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

Python

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

0グッド

0クリップ

投稿2020/10/22 04:37

編集2020/10/26 04:58

前提・実現したいこと

画像処理の学習プログラムを作成しています。
今回、70万枚ほどのデータを入力データとするのですが、データ量が大きく、読み込む際に以下のプログラムを実行途中でPCが固まってしまいます。
まだ学習を行う以前の問題なのですが、この際にはどう対処すればよいでしょうか...?

該当のソースコード

Jupyternotebook

1# 入力データの読み込み 2 3# 入力画像ディレクトリのパス 4input_dir = os.path.join('fiw','fiwlist') 5# 各画像の縦横サイズ 6image_size=224 7 8print("Loading image data from [{}] ...".format(input_dir)) 9 10# x: 入力画像,y: 教師ラベル 11x = None 12y = None 13x, y = load_fiw_fiwlist(input_dir, image_size) 14

出力

Loading image data from [fiw/fiwlist] ...

読み込みを行っているのですが、このまま固まってしまいます。

試したこと

バッチサイズを設定してみましたが、うまく行きません。。

補足情報(入力データのプログラム(該当ソースの前に実行))

Jupyternotebook

1# データセットの読み込み関数 2def load_fiw_fiwlist(input_dir, img_size): 3 # 画像ファイル名が記載されたファイル 4 file_list_path = os.path.join(input_dir,'data_new2','filename.txt') 5 6 # ファイル行数取得 7 f_rows = sum([1 for _ in open('fiw/fiwlist/maisuu.txt')]) 8 a=1 9 10 # 1からファイル最終行まで 11 while a<=f_rows: 12 # 指定行をファイルから改行コードを削除して取得 13 target_line = linecache.getline('fiw/fiwlist/maisuu.txt', int(a)).rstrip('\n') 14 15 # linecacheのキャッシュクリア 16 linecache.clearcache() 17 # 各ラベルの画像数 18 label_data=int(target_line) 19 20 x = [] 21 y = [] 22 label_idx=0 23 24 25 f = open(file_list_path, 'r', encoding='utf-8') 26 # 各画像ファイルを読み込む 27 for i, line in enumerate(f): 28 if i > 0 and (i % label_data) == 0: 29 label_idx = label_idx + 1 30 31 filename = os.path.join(input_dir, 'data_new2', line.strip()) 32 #print("Loading image No: {} Label: {}: path: [{}] ...".format(i, label_idx, filename)) 33 try: 34 img =img_to_array( load_img(filename, target_size = (image_size, image_size))) 35 loader_data=DataLoader(dataset=img,batch_size=16384,shuffle=True,num_workers=4) 36 x.append(loader_data) 37 y.append(label_idx) 38 except ZeroDivisionError: 39 print("ZeroDivisionError!!") 40 pass 41 a=a+1 42 return x,y

上記のデータを、「該当のソースコード」で記載した入力データ読込のところで読み込み量を制限し、入力すれば良いということでしょうか...?

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

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

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

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

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

ebal

2020/10/22 04:43

同じプログラムで,例えば10万程度ならば動くのでしょうか? また,該当ソースの前に実行と書かれていることからJupyterと考えていますが,いずれにせよ実行環境の記載をお願いします.
meg_

2020/10/22 04:49

マシンスペックを記載してください。
hanaaaa

2020/10/22 04:52

ご返答ありがとうございます。 500枚で仮実行した際は無事動きました。やはり、10万程度で試さなければならないでしょうか? 未熟な掲載で申し訳ございません。ご指摘ありがとうございます。
ebal

2020/10/22 04:56

10万は適当な数字で,取り敢えずプログラム自体の正当性を確認する手段です. ただ,500で動いたとのことなのでおそらく全部メモリに載せるのは無理,ということなんでしょうが. モデルの更新とメモリへの画像の展開を交互に行い合計して70万目指すのが良さそうですね.
hanaaaa

2020/10/22 05:00

ありがとうございます。 それは一気に実行は難しく、データを分けて行うということでしょうか...? 可能であれば詳しくお伺いしたいです。
ebal

2020/10/22 05:18

メモリにデータが乗らない以上分けて,というか一部ずつで学習を行う必要があるだろうなという予想です. どんなモデルを学習しようとしているのか不明ですが,画像に対するラベル付けのモデルならおそらくは画像とラベルペアのリストをわたして学習を進めるすることでしょう. であれば部分部分で学習を進めても結果に大差は無いはずです. (一番手っ取り早いのは強い環境を用意することですが)
hanaaaa

2020/10/22 05:24

ご返答ありがとうございます。 一度試させていただきます!
bsdfan

2020/10/22 06:59

全部を一度にメモリにのせようとすると、224x224の大きさの画像でRGB1バイトずつとして、単純計算で 224x224x3x700000 で、100GBをこえるメモリが必要ですね。
toast-uz

2020/10/22 15:12

既に多くの皆さんがよいアドバイスをされていますので、回答に書かずにこちらに記載します。 (1) メモリに乗る量を計算して、一度に読み込んで学習する量を制限してください。(1万枚くらい?) (2) 学習曲線を見て、もっと量を学習したほうがよいのか見極めてください。 (3) もっと学習が必要なら、セーブしたモデルをロードして、次のバッチを学習して、と繰り返してください。逆に学習曲線が収束していると、そのまま続けても無意味です。さらに、精度を高めたい場合は、もっと複雑なモデルに変えてみるとかが必要です。
hanaaaa

2020/10/26 05:05

確認が遅くなり申し訳ございません。bsdfanさん、toast-uzさんご返答ありがとうございます。 toast-uzさんに質問なのですが、一度に読み込む量は入力データを読込む際に指定するのか、そもそもプログラムにデータを入れる時点で制限するのか、どちらでしょうか...? 私自身、このような大きなデータを扱うのが初めてで、ご返答の正しい理解ができておらず申し訳ございません。可能であれば回答をお伺いしたいです。
toast-uz

2020/10/26 10:54

> 一度に読み込む量は入力データを読込む際に指定するのか、そもそもプログラムにデータを入れる時点で制限するのか、どちらでしょうか...? 「入力データを読み込む」と「プログラムにデータを入れる」とは同じ意味だと思うのですが、違うのでしょうか?
hanaaaa

2020/10/28 07:01

「プログラムにデータを入れる」 補足データのところに記載しているプログラムの中で、画像データを読み込むという部分があるのですが、そこで読み込むファイルの中に70万枚のデータが入っています。よって読み込むファイルを70万枚ではなく例えばファイル①・ファイル②・・・というように10万枚づつ分けたファイルを作成し、順に読み込むようにする 「入力データを読み込む」 該当のソースコードの部分の入力データを読み込むという部分で、70万枚の画像ファイルから一度に読み込む量を制限するのか という意味合いで考えておりました。言葉足らずで申し訳ございません。。しかし、私の言葉の表し方で言うと「入力データを読み込む」の方だと皆さんのアドバイスから考えました。おかしな質問をしてしまいし失礼いたしました。。
toast-uz

2020/10/28 10:49

すみません。ご説明された区別は全く理解できなかったのですが、ご自身で納得されたのなら、よいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問