Python 在会话之间重用TensorFlow变量的值,而不写入磁盘

Python 在会话之间重用TensorFlow变量的值,而不写入磁盘,python,tensorflow,Python,Tensorflow,在sklearn中,我习惯于有一个模型,可以运行fit,然后运行predict。但是,使用TensorFlow,在调用predict时,从fit加载学习的参数时遇到问题。归根结底,我不知道如何在会话之间重用变量的值。比如说, import tensorflow as tf x = tf.Variable(0.0) # fit code with tf.Session() as sess1: sess1.run(tf.global_variables_initializer())

在sklearn中,我习惯于有一个模型,可以运行
fit
,然后运行
predict
。但是,使用TensorFlow,在调用
predict
时,从
fit
加载学习的参数时遇到问题。归根结底,我不知道如何在会话之间重用变量的值。比如说,

import tensorflow as tf

x = tf.Variable(0.0)

# fit code
with tf.Session() as sess1:
    sess1.run(tf.global_variables_initializer())
    sess1.run(tf.assign(x, 1.0)) # at end of training, x = 1.0

# predict code
with tf.Session() as sess2:
    sess2.run(tf.global_variables_initializer())
    print(sess2.run(x)) # want this to be 1.0, but is 0.0
我可以想出一种解决方法,但它看起来非常粗糙,如果有几个变量我想重用,那就很烦人了:

import tensorflow as tf

x = tf.Variable(0.0)

# fit code
with tf.Session() as sess1:
    sess1.run(tf.global_variables_initializer())
    sess1.run(tf.assign(x, 1.0)) # at end of training, x = 1.0
    learned_x = sess1.run(x) # remember value of learned x at end of session

# predict code
with tf.Session() as sess2:
    sess2.run(tf.global_variables_initializer())
    sess2.run(tf.assign(x, learned_x))
    print(sess2.run(x)) # prints 1.0

如何在会话之间重用变量而不写入磁盘(即使用
tf.train.Saver
)?我上面写的解决方法是正确的吗?

要模仿sklearn的模型,只需将会话包装到一个类中,以便您可以在方法之间共享它,例如

class Model:
    def __init__(self):
        self.graph = self.build_graph()
        self.session = tf.Session()
        self.session.run(tf.global_variables_initializer())

    def build_graph(self):
        return {'x': tf.Variable(0.0)}

    def fit(self):
        self.session.run(tf.assign(self.graph['x'], 1.0))

    def predict(self):
        print(self.session.run(self.graph['x']))

    def close(self):
        tf.reset_default_graph()
        self.session.close()

m = Model()
m.fit()
m.predict()
m.close()

确保手动关闭
会话
,并相应地处理异常。

为什么不使用tf.train.Saver?这就是在tensorflow中恢复模型和重用变量的方式。这对你来说更像是一个范式转换的问题吗?从头到尾tensorflow@ShreeshaN这不需要磁盘写入吗?是的。它符合你的目的for@ShreeshaN正如我在问题中所说,我希望避免磁盘写入,因为它很昂贵,而且我正在进行大型超参数搜索,所以它应该是可并行的