【问题标题】:tensorflow Adamoptimizer beta1_power not initializedtensorflow Adamoptimizer beta1_power 未初始化
【发布时间】:2017-08-04 04:36:58
【问题描述】:

我正在做迁移学习,因此我预训练了一个网络,将变量 (w, b) 保存在一个文件中;关闭程序;重新打开另一个程序;恢复所有旧变量;定义了一些新的变量层,初始化它们;然后开始重新训练。 SGD 优化器在我的代码中工作,但如果我将优化器更改为 Adam,则会出现以下错误:

2017-08-03 21:28:08.785092: W tensorflow/core/framework/op_kernel.cc:1152] Failed precondition: Attempting to use uninitialized value beta1_power

我的代码:

# Session Start
sess = tf.Session()
# restore pre-trained parameters
saver = tf.train.Saver()
saver.restore(sess, "./pre_train/step1.ckpt")
# init new parameters
weights2 = {
    'fnn_w1': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1], stddev= sd), name='fnn_w1'),
    'fnn_w2': tf.Variable(tf.random_normal([n_hidden_1, 1], stddev= sd), name='fnn_w2')
}
biases2 = {
    'fnn_b1': tf.Variable(tf.ones([n_hidden_1]), name='fnn_b1'),
    'fnn_b2': tf.Variable(tf.ones([1]), name='fnn_b2')
}
parameters2 = {**weights2, **biases2}
init_params2 = tf.variables_initializer(parameters2.values())
sess.run(init_params2)

# Construct model
encoder_op = encoder(X)
focusFnn_op = focusFnn(encoder_op)  # for one gene a time prediction
decoder_op = decoder(encoder_op)  # for pearson correlation of the whole matrix #bug (8092, 0)

# Prediction and truth
y_pred = focusFnn_op  # [m, 1]
y_true = X[:, j]
y_benchmark = M[:, j]  # benchmark for cost_fnn
M_train = df2_train.values[:, j:j+1]  # benchmark for corr
M_valid = df2_valid.values[:, j:j+1]

# Define loss and optimizer, minimize the squared error
with tf.name_scope("Metrics"):
    cost_fnn = tf.reduce_mean(tf.pow(y_true - y_pred, 2))
    cost_fnn_benchmark = tf.reduce_mean(tf.pow(y_pred- y_benchmark, 2))
    cost_decoder = tf.reduce_mean(tf.pow(X - decoder_op, 2))
    cost_decoder_benchmark = tf.reduce_mean(tf.pow(decoder_op - M, 2))
    tf.summary.scalar('cost_fnn', cost_fnn)
    tf.summary.scalar('cost_fnn_benchmark', cost_fnn_benchmark)
    tf.summary.scalar('cost_decoder', cost_decoder)
    tf.summary.scalar('cost_decoder_benchmark', cost_decoder_benchmark)

# optimizer = (
#     tf.train.GradientDescentOptimizer(learning_rate).
#     minimize(cost_fnn, var_list=[list(weights2.values()), list(biases2.values())])
# )# frozen other variables

optimizer = (
    tf.train.GradientDescentOptimizer(learning_rate).
    minimize(cost_fnn)
)# frozen other variables
print("# Updated layers: ", "fnn layers\n")

train_writer = tf.summary.FileWriter(log_dir+'/train', sess.graph)
valid_writer = tf.summary.FileWriter(log_dir+'/valid', sess.graph)
# benchmark_writer = tf.summary.FileWriter(log_dir+'/benchmark', sess.graph)

# Evaluate the init network
[cost_train, h_train] = sess.run([cost_fnn, y_pred], feed_dict={X: df_train.values})
[cost_valid, h_valid] = sess.run([cost_fnn, y_pred], feed_dict={X: df_valid.values})

