TensorFlow图像分类程序内存持续增长致崩溃问题求助
解决TensorFlow图片分类循环中的内存泄漏问题
嗨,我来帮你排查这个内存越用越多的问题!你遇到的核心原因是每次调用classify_pictures函数时,都在重复加载TensorFlow模型图、创建新的Session,这些底层资源没有被彻底释放——Python的垃圾回收器(gc.collect())管不到TensorFlow C++后端的内存,所以强制回收也没用。
问题出在这些重复操作上
看你的代码,每次处理单张图片时:
- 重新读取并加载整个
retrained_graph.pb模型 - 创建新的
tf.Session()会话 - 甚至连标签文件
retrained_labels.txt都要重新读一遍
这些操作每次都会在内存中新增一批TensorFlow图节点和会话资源,循环次数一多,内存自然就爆了。
修复方案:复用模型和会话,只初始化一次
把模型加载、会话创建这些耗时且占内存的操作,移到函数外面(比如类的初始化方法里),只做一次,然后在循环中复用这些资源。
修改后的代码示例:
def __init__(self): os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 一次性加载标签文件,避免重复读取 self.label_lines = [line.rstrip() for line in tf.gfile.GFile("tf_files/retrained_labels.txt")] # 一次性加载模型图 with tf.gfile.FastGFile("tf_files/retrained_graph.pb", 'rb') as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) _ = tf.import_graph_def(graph_def, name='') # 创建唯一的Session并保存,后续所有预测都用它 self.sess = tf.Session() self.softmax_tensor = self.sess.graph.get_tensor_by_name('final_result:0') def classify_pictures(self, files): # 用with语句读取图片,确保文件句柄被正确关闭 with tf.gfile.FastGFile(files, 'rb') as f: image_data = f.read() # 复用已有的Session和Tensor进行预测 predictions = self.sess.run(self.softmax_tensor, {'DecodeJpeg/contents:0': image_data}) top_k = predictions[0].argsort()[-len(predictions[0]):][::-1] human_string = self.label_lines[top_k[0]] if human_string == "selfie": return "selfie" if "passport" in human_string: return "passport" if "statement" in human_string: return "bill" # 程序结束时记得关闭Session,释放资源 def close(self): self.sess.close()
额外的小优化
- 你原来的循环
for each_picture in range(0, 10)其实没起到作用,因为第一个判断就直接return了,我帮你去掉了冗余循环。 - 用
with语句处理图片文件,避免文件句柄泄漏(虽然这个不是内存暴涨的主因,但也是好习惯)。
这样修改后,每次循环处理图片时,只会加载当前图片的数据,复用已经初始化好的模型和会话,内存就会保持稳定了。
内容的提问来源于stack exchange,提问作者Christof Küppers
相关产品推荐
相关产品推荐

