如何解决没有急切执行的张量流的反复丢失
下面有一个非常简单的损失示例(可能没有意义)
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。