我在Tensorflow中有关于InteractiveSession
的问题
我知道tf.InteractiveSession()
只是方便的语法
用于保持默认 session 打开的糖,基本上可以像下面这样工作:
with tf.Session() as sess:
# Do something
但是,我在网上看到了一些示例,在使用
close()
之后,它们没有在代码末尾调用InteractiveSession
。问题:
1.如果不关闭 session (如 session 泄漏)会导致任何问题吗?
2.如果我们不关闭GC,则它如何用于InteractiveSession?
最佳答案
是的,tf.InteractiveSession
只是方便的语法糖,用于保持默认 session 打开。
session 实现具有a comment
快速测试
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import tensorflow as tf
import numpy as np
def open_interactive_session():
A = tf.Variable(np.random.randn(16, 255, 255, 3).astype(np.float32))
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
def open_and_close_interactive_session():
A = tf.Variable(np.random.randn(16, 255, 255, 3).astype(np.float32))
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
sess.close()
def open_and_close_session():
A = tf.Variable(np.random.randn(16, 255, 255, 3).astype(np.float32))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--num', help='repeat', type=int, default=5)
parser.add_argument('type', choices=['interactive', 'interactive_close', 'normal'])
args = parser.parse_args()
sess_func = open_and_close_session
if args.type == 'interactive':
sess_func = open_interactive_session
elif args.type == 'interactive_close':
sess_func = open_and_close_interactive_session
for _ in range(args.num):
sess_func()
with tf.Session() as sess:
print("bytes used=", sess.run(tf.contrib.memory_stats.BytesInUse()))
给
"""
python example_session2.py interactive
('bytes used=', 405776640)
python example_session2.py interactive_close
('bytes used=', 7680)
python example_session2.py
('bytes used=', 7680)
"""
当不关闭 session 时,这会引发 session 泄漏。请注意,即使关闭 session 时,TensorFlow中目前也存在漏洞,每个 session 保留1280个字节,请参见Tensorflow leaks 1280 bytes with each session opened and closed?。 (现在已解决)。
此外,
__del__
中有一些逻辑试图启动GC。有趣的是,我从未看到过警告
这似乎是implemented。它猜测InteractiveSession的唯一存在理由是它在Jupyter Notebookfiles或不事件的shell中与
.eval()
结合使用。但是我建议不要使用eval(请参阅Official ZeroOut gradient example error: AttributeError: 'list' object has no attribute 'eval')我对此并不感到惊讶。猜测在进行一些malloc之后没有
free
或delete
的情况下有多少代码段。祝福操作系统释放内存。关于python - tensorflow InteractiveSession()之后是否有必要关闭 session ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50229091/