Сохранение градиентной ленты после построения

#python #c #tensorflow

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

Вопрос:

Можно ли установить сохранение a GradientTape после его построения?

Вариант использования — это когда у меня есть код, который я не контролирую, передает мне непостоянную ленту, с помощью которой я должен взять два градиента с зависимостями между ними.

 # I don't control this
with tf.GradientTape() as tape:
    y = f(x)
    z = g(y)

# I control this
dzdx = tape.gradient(z, x)
result = tape.gradient(z, y, output_gradients=dzdx)  # not persistent
 

Я обдумывал возможность простой настройки tape._persistent перед вызовом gradient , но сохранение передается вплоть до кода C при построении, что, вероятно, не понравится, если оно будет несовместимо с кодом Python

 def push_new_tape(persistent=False, watch_accessed_variables=True):
  """Pushes a new tape onto the tape stack."""
  tape = pywrap_tfe.TFE_Py_TapeSetNew(persistent, watch_accessed_variables)
  return Tape(tape)
 

Что в конечном итоге заканчивается

 template <typename Gradient, typename BackwardFunction, typename TapeTensor>
class GradientTape {
 public:
  // If `persistent` is true, GradientTape will not eagerly delete backward
  // functions (and hence the tensors they keep alive). Instead, everything
  // is deleted in ~GradientTape. Persistent GradientTapes are useful when
  // users want to compute multiple gradients over the same tape.
  explicit GradientTape(bool persistent) : persistent_(persistent) {}
  ~GradientTape() {
    for (const autoamp; pair : op_tape_) {
      pair.second.backward_function_deleter(pair.second.backward_function);
    }
  }

  // ...

  bool IsPersistent() const { return persistent_; }
 

Где IsPersistent находится единственный общедоступный интерфейс persistent_ . Я не могу сказать, как именно persistent_ используется, и это звучит как утечка памяти в ожидании.

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

1. Быстрый тест показывает, что установка persistent_ значения True после построения в любом случае не сделает ленту действительно постоянной.