首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Tensorflow GradientTape中声明变量

在Tensorflow GradientTape中声明变量
EN

Stack Overflow用户
提问于 2022-07-26 14:56:36
回答 1查看 42关注 0票数 0

我有一个模型,有一个复杂的损失,计算每类模型的输出。

如下所示,我使用一些自定义的损失函数计算损失,将这个值赋值给变量,因为张量在tensorflow中是不变的。

代码语言:javascript
复制
def calc_loss(y_true, y_pred):
    num_classes=10
    pos_loss_class = tf.Variable(tf.zeros((1, num_classes), dtype=tf.dtypes.float32))
    for idx in range(num_classes):
        pos_loss = SOME_LOSS_FUNC(y_true[:, idx], y_pred[:, idx] 
        pos_loss_class[:, idx].assign(pos_loss)

return tf.reduce_mean(pos_loss_class)

我的代码很简单:

代码语言:javascript
复制
with tf.GradientTape() as tape:
    output = model(input, training=True)
    loss = calc_loss(targets, output)
grads = tape.gradient(loss, model.trainable_weights)

但是,对于所有模型的变量,我都没有收到任何信息。根据我的理解,这是由如下所写的变量状态的阻塞方式造成的:https://www.tensorflow.org/guide/autodiff#4_took_gradients_through_a_stateful_object

有什么建议吗?

下面是可重复的代码,这是一个玩具示例,但演示了这个问题。

代码语言:javascript
复制
y_true = tf.Variable(tf.random.normal((1, 2)), name='targets')
layer = tf.keras.layers.Dense(2, activation='relu')
x = tf.constant([[1., 2., 3.]])
with tf.GradientTape() as tape:
    y_pred = layer(x)
    loss_class = tf.Variable(tf.zeros((1,2)), dtype=tf.float32)
    for idx in range(2):
        loss = tf.abs(y_true[:, idx] - y_pred[:, idx])
        loss_class[:, idx].assign(loss)
    final_loss = tf.reduce_mean(loss_class)
grads = tape.gradient(final_loss, layer.trainable_weights)
EN

回答 1

Stack Overflow用户

发布于 2022-07-26 18:01:46

我目前的第二个猜测是,赋值方法阻止梯度,正如您喜欢的tensorflow页面中所解释的那样.相反,只使用一个简单的列表:

代码语言:javascript
复制
def calc_loss(y_true, y_pred):
    num_classes=10
    pos_loss_class = []
    for idx in range(num_classes):
        pos_loss = SOME_LOSS_FUNC(y_true[:, idx], y_pred[:, idx] 
        pos_loss_class.append(pos_loss)

    return tf.reduce_mean(pos_loss_class)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73125638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档