张量类型的变量初始化器必须包装在 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 属性包装器?