Используя функцию tf.function, вы конвертируете содержимое оформленной функции: это означает, что TensorFlow попытается скомпилировать ваш нетерпеливый код в графическое представление.
Переменные, однако, являются специальными объектами. На самом деле, когда вы использовали TensorFlow 1.x (режим графика), вы определяли переменные только один раз, а затем использовали / обновляли их.
В тензорном потоке 2.0, если вы используете чисто жадное выполнение, вы можете объявить и повторно использовать одну и ту же переменную более одного раза, поскольку tf.Variable
- в активном режиме - это просто обычный объект Python, который уничтожается, как только функция заканчивается, и переменная, таким образом, выходит из области видимости.
Чтобы TensorFlow мог правильно преобразовывать функцию, которая создает состояние (то есть использует переменные), вы должны разбить область действия функции, объявив переменные вне функции.
Короче , если у вас есть функция, которая работает правильно в активном режиме, например:
def f():
a = tf.constant([[10,10],[11.,1.]])
x = tf.constant([[1.,0.],[0.,1.]])
b = tf.Variable(12.)
y = tf.matmul(a, x) + b
return y
Вы должны изменить ее структуру на что-то вроде:
b = None
@tf.function
def f():
a = tf.constant([[10, 10], [11., 1.]])
x = tf.constant([[1., 0.], [0., 1.]])
global b
if b is None:
b = tf.Variable(12.)
y = tf.matmul(a, x) + b
print("PRINT: ", y)
tf.print("TF-PRINT: ", y)
return y
f()
, чтобы она работала правильно с помощью декоратора tf.function
.
Я описал этот (и другие) сценарий в нескольких сообщениях в блоге: первая часть анализирует это поведение в разделе Handlin g заявляет, что нарушает область действия функции (однако я предлагаю прочитать ее с самого начала и прочитать также части 2 и 3).