Я хотел бы получить обратную связь с идентичностью (прямая оценка) при квантовании тензора в нетерпеливом режиме tf2.0. Я могу выполнить прямой проход, но сталкиваюсь с ошибкой 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
Градиент - Нет, что означает, что я не смогу выполнить обратную передачу, когда использую такие функции в модели. Как мне это исправить? Есть ли лучшие способы достижения квантования, учитывая, что мне нужно что-то другое, кроме tf.quantize ()?
Кроме того, я использовал GradientTape g
в соответствии с официальными руководствами, но я не понимаю, почему они использовали g
вне области with
(последняя строка в коде). Приветствуются любые разъяснения.