Правильно ли мое понимание восстановления тензорного потока?

#tensorflow

Вопрос:

документ tensorflow приводит этот пример

 def train_one_step():
  pass

@tf.function
def train(num_steps):
  print("Tracing with num_steps = ", num_steps)
  tf.print("Executing with num_steps = ", num_steps)
  for _ in tf.range(num_steps):
    train_one_step()

print("Retracing occurs for different Python arguments.")
train(num_steps=10)
train(num_steps=20)

print()
print("Traces are reused for Tensor arguments.")
train(num_steps=tf.constant(10))
train(num_steps=tf.constant(20))
 

Вот результат

 Retracing occurs for different Python arguments.
Tracing with num_steps =  10
Executing with num_steps =  10
Tracing with num_steps =  20
Executing with num_steps =  20

Traces are reused for Tensor arguments.
Tracing with num_steps =  Tensor("num_steps:0", shape=(), dtype=int32)
Executing with num_steps =  10
Executing with num_steps =  20
 

Я думаю, я понимаю первую часть, где train(num_steps) определяется как Function объект. train(num_steps=10) и train(num_steps=20) используйте разные значения Python, что приведет к повторению.

Во второй части train(num_steps=tf.constant(10)) и train(num_steps=tf.constant(20)) вызывает повторное использование трассировок, где print("Tracing with num_steps = ", num_steps) выполняется нормально, в то время как часть параметров num_steps=tf.constant(10) захватывается tf.Graph и не выполняется на этапе трассировки.

Правильно ли я понимаю?

Ответ №1:

Украсьте свою функцию tf.function подсказками tensorflow , чтобы сгенерировать из нее вычислительный график. По умолчанию новый график создается при передаче тензора с новой формой

это создает новый график, так как это первый вызов:

 my_tf_func(tf.constant(10)) 
 

это не приводит к созданию нового графика, так как форма аргумента совпадает с входной формой графика:

 my_tf_func(tf.constant(20)) 
 

это создает новый график, так как форма отличается:

 my_tf_func(tf.constant([10, 20])) 
 

При передаче значений python (не tf.тензоров) каждый раз, когда выполняется вызов с определенным значением, создается новый график. Все эти вызовы генерируют новый график:

 my_tf_func(10) 
my_tf_func(20) 
my_tf_func(30) 
 

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

1. Огромное спасибо. Что именно означает «вне этого»?

2. функция прослеживается, судя по вашему вопросу, похоже, что вы разобрались в этой части, поэтому я не был очень буквальным.