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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

機械学習

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

Python

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

Q&A

解決済

1回答

5077閲覧

CNNを用いた画像認識でMemoryErrorが発生

tks_0312

総合スコア24

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

機械学習

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

Python

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

0グッド

1クリップ

投稿2019/07/24 07:42

qiitaの記事を参考に、画像認識のプログラムを作成したいと思っています。
記事の内容をコピーして動かしてみたところ、MemoryErrorが表示されてしまいました。

原因ですが、記事中では画像数は500枚程度と記載があったのですが、
今回検証で利用した画像数が8000枚程度あるためではないかと考えています。

メモリ負荷を軽減するために、どのような工夫をすれば良いか、
ご教示いただけますと幸いです。

#ラベリングによる学習/検証データの準備 from PIL import Image import os, glob import numpy as np import random, math #画像が保存されているルートディレクトリのパス root_dir = r"C:\Users\python\cnn" # 商品名 categories = ["UP","DOWN","YOKO"] # 画像データ用配列 X = [] # ラベルデータ用配列 Y = [] #画像データごとにadd_sample()を呼び出し、X,Yの配列を返す関数 def make_sample(files): global X, Y X = [] Y = [] for cat, fname in files: add_sample(cat, fname) return np.array(X), np.array(Y) #渡された画像データを読み込んでXに格納し、また、 #画像データに対応するcategoriesのidxをY格納する関数 def add_sample(cat, fname): img = Image.open(fname) img = img.convert("RGB") img = img.resize((150, 150)) data = np.asarray(img) X.append(data) Y.append(cat) #全データ格納用配列 allfiles = [] #カテゴリ配列の各値と、それに対応するidxを認識し、全データをallfilesにまとめる for idx, cat in enumerate(categories): image_dir = root_dir + "/" + cat files = glob.glob(image_dir + "/*.png") for f in files: allfiles.append((idx, f)) #シャッフル後、学習データと検証データに分ける random.shuffle(allfiles) th = math.floor(len(allfiles) * 0.8) train = allfiles[0:th] test = allfiles[th:] X_train, y_train = make_sample(train) X_test, y_test = make_sample(test) xy = (X_train, X_test, y_train, y_test) #データを保存する(データの名前を「tea_data.npy」としている) np.save(r"C:\Users\python\cnn\save_data\tea_data.npy", xy)

以下、エラー文です

--------------------------------------------------------------------------- MemoryError Traceback (most recent call last) <ipython-input-3-ad173c75b3a6> in <module>() 54 xy = (X_train, X_test, y_train, y_test) 55 #データを保存する(データの名前を「tea_data.npy」としている) ---> 56 np.save(r"C:\Users\python\cnn\save_data\tea_data.npy", xy) ~\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\lib\npyio.py in save(file, arr, allow_pickle, fix_imports) 527 arr = np.asanyarray(arr) 528 format.write_array(fid, arr, allow_pickle=allow_pickle, --> 529 pickle_kwargs=pickle_kwargs) 530 finally: 531 if own_fid: ~\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\lib\format.py in write_array(fp, array, version, allow_pickle, pickle_kwargs) 627 if pickle_kwargs is None: 628 pickle_kwargs = {} --> 629 pickle.dump(array, fp, protocol=2, **pickle_kwargs) 630 elif array.flags.f_contiguous and not array.flags.c_contiguous: 631 if isfileobj(fp): MemoryError:

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

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

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

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

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

tiitoi

2019/07/24 07:48 編集

1万枚近くの画像をすべて読み込んでメモリに展開するのではなく、学習時に必要な分だけ読み込むようにすればどうでしょうか? 一般的に大量の画像を学習する場合はそうします。
tks_0312

2019/07/24 08:55

コメントありがとうございます。 コードにある「np.save(r"C:\Users\python\cnn\save_data\tea_data.npy", xy)」の 書き込みデータ(xy)が膨大なため発生していると思われるのですが、 書き込みデータ(xy)を小分けにして保存していくというイメージでしょうか? 小分けにして、あとで連結して保存したい場合どのようにすれば良いかご教示いただけますと幸いです。
tiitoi

2019/07/24 09:10 編集

とりあえず、それぞれ別のファイルにすれば保存できるかどうかを試されてはどうでしょうか。 np.save(r"C:\Users\python\cnn\save_data\X_train.npy", X_train) np.save(r"C:\Users\python\cnn\save_data\X_test.npy", X_test) np.save(r"C:\Users\python\cnn\save_data\y_train.npy", y_train) np.save(r"C:\Users\python\cnn\save_data\y_test.npy", y_test)
tks_0312

2019/07/24 09:20

別々に保存したところ、できました! ありがとうございました!
tks_0312

2019/07/24 09:21

BAにしたいので、お手数ですが、回答欄にご回答いただけますでしょうか。 よろしくお願い申し上げます。
tiitoi

2019/07/24 09:25

解決されたようでよかったです。 回答のほうに転記しました。
guest

回答1

0

ベストアンサー

次のように別々のファイルとして保存してみてください。

python

1np.save(r"C:\Users\python\cnn\save_data\X_train.npy", X_train) 2np.save(r"C:\Users\python\cnn\save_data\X_test.npy", X_test) 3np.save(r"C:\Users\python\cnn\save_data\y_train.npy", y_train) 4np.save(r"C:\Users\python\cnn\save_data\y_test.npy", y_test)

投稿2019/07/24 09:24

tiitoi

総合スコア21954

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

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

tks_0312

2019/07/24 09:26

早々にご回答いただきまして、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問