通过外部功能改变学习率,我是否必须运行多个会话?

时间:2016-10-18 04:28:26

标签: tensorflow

我有一个函数,称之为DetermineLearningRate,它在每次迭代时获取准确度(和其他指标),并将学习率提供给简单的CNN。

工作流

  1. 简单的CNN DetermineLearningRate()会考虑准确性和 返回学习率
  2. CNN的TensorFlow图表将接受 学习率并运行1次迭代并返回准确度
  3. 重复直到所有迭代结束。
  4. 如果我有10,000次迭代,这是否意味着我必须运行并关闭10,000个会话?这是因为我不希望迭代在没有我的函数调用的情况下继续进行每次迭代,获得准确性然后返回学习率。

    这是我想到的工作流程:

    1. 图表访问的全局变量LR
    2. 使用函数
    3. 给出的LR运行会话1
    4. 获得准确性
    5. 关闭会话
    6. 获取后,使用函数给出的LR运行会话2 准确度
    7. 获得准确性
    8. 关闭会话
    9. 重复
    10. 有人可以建议吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

不仅仅是为学习率LR=tf.placeholder(tf.float32,[])创建一个占位符并使用函数中的值作为训练步骤的feed_dict参数。

<强>操作实例:

假设您已经定义了一个类似于此的图形和一个函数DetermineLearningRate()来计算您的学习率:

x=tf.placeholder([None,dim_x],tf.float32)
target=tf.placeholder([None,dim_target],tf.float32)
LR=tf.placeholder([],tf.float32)
#a list of operations on x to get y_pred
y_pred=...
#Your loss
loss=your_loss_function(y_pred,target)
acc=accuracy(y_pred,target)
#I am now passing the placeholder LR as a learning rate
train_step = tf.train.YourFavoriteOptimizer(LR).minimize(loss)
sess=tf.Session()
sess.run(tf.initialize_all_variables())
for i in xrange(training_steps):
  acc_arg=sess.run(acc,feed_dict={x: batch_x, target: batch_target}) 
  lr_val=DetermineLearningRate(acc_arg)
  #lr is a scalar not a list
  sess.run(train_step,feed_dict={x: batch_x, target: batch_target, LR: lr_val})

请注意,我从未关闭过会话。 还有其他更优雅的方法,但在我看来,这是最直接的 就像你可以将LR定义为张量通过张量流操作(例如LR=tf.div(1,acc)或其他)获得的张量,并且只使用一次调用ses.run()
或者使用不可训练的LR变量和tf.assign函数的结果。

编辑:为防止操作在另一个操作完成之前在TF中运行,您可以使用tf.control_dependencies()