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

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

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

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

Google Colaboratory

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

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

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

Q&A

解決済

2回答

7202閲覧

Python・for文でメモリリークしてクラッシュしてしまう。スマートな解決策求む....

Lana1114

総合スコア25

Keras

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

Google Colaboratory

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

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

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

0グッド

0クリップ

投稿2019/11/21 05:52

編集2019/11/21 06:48

MNISTデータセットで訓練したモデルたちを自前の手書き画像で検証したい。

発生している問題・エラーメッセージ

パラメーターを少しいじった18通りの訓練させたモデルをhdf5ファイルとして保存して、for文を使って自作で用意した手書き数字画像を使って検証しようとしたら、メモリリークしてしまいます。
for文を使わずに、1つずつやればメモリリークすることはないのですが、せっかくなので解決策を探そうとしたのですが、太刀打ちできませんでした....

使用可能な RAM をすべて使用した後で、セッションがクラッシュしました。

クラッシュが起こったことに対しての質問・気になった点

  1. メモリーを開放?する方法、またはメモリの使用量を抑える方法
  2. そもそもクラッシュした理由として、何故こんなにメモリを使っているのか

該当のソースコード

Python

1# 数字画像の読み込みとリサイズ 2import cv2 3import matplotlib.pyplot as plt 4import pandas as pd 5 6img_raw_list = [] 7img_resize_list = [] 8 9for x in range(10): 10 img_raw_list.append(255 - cv2.imread('{}.png'.format(x), flags=cv2.IMREAD_GRAYSCALE)) 11 img_resize_list.append(cv2.resize(img_raw_list[x], (28,28))) 12 13for i in range(0, 10, 2): 14 fig1, axes1 = plt.subplots(1, 4) 15 axes1[0].imshow(img_raw_list[i]) 16 axes1[1].imshow(img_resize_list[i]) 17 axes1[2].imshow(img_raw_list[i + 1]) 18 axes1[3].imshow(img_resize_list[i + 1]) 19 fig1.tight_layout() 20 plt.show() 21 22plt.savefig('Numbers.png')

上記の画像を用いて検証します
上記の画像を用いて検証します

Python

1import cv2 2import matplotlib.pyplot as plt 3 4#答えの判定用 5label = list(range(10)) 6#各モデルで用意した手書き数字を検証した際の結果を保存するやつ 7result_list = [] 8#各モデルでの正答率 9result_acc = [] 10#作ったモデル 11histories = ['Adam', 12 'SGD', 13 'RMSprop', 14 'batch_64', 15 'batch_1024', 16 'batch_2048', 17 'layer_5', 18 'layer_6', 19 'layer_7', 20 'Unit256', 21 'Unit1024', 22 'Unit2048', 23 'Linear', 24 'Sigmoid', 25 'Softplus', 26 'Epoch_10', 27 'Epoch_50', 28 'Epoch_100'] 29 30#問題のfor文 31for history in histories: 32 #途中経過を確認するための出力 33 print('Running {}'.format(history)) 34 35 result = [] 36 #正答率を計算する用 37 count = 0 38 for x in range(10): 39 input = img_resize_list[x].reshape((1,784)) 40 input = input.astype('float32') 41 input /= 255 42 43 # 学習済みモデルの読み込み 44 from keras.models import load_model 45 model = tf.keras.models.load_model('model_{}.hdf5'.format(history)) 46 47 # 手書き数字の予測 48 pred = model.predict(input, verbose=0) 49 result.append(pred.argmax()) 50 #正答率の計算 51 if label[x] == (pred.argmax()).astype(int): 52 count += 1 53 result_list.append(result) 54 result_acc.append(count/10) 55 56#pandas使って表として出そうとしてます 57df = pd.DataFrame(result_list, index = histories, columns = label) 58df['Accuracy'] = result_acc 59fig2, axes2 = plt.subplots() 60axes2.axis('off') 61tbl = axes2.table(cellText = df.values, 62 colLabels=df.columns, 63 rowLabels=df.index) 64 65#表を画像として保存 66plt.savefig('Accuracy.png') 67plt.show()

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

google colab(RAM:25.51GB)

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

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

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

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

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

meg_

2019/11/21 12:54

pandasはメモリ使用量が大きいですが、pandasを使わない場合でもメモリオーバーしていますか?
Q71

2019/11/23 13:38

どこで処理が止まりますか。例えば、あちこちにprintで経過を出力すれば、何処まで実行できたかわかります。
Lana1114

2019/11/23 13:41

meg_さん Pandasを使ってもオーバーしてしまいます。
Lana1114

2019/11/23 13:43

Q71さん layer_7かUnit256のどっちかで落ちます。
Q71

2019/11/23 15:07

上のforと下のfor、それぞれ何処まで回っているかとか、なんで情報を細切れにするんだろう
guest

回答2

0

ベストアンサー

貴方のいうスマートとは程遠い意見かも知れませんが、関数を使ってはいかがでしょうか?
きっと不要なデータがメモリに残っている気がします。
特に一番の原因と想定される部分は関数でしっかりと分けた方が良いと思います。
これは一例なので、そのままコピーしたらエラーが出るかも知れません、分割出来る場所はしっかりと分割した方が、メモリが解放されるのでメモリリークを起こす心配もなくと思います。

あと、resultが更新されずに10回謎に配列に代入され続けている気がします。

def func1(): #問題のfor文 for history in histories: #途中経過を確認するための出力 print('Running {}'.format(history))   #正答率を計算する用 count = 0 for x in range(10): if func2(): count += 1 def func2(count = 0) -> bool: returnAnswer = False input = img_resize_list[x].reshape((1,784)) input = input.astype('float32') input /= 255 # 学習済みモデルの読み込み from keras.models import load_model model = tf.keras.models.load_model('model_{}.hdf5'.format(history)) # 手書き数字の予測 pred = model.predict(input, verbose=0) result = pred.argmax() #下記を見直した方がいいと思います。 #正答率の計算 if label[x] == (pred.argmax()).astype(int): returnAnswer = True result_list.append(result) result_acc.append(count/10)

投稿2019/11/26 02:33

stdio

総合スコア3307

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

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

0

まずは、メモリプロファイルを取ってみるとか?
https://www.google.com/search?q=python+memory_profiler

投稿2019/11/26 00:29

shiracamus

総合スコア5406

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問