Как сделать backprop для пользовательского квантования в tenorflow 2.0? - PullRequest
0 голосов
/ 26 марта 2020

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

...