张量类型的变量初始化器必须包装在 init_scope 或可调用的

Posted

技术标签:

【中文标题】张量类型的变量初始化器必须包装在 init_scope 或可调用的【英文标题】:Tensor-typed variable initializers must either be wrapped in an init_scope or callable 【发布时间】:2020-04-01 10:28:08 【问题描述】:

我已经为 crf 损失计算编写了一个自定义 keras 损失。

def myLoss(self,y_true, y_pred):
    """
    Args:
        y_true: a tensor of shape batch_size X  num_labels 
        y_pred: a tensor of shape batch_size X seq_length X num_labels
        
    """
    with tf.init_scope():
        self.seqlen = tf.constant(self.batch_size, shape=(self.seq_length,))
    log_likelihood, transtion = tfa.text.crf.crf_log_likelihood(y_pred,y_true,self.seqlen )# logits, labels, seq_length
        loss = tf.reduce_sum(-log_likelihood)
    return loss

但上面的代码引发了以下问题:

ValueError: Tensor-typed variable initializers must either be wrapped in an init_scope or callable (e.g., `tf.Variable(lambda : tf.truncated_normal([10, 40]))`) when building functions. Please file a feature request if this restriction inconveniences you.

根据错误,我尝试使用 init_scope 包装张量计算,但不确定这是否正确。有什么建议吗?

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,但在不同的背景下。使变量初始化程序可调用对我有用。 只需在您的代码中调用self.seqlen 之前添加一个lambda,看看它是否有效:

tfa.text.crf.crf_log_likelihood(y_pred, y_true, lambda: self.seqlen)

【讨论】:

以上是关于张量类型的变量初始化器必须包装在 init_scope 或可调用的的主要内容,如果未能解决你的问题,请参考以下文章

如何使用变量初始化新的 Firebase @FirestoreQuery 属性包装器?

将绑定传递给类型属性包装器的变量 - 失去基础类型

包装器类型

Java中包装类型和基本类型的使用场景(什么时候使用包装类型)(转)

类的设计技巧简单总结

将 Streams 与原始数据类型和相应的包装器一起使用