#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 . Я обновил код в ответе