前提:KerasをTensorflowバックエンドで使っている
やりたいこと
複数の入力データをある学習済モデル(ここではsome_modelとする)に入れたときのそれぞれの推定結果を得たい。
問題
forループでmodel.predict()を多数回呼ぶと、GPUのメモリが不足して落ちる。
以下のコードでは、for文の中でフォルダinput_dirの中にある画像を読み込み、それにモデルを適用した結果をresultsの中に逐一加えている。
import keras
import numpy as np
from keras.preprocessing import image
import os
...
results = []
filenames = os.listdir(input_dir)
for name in filenames:
img = image.load_img(input_dir+'/'+name, target_size=(256,256))
x = image.img_to_array(img)
x = np.expand_dims(x,0)
result = some_model.predict(x)
results.append(result)
解決策
一旦入力データをPython listの中に保持し、numpy.stack()で1つのNumpy arrayにまとめてから一回だけmodel.predictを呼ぶ。
images = []
filenames = os.listdir(input_dir)
for name in filenames:
img = image.load_img(input_dir+'/'+name, target_size=(256,256))
x = image.img_to_array(img)
images.append(x)
images_array = np.stack(images)
results = some_model.predict(images_array,batch_size=1)