我有一个快速的问题。我正在开发一个TensorFlow模型,在构建阶段需要在公式中使用迭代次数。我知道如何使用global_step,但我不使用现有的优化器。我使用以下代码计算自己的梯度:
grad_W, grad_b = tf.gradients(xs=[W, b], ys=cost)grad_W = grad_W +rnd.normal(0,1.0/(1+epoch)**0.55)
然后使用
new_W = W.assign(W - learning_rate * (grad_W))new_b = b.assign(b - learning_rate * (grad_b))
我想在更新权重之前在公式中使用epoch值。我该如何以最佳方式实现这一点?我有一个sess.run()部分,并且希望将epoch编号传递给模型,但不能直接使用张量。在我的运行调用中
_, _, cost_ = sess.run([new_W, new_b ,cost], feed_dict = {X_: X_train_tr, Y: labels_, learning_rate: learning_r})
我想传递epoch编号。您通常是如何做的?
提前感谢,Umberto
编辑:
感谢您的提示。看起来似乎有效
grad_W = grad_W + tf.random_normal(grad_W.shape, 0.0,1.0/tf.pow(0.01+tf.cast(epochv, tf.float32),0.55))
但我还需要看看这是否是我需要的,以及是否按预期工作。欢迎提供建议和反馈!
回答:
您可以将epoch定义为图中的非可训练tf.Variable,并在每个epoch结束时增加它的值。您可以使用tf.assign_add定义一个操作来进行增加,并在每个epoch结束时运行它。
您还需要使用tf.random_normal代替rnd.normal。
示例:
epoch = tf.Variable(0, trainable=False) # 0 是初始值# 当下一个操作运行时增加1epoch_incr_op = tf.assign_add(epoch, 1, name='incr_epoch')# 定义任何依赖于'epoch'的操作# 注意我们需要将整数'epoch'转换为浮点数以便在tf.pow中使用grad_W = grad_W + tf.random_normal(grad_W.shape, 0.0, 1.0/tf.pow(1+tf.cast(epoch, tf.float32), 0.55))# 训练循环while running_epoch: _, _, cost_ = sess.run([new_W, new_b ,cost], feed_dict = {X_: X_train_tr, Y: labels_, learning_rate: learning_r})# 在epoch结束时,增加epoch计数器sess.run(epoch_incr_op)