问题描述
下面有一个非常简单的损失示例(可能没有意义)
import tensorflow as tf
class Loss:
def __init__(self):
self.last_output = tf.constant([0.5,0.5])
def recurrent_loss(self,model_output):
Now = 0.9*self.last_output + 0.1*model_output
self.last_output = Now
return tf.reduce_mean(Now)
仅评估model_output的reduced_mean
与 last model_output的组合(比例为9:1)。例如
>> l = Loss()
>> l.recurrent_loss(tf.constant([1.,1.]))
tf.Tensor(0.55,shape=(),dtype=float32)
>> l.recurrent_loss(tf.constant([1.,1.]))
tf.Tensor(0.595,dtype=float32)
如果我正确理解tf的工作方式,则只有在默认情况下tf会急切执行(tf.executing_eagerly() == True
),这是可能的。这就是为什么我可以使用新的张量覆盖self.last_output变量以实现递归结构的原因。
我的问题:如何在不使用急切执行的tf图中实现相同类型的循环结构?
解决方法
在图形模式下,您必须使用tf.Variable,该变量仅在函数第一次执行时创建,例如:
class Loss:
def __init__(self):
self.last_output = None
@tf.function
def recurrent_loss(self,model_output):
if self.last_output is None:
self.last_output = tf.Variable([0.5,0.5])
now = 0.9*self.last_output + 0.1*model_output
self.last_output.assign(now)
return tf.reduce_mean(now)