Python 张力流力执行

Python 张力流力执行,python,tensorflow,Python,Tensorflow,我正在用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")

我正在用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,1,2]
时,我们得到了结果
[0,0,0]

我们得到这一结果的原因是,
lag
中的最终
cache
op没有被显式使用,也从未被计算过。我们可以通过在
返回
之前添加这样一行来强制执行其计算:

output = tf.tuple([output, cache])[0]
然后我们得到预期的输出
[0,1,2]
。但这似乎很不雅观。有没有更好的方法来强制对op进行评估


另外一个问题是,在这个实现中,我们可以看到使用了两个
变量。我找不到另一个解决方案来制作张量的临时副本,但我不明白为什么我不能用一个
变量来做同样的事情。还有其他方法吗?

您可以使用控件依赖项