Как сделать backprop для пользовательского квантования в tensorflow 2.0?

Я хотел бы получить обратную связь с идентичностью (прямая оценка) при квантовании тензора в нетерпеливом режиме 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 (последняя строка в коде). Приветствуются любые разъяснения.


person mathematica_abstracto    schedule 26.03.2020    source источник
comment
Вы решили проблему? Если нет, возможно, вам помогут квантизаторы qkeras: github.com/google/ qkeras / blob / master / qkeras / quantizers.py   -  person Nicolò Ghielmetti    schedule 14.10.2020
comment
Я нахожу решение в этом посте полезным для вас! stackoverflow.com/questions/36456436/   -  person J. Fan    schedule 22.12.2020