Я хотел бы сделать бэкпроп с тождеством (через оценщик), когда я квантовал тензор в нетерпеливом режиме tf2.0. Я могу выполнить прямой проход, но при попытке применить градиенты для моей модели для backprop обнаружена ошибка ValueError: No gradients provided for any variable..
.
Я попытался использовать пользовательские градиенты. В качестве минимального примера рассмотрим следующий код:
import tensorflow as tf
@tf.custom_gradient
def quantize(x):
x = tf.cast(x, dtype=tf.uint8)
def grad(dy):
return dy
return x, grad
@tf.custom_gradient
def dequantize(x):
x = tf.cast(x, dtype=tf.float32)
def grad(dy):
return dy
return x, grad
x = tf.ones([10,10])
with tf.GradientTape() as g:
g.watch(x)
y = dequantize(quantize(x))*2
dy_dx = g.gradient(y, x)
print(dy_dx) # outputs None
Градиент равен None, что означает, что я не смогу выполнять обратное перемещение при использовании такого рода функций в модели. Как мне это исправить? Существуют ли более эффективные способы достижения квантования, если мне нужно что-то кроме tf.quantize ()?
Кроме того, способ, которым я использовал GradientTape g
, соответствует официальным учебным пособиям, но я не понимаю, почему они будут использовать g
вне области действия with
(последняя строка в коде). Любые разъяснения приветствуются.