为什么tensorflow初始化类中的变量失败?

时间:2018-03-20 03:43:57

标签: python tensorflow

简化代码如下:

class ExModel(object):
    def __init__(self, graph=None):

        if graph is None:
            self.graph = tf.get_default_graph()
        else:
            self.graph = graph

        self.sess = tf.Session(graph=self.graph)

        self.init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
        self.build_model()

        print(self.sess.run(tf.report_uninitialized_variables()))  # [b'global_step']
        print(self.sess.run(self._global_step))  # uninitialized error

    def build_model(self):
        with self.graph.as_default():
            self._global_step = tf.Variable(0, trainable=False, name='global_step')

        self.sess.run(self.init_op)

if __name__ == '__main__':
    model = ExModel()

它显示use uninitialized value错误。

与下面的代码似乎没什么区别,但它可以很好地运作。

if __name__ == '__main__':
    # model = ExModel()

    graph = tf.get_default_graph()

    sess = tf.Session(graph=graph)

    with graph.as_default():
        global_step = tf.Variable(0, trainable=False, name='global_step')

    sess.run(tf.global_variables_initializer())
    print(sess.run(global_step))

请帮助我,问题一整天都折磨着我。

我读过另一个question。我认为我的错误是熟悉它,但我不知道如何使global_variables_initializer与会话相同的图形关联,我只使用默认图形。

我发现何时使用self.sess.run(tf.global_variables_initializer())替换

self.init_op = tf.global_variables_initializer()
self.sess.run(self.init_op)

可以很好地运作。但我仍然不知道原因。

1 个答案:

答案 0 :(得分:0)

问题是init_op = tf.global_variables_initializer()应该在所有变量的最后定义。

应该是

global_step = tf.Variable(0, trainable=False, name='global_step')
...
init_op = tf.global_variables_initializer()
sess.run(init_op)

但不是

init_op = tf.global_variables_initializer()
global_step = tf.Variable(0, trainable=False, name='global_step')
...
sess.run(init_op)