我在Python中编写一个tensorflow函数来实现一般延迟。它有一个内部状态,每次运行会话时都必须更新。
这是一个简单的一步滞后形式的最小例子:
def lag(x, name=None):
with tf.name_scope(name, "lag"):
zeros = tf.zeros(x.get_shape(), dtype=x.dtype)
cache = tf.Variable(zeros, name="cache")
output = tf.Variable(zeros, name="output")
output = tf.assign(output, cache)
cache = tf.assign(cache, x)
return output
我们试一试:
x = tf.placeholder(tf.int32, [])
my_lag = lag(x)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
result = [sess.run(my_lag, feed_dict={x: i}) for i in range(1, 4)]
print(result)
当我们想要的是[0, 0, 0]
时,我们得到结果[0, 1, 2]
。
我们得到这个的原因是因为cache
中的最终lag
op未明确使用且永远不会被评估。我们可以通过在return
:
output = tf.tuple([output, cache])[0]
然后我们得到预期的输出[0, 1, 2]
。但这似乎相当不优雅。是否有更好的方法来强制op进行评估?
作为一个额外的问题,在这个实现中我们可以看到使用了两个Variable
。我找不到另一个解决方案来制作一个张量的临时副本,但我不明白为什么我不能只用一个Variable
做同样的事情。还有另一种方式吗?