Как создавать переменные внутри метода, оформленного tf.function?

#python #tensorflow

#python #тензорный поток

Вопрос:

Не удается создать tf.Variable (хотя я должен) в tf.function оформленном методе:

 @tf.function
def some_func():
    x = tf.Variable([1, 2, 3])
 

Я получаю:

 /usr/local/lib/python3.8/site-packages/tensorflow/python/ops/variables.py:262 __call__  **
    return cls._variable_v2_call(*args, **kwargs)
/usr/local/lib/python3.8/site-packages/tensorflow/python/ops/variables.py:244 _variable_v2_call
    return previous_getter(
/usr/local/lib/python3.8/site-packages/tensorflow/python/ops/variables.py:67 getter
    return captured_getter(captured_previous, **kwargs)
/usr/local/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py:716 invalid_creator_scope
    raise ValueError(

ValueError: tf.function-decorated function tried to create variables on non-first call.
 

Я думаю, что есть какой-то обходной путь, используя:

 tf.config.experimental_run_functions_eagerly(True)
 

но я также думаю, что это влияет на производительность, в чем весь смысл tf.function в первую очередь.

Ответ №1:

Чтобы быть более точным, вы можете создавать переменные внутри метода, оформленного @tf.function, при условии, что ваша переменная создается только один раз. Вот пример:

 import tensorflow as tf
import numpy as np

class YourClass:
    def __init__(self):
        self.first = True

    @tf.function
    def your_function(self):

        if self.first == True:
            self.first = False
            self.your_variable = tf.Variable([0]) 

c = YourClass()
c.your_function()
 

******** ОБНОВЛЕНО ************

Поскольку вы упомянули, что просто хотите обновить, а не создавать, вы можете использовать tf.assign

Код ниже

 import tensorflow as tf
from matplotlib import pyplot as plt
import numpy as np

class YourClass:
    def __init__(self):
        self.your_variable = tf.Variable([0])

    @tf.function
    def your_function(self):

        tf.compat.v1.assign(self.your_variable,value=[1]) 

c = YourClass()
c.your_function()
 

Комментарии:

1. Нет, мне нужно иметь возможность вызывать оформленную функцию любое количество раз, и каждый раз переменная будет иметь другое значение

2. @bullseye, вы можете использовать tf.assign . Я обновил код в ответе