【问题标题】:Tensorflow: Using Adam optimizerTensorflow:使用 Adam 优化器
【发布时间】:2016-02-20 17:10:52
【问题描述】:

我正在 tensorflow 中试验一些简单的模型,包括一个看起来与第一个 MNIST for ML Beginners example 非常相似的模型,但维度更大。我可以毫无问题地使用梯度下降优化器,获得足够好的收敛性。当我尝试使用 ADAM 优化器时,我收到如下错误:

tensorflow.python.framework.errors.FailedPreconditionError: Attempting to use uninitialized value Variable_21/Adam
     [[Node: Adam_2/update_Variable_21/ApplyAdam = ApplyAdam[T=DT_FLOAT, use_locking=false, _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_21, Variable_21/Adam, Variable_21/Adam_1, beta1_power_2, beta2_power_2, Adam_2/learning_rate, Adam_2/beta1, Adam_2/beta2, Adam_2/epsilon, gradients_11/add_10_grad/tuple/control_dependency_1)]]

抱怨未初始化的特定变量根据运行而变化。这个错误是什么意思?它表明什么是错误的?无论我使用什么学习率,它似乎都会发生。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    您需要在会话中致电tf.global_variables_initializer(),例如

    init = tf.global_variables_initializer()
    sess.run(init)
    

    这个很棒的教程中提供了完整的示例 https://www.tensorflow.org/get_started/mnist/mechanics

    【讨论】:

      【解决方案2】:

      在 AdamOptimizer 之后运行 init,并且在之前没有定义 init 或运行 init

      sess.run(tf.initialize_all_variables())

      sess.run(tf.global_variables_initializer())

      【讨论】:

        【解决方案3】:

        FailedPreconditionError: Attempting to use uninitialized value 是与 tensorflow 相关的最常见错误之一。来自官方文档,FailedPreconditionError

        此异常最常在运行以下操作时引发 在初始化之前读取一个 tf.Variable。

        在您的情况下,错误甚至解释了未初始化的变量:Attempting to use uninitialized value Variable_1。其中一个 TF 教程解释了很多关于变量的内容,他们的 creation/initialization/saving/loading

        基本上初始化变量你有3个选项:

        我几乎总是使用第一种方法。请记住,您应该将其放在会话运行中。所以你会得到这样的东西:

        with tf.Session() as sess:
            sess.run(tf.global_variables_initializer())
        

        如果您想了解有关变量的更多信息,请阅读this documentation 以了解如何使用report_uninitialized_variables 并查看is_variable_initialized

        【讨论】:

          【解决方案4】:

          我遇到了类似的问题。 (使用 GradientDescent 优化器训练没有问题,但使用 Adam Optimizer 或任何其他具有自己变量的优化器时会出现错误)

          更改为交互式会话为我解决了这个问题。

          sess = tf.Session()
          

          进入

          sess = tf.InteractiveSession()
          

          【讨论】:

            【解决方案5】:

            AdamOptimizer 类创建额外的变量,称为“槽”,用于保存“m”和“v”累加器的值。

            如果您好奇,请参阅此处的源代码,它实际上非常易读: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/adam.py#L39 。其他优化器,例如 Momentum 和 Adagrad 也使用插槽。

            必须先初始化这些变量,然后才能训练模型。

            初始化变量的常规方法是调用tf.initialize_all_variables(),它会在调用时添加操作来初始化图中存在的变量

            (旁白:不像它的名字暗示的那样,initialize_all_variables() 不会初始化任何东西,它只会添加在运行时初始化变量的操作。)

            你必须做的是调用initialize_all_variables()你已经添加了优化器:

            ...build your model...
            # Add the optimizer
            train_op = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
            # Add the ops to initialize variables.  These will include 
            # the optimizer slots added by AdamOptimizer().
            init_op = tf.initialize_all_variables()
            
            # launch the graph in a session
            sess = tf.Session()
            # Actually intialize the variables
            sess.run(init_op)
            # now train your model
            for ...:
              sess.run(train_op)
            

            【讨论】:

            • 假设我想在中间替换优化器(和其他变量),如何在不破坏已经训练过的变量的情况下对其进行初始化?
            • @dolbi 没有优雅的方法,但我使用我概述的方法here。您可以将tf.initialize_variables([list,of,variables])tf.all_variables() 中的新成员一起使用,因为将AdamOptimizer 添加到图表中。我不得不说,这种方法不应该用在要多次运行的代码中,但在试验时效果很好。
            • 这个答案是正确的,但是现在方法被tf.global_variables_initializer()替换了
            猜你喜欢
            • 1970-01-01
            • 2018-10-02
            • 2017-05-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-01-24
            • 1970-01-01
            相关资源
            最近更新 更多