TensorFlow节点对象无法被Python垃圾收集器回收,会导致内存溢出,有什么好办法?

发布于 2021-12-07 21:12:38 字数 1215 浏览 888 评论 4

我在使用TensorFlow做卷积神经网络,在数据预处理阶段,使用TensorFlow的一些方法来对大约两万张图片进行处理。但是运行的过程中,发现程序所占用内存不断增大。检查发现是这部分代码中的对象内存无法回收

import tensorflow as tf
## 对图片文件名称进行遍历,取出图片内容并做标准化处理
for image_filename in image_filenames:
    image_file = tf.read_file(image_filename)
    image = tf.image.decode_jpeg(image_file)
    grayscala_image = tf.image.rgb_to_grayscale(image)
    resized_image = tf.image.resize_images(grayscala_image, [250, 151])

我知道python的垃圾收集器是根据对象引用情况来决定是否回收内存的,所以我想查看TensorFlow对象的内存引用情况,发现如下情况:

>>> import tensorflow as tf
>>> import sys
>>> a = '你好'
>>> b = '世界'
>>> c = tf.add(a, b)
>>> sys.getrefcount(a)
2
>>> sys.getrefcount(b)
2
>>> sys.getrefcount(c)
3
>>> 

我知道“你好”这个字符串对象会分别被a 和 sys.getrefcount()方法的形参所引用,所以打印出来的结果是2. “世界”这个对象也同样是这样。这类对象在for循环之后,会被垃圾收集器收回内存。

然而,tf.add(a, b)这个TensorFlow对象就多了一个引用值,导致垃圾收集失败,在数据比较大的情况下(比如我现在的图片数据),就会导致占用内存越来越多,程序运行也越来越慢。

我试了手动del对象引用,并调用

gc.collect()

然而由于无法把tf对象的引用降为0,所以并无卵用。

请问有哪位大神遇到过此类问题吗?我想请问有什么思路可以解决这个问题。

Thanks for your time.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

你曾走过我的故事 2021-12-09 11:49:38

在我遇到的问题中,我在for循环内部是对指向图片数据的对象的变量名做了del操作的,比如del image_file 请问我应该修改为类似于image_file = None这样的写法吗?

剑心龙吟 2021-12-09 09:51:13

我试了一下,仍然不能回收tf节点对象,感谢您的回答

因为看清所以看轻 2021-12-09 03:53:29

主动将对象的指针设置为None

心舞飞扬 2021-12-08 08:13:23

链接失效,怎么解决的,博主

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文