gpt4 book ai didi

python - Tensorflow没有为任何变量提供梯度tf.to_double

转载 作者:行者123 更新时间:2023-12-01 09:24:11 26 4
gpt4 key购买 nike

我有一个函数,它接受两个 Tensorflow 向量和一个标量阈值,并返回一个 Tensorflow 操作。以下版本抛出“ValueError:没有为任何变量提供渐变”。

def mse(expected, probs, threshold):
preds = tf.to_double(probs >= threshold)
loss_vect = tf.square(expected - preds)
loss = -tf.reduce_mean(loss_vect)
return loss

但是,如果我删除第一行,从而产生以下版本的函数,则不会引发错误。

def mse(expected, probs, threshold):
loss_vect = tf.square(expected - probs)
loss = -tf.reduce_mean(loss_vect)
return loss

我调用该函数的上下文如下。上面的函数作为loss_func传入。对于 act_func,我传入一个返回 tf.sigmoid 操作的函数。

class OneLayerNet(object):
def __init__(self, num_feats, num_outputs, act_func, threshold, loss_func, optimizer, batch_size=8, epochs=100, eta=0.01, reg_const=0):
self.batch_size = batch_size
self.epochs = epochs
self.eta = eta
self.reg_const = reg_const

self.x = tf.sparse_placeholder(tf.float64, name="placeholderx") # num_sents x num_feats
self.y = tf.placeholder(tf.float64, name="placeholdery") # 1 x num_sents
self.w = tf.get_variable("W", shape=[num_feats, num_outputs], initializer=tf.contrib.layers.xavier_initializer(), dtype=tf.float64)
self.b = tf.Variable(tf.zeros([num_outputs], dtype=tf.float64))

self.probs = act_func(self.x, self.w, self.b)
self.loss = loss_func(self.y, self.probs, threshold)
self.optimizer = optimizer(self.eta, self.loss)
self.session = tf.Session()
self.session.run(tf.global_variables_initializer())

从其他答案中,我了解到我得到的 ValueError 意味着我的权重向量 w 和优化器的路径已损坏。我想知道为什么当我添加 tf.to_double 调用时路径会中断。

最佳答案

问题并非来自 to_double,而是来自您持有 probs 的事实。

当您计算probs >=阈值时,结果是二进制的。计算该表达式的梯度probs 没有多大意义,因为它几乎到处都是 0,除了无穷大的地方。

遗憾的是,将结果转换为 double 不会改变该点的情况。

关于python - Tensorflow没有为任何变量提供梯度tf.to_double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50571748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com