没有急切执行的张量流的反复丢失

问题描述

下面有一个非常简单的损失示例(可能没有意义)

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)