Python 如何在tensorflow 2.4 autograph中的函数的两个版本之间共享资源?

Python 如何在tensorflow 2.4 autograph中的函数的两个版本之间共享资源?,python,tensorflow,Python,Tensorflow,我想在函数的两个版本之间共享选定的张量。我已经做了一个简单的例子来说明我在寻找什么和我尝试了什么(目前实际的代码非常多) 我有以下代码: import tensorflow as tf g = tf.Graph() def function_factory(function_type): g.add_to_collection("shared_value", tf.Variable(200)) @tf.function def set_value(

我想在函数的两个版本之间共享选定的张量。我已经做了一个简单的例子来说明我在寻找什么和我尝试了什么(目前实际的代码非常多)

我有以下代码:

import tensorflow as tf
g = tf.Graph()

def function_factory(function_type):
    g.add_to_collection("shared_value", tf.Variable(200))

    @tf.function
    def set_value(value):
        g.clear_collection("shared_value")
        g.add_to_collection("shared_value", tf.Variable(value))

    @tf.function
    def get_value():
        return g.get_collection("shared_value")[0]

    @tf.function
    def get_value_with_factor(factor):
        return factor*g.get_collection("shared_value")[0]

    if function_type=="A":
        get_value.set_value = set_value
        return get_value
    elif function_type=="B":
        get_value_with_factor.set_value = set_value
        return get_value_with_factor

get_value_a = function_factory("A") 
get_value_b = function_factory("B") 

tf.print(get_value_a())
tf.print(get_value_b(10))

get_value_a.set_value(300)

tf.print(get_value_a())
tf.print(get_value_b(10))
并获取以下错误:

ValueError: tf.function-decorated function tried to create variables on non-first call.
没有@tf.function注释(即,在急切模式下):

输出正是我想要的:

200
2000
300
3000
任何关于如何解决图形版本(顶部)中的错误的建议,或关于如何在TensorFlow自动签名模式下在函数之间共享选定张量的任何其他建议,都将不胜感激。我们使用的是TensorFlow 2.4

对于我们的实际问题,急切模式太慢。

不要创建新对象,而是使用更新现有变量的值:

将tensorflow导入为tf
g=tf.Graph()
def功能工厂(功能类型):
g、 将_添加到_集合(“共享_值”,tf.Variable(200))
@功能
def设置_值(值):
#在此处指定新值,而不是创建新变量
返回g.get_集合(“共享_值”)[0]。分配(值)
@功能
def get_值():
返回g.get_集合(“共享_值”)[0]
@功能
def get_值_与_因子(因子):
返回因子*g.get_集合(“共享_值”)[0]
如果函数类型==“A”:
获取值。设置值=设置值
返回get_值
elif函数类型==“B”:
使用系数获取值。设置值=设置值
返回带有系数的get值
获取值=函数工厂(“a”)
get_value_b=函数工厂(“b”)
tf.print(获取值)
tf.打印(获取值(10))
获取值。设置值(300)
tf.print(获取值)
tf.打印(获取值(10))
输出:

200
2000
300
3000

完美!谢谢在真正的代码中也像一个符咒一样工作!
200
2000
300
3000