Tensorflow:使用 Adam 优化器

Tensorflow: Using Adam optimizer

我正在试验 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)]]

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

AdamOptimizer class 创建了额外的变量,称为 "slots",以保存 "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)

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

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

sess = tf.Session()

进入

sess = tf.InteractiveSession()

FailedPreconditionError: Attempting to use uninitialized value is one of the most frequent errors related to tensorflow. From official documentation, FailedPreconditionError

This exception is most commonly raised when running an operation that reads a tf.Variable before it has been initialized.

在您的情况下,错误甚至解释了未初始化的变量: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

运行 在 AdamOptimizer 之后初始化,并且在 运行 init

之前没有定义初始化

sess.run(tf.initialize_all_variables())

sess.run(tf.global_variables_initializer())

您需要在会话中调用 tf.global_variables_initializer(),例如

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

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