问题描述
在实际应用或比赛中,经常会用到交叉验证(10倍或5倍)来提高泛化能力,这样在预测时需要加载多个模型。常用的方法为
mods = []
from keras.utils.generic_utils import CustomObjectScope
with CustomObjectScope({}):
for model_file in tqdm.tqdm(model_files):
mod = keras.models.load_model(model_file)
mods.append(mod)
return mods
使用这种方式时会发现,刚开始模型加载速度很快,但随着加载的模型数量增多,加载速度越来越慢,甚至延长了3倍以上。那么为什么会出现这种现象呢?
原因
由于tensorflow的图是静态图,但是如果直接加在不同的图(即不同的模型),应该都会存在内存中,原有的图并不会释放,因此造成了测试速度越来越慢。参考https://blog.csdn.net/holmes_MX/article/details/82659869
解决方案
知道了原因,解决方案也就有了:每加载一个模型就对所有测试数据进行评估,同时在每次加载模型前,对当前session进行重置。keras的tf后台提供了clear_session
方法来清除session
import keras.backend.tensorflow_backend as KTF
KTF.clear_session()
session = tf.Session(config=config)
KTF.set_session(session)
with CustomObjectScope({}):
model = keras.models.load_model(model_file)
return model