TensorFlow节点对象无法被Python垃圾收集器回收,会导致内存溢出,有什么好办法?
我在使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
在我遇到的问题中,我在for循环内部是对指向图片数据的对象的变量名做了del操作的,比如del image_file 请问我应该修改为类似于image_file = None这样的写法吗?
我试了一下,仍然不能回收tf节点对象,感谢您的回答
主动将对象的指针设置为None
链接失效,怎么解决的,博主