我有一个函数,称之为DetermineLearningRate,它在每次迭代时获取准确度(和其他指标),并将学习率提供给简单的CNN。
工作流
如果我有10,000次迭代,这是否意味着我必须运行并关闭10,000个会话?这是因为我不希望迭代在没有我的函数调用的情况下继续进行每次迭代,获得准确性然后返回学习率。
这是我想到的工作流程:
有人可以建议吗?非常感谢。
答案 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()
。