【问题讨论】:

    标签: python tensorflow deep-learning


    【解决方案1】:

    beta 变量是 AdamOptimizer 使用的变量,需要像其他变量一样进行初始化。您可以在创建优化器后使用 tf.global_variables_initializer() 初始化它们,也可以查找变量并直接使用 tf.variables_initializer() 初始化它们。

    【讨论】:

    • 感谢您的回复!问题是我必须保持从预训练中恢复的权重冻结,并且tf.global_variables_initializer() 用随机值重新初始化这些变量。有没有办法只初始化 beta 变量而不是其他权重?我找不到 beta 变量的正确名称。
    • 你应该可以通过 beta1 和 beta2 关键字将 tf.variables 传递给 AdamOptimizer,然后你可以直接初始化它们
    • sess = tf.Session() saver = tf.train.Saver() saver.restore(sess, "./pre_train/step1.ckpt") init_all = tf.global_variables_initializer() sess.run(init_all) train_op = tf.train.AdamOptimizer(learning_rate).minimize(cost, var_list=[list(focusFnn_params.values())]) 即使使用这个全局初始化,我也收到以下错误:FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power [[Node: beta2_power/read = Identity[T=DT_FLOAT, _class=["loc:@focusFnn_w1"], _device="/job:localhost/replica:0/task:0/cpu:0"](beta2_power)]]
    • 您必须在创建优化器后运行 init。但是,正如您所提到的,这将重置其他变量。你可以试试:beta1 = tf.Variable(0.9) beta2=tf.Variable(0.999) optimizer=tf.train.AdamOptimizer(learning_rate, beta1=beta1, beta2=beta2).... sess.run(tf.initialize_variables([beta1, beta2])
    • 谢谢!就像你说的,在创建优化器之后运行 init 会使优化器工作。但是,设置 beta1 和 beta2 后,它给出了旧的错误消息:FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta1_power [[Node: beta1_power/read = Identity[T=DT_FLOAT, _class=["loc:@encoder_w1"], _device="/job:localhost/replica:0/task:0/cpu:0"](beta1_power)]]
    【解决方案2】:

    我通过以下操作解决了:

         train_op = tf.train.AdamOptimizer(0.001).minimize(loss)
         # Initialize the variables and reload weights
         sess.run(tf.global_variables_initializer())
         net.load_initial_weights(sess)
    

    似乎有效。首先我初始化了全局变量,然后加载了预训练的权重。注意,您必须事先定义您的 AdamOptimizer,然后运行 ​​tf.global_variables_initializer() 否则 beta variable仍然不会被初始化

    我的前辈刚刚教过我。非常感谢他

    【讨论】:

      【解决方案3】:

      不确定在我们交换评论后您是否对此有所了解,但我刚刚遇到了同样的问题并通过运行解决了它:

      with tf.Session(graph=graph) as sess:
          sess.run(sess.graph.get_tensor_by_name('beta1_power/Assign:0'))
          sess.run(sess.graph.get_tensor_by_name('beta2_power/Assign:0'))
          ...
      

      【讨论】:

      • 谢谢!我找到了另一种可行的方法,还没有尝试过这个解决方案
      【解决方案4】:

      我通过保存所有变量解决了这个问题,而不仅仅是步骤 1 中的权重和偏差。 step2,先定义train_op,再定义saver.restore()

      【讨论】:

        【解决方案5】:

        我通过添加解决了它:

        tf.reset_default_graph() 
        

        在图构建之前。

        但是,您仍然必须确保在创建 Saver 之前完成 solver 声明:

        solver = tf.train.AdamOptimizer().minimize(loss)
        ...
        saver = tf.train.Saver()
        

        参考: http://stackoverflow.com/questions/33765336/remove-nodes-from-graph-or-reset-entire-default-graph https://github.com/tflearn/tflearn/blob/master/examples/basics/weights_loading_scope.py

        【讨论】:

          【解决方案6】:

          Adam 优化器的变量必须在使用前进行初始化。 初始化 Adam 优化器:

          optimizer = tf.train.AdamOptimizer()
          sess.run(tf.variables_initializer(optimizer.variables()))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-22
            • 2020-06-08
            • 1970-01-01
            • 2016-06-30
            • 2016-02-16
            • 2017-09-15
            相关资源
            最近更新 更多