#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 после построения в любом случае не сделает ленту действительно постоянной.