首页 > 解决方案 > 如何通过更新变量来更改张量的输出?

问题描述

我有一个依赖于某个变量的损失函数,然后我想更改该变量并获得更新的损失。损失是作为函数的输入给我的,所以我不能简单地将那条线移动到 tf.control_dependencies下(这确实给了我想要的东西)。那么之后我该如何更新变量和损失呢?

X = tf.Variable(1.0)                     #Dummy parameters of a neural network
loss = (X+1.0)**2                        #Dummy Loss function given to me as input

add = tf.assign(X,X+1.0)                 #Me changing the parameters of the network
with tf.control_dependencies( [ add ] ):
    updated_loss = loss                  #Me wanting the updated loss
print(K.eval(updated_loss ))             #Me not getting the updated loss :(

标签: pythontensorflowkeras

解决方案


当您创建损失变量时,您正在给它一个初始值,这不会使它成为一个每次调用时都会重新评估损失的函数。

我们可以制作一个损失函数,每次调用它来计算损失

编辑:我更改了下面的代码以将值重新分配给损失张量流变量,而不是返回一个新变量。

import tensorflow as tf
import tensorflow.keras.backend as K

# Function that updates the loss
@tf.function
def update_loss(X, loss):
    loss.assign((X+1.0)**2)

def test():
    # Initialise a value of loss
    loss = tf.Variable(0.0)
    print(K.eval(loss))

    # Initialise variable
    X = tf.Variable(2.0)

    # Update loss
    update_loss(X, loss)
    print(K.eval(loss))

    # Change network by adding 1.0
    X.assign_add(1.0)

    # Update loss
    update_loss(X, loss)
    print(K.eval(loss))

推荐阅读