python - 如何在 tensorflow 2.0 中为自定义量化反向传播?

当我在 tf2.0 eager 模式下量化张量时,我想使用恒等式进行反向传播(直接通过估计器)。我能够执行正向传递,但遇到 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的方法是按照官方教程,但是我不明白为什么他们会在with之外使用g 范围(最后 代码中的行)。任何澄清表示赞赏。

最佳答案

问题是您通过转换为整数来量化。改为使用 floor 函数

@tf.custom_gradient
def quantize(x):
    x = tf.math.floor(x)
    def grad(dy):
        return dy
    return x, grad

x = tf.ones((10,10))
with tf.GradientTape() as g:
  g.watch(x)
  y = quantize(1.1*x+.1)*2

dy_dx = g.gradient(y, x, output_gradients = tf.ones((10,10)))

print(dy_dx)

https://stackoverflow.com/questions/60864049/

相关文章:

reactjs - 将 Ant 设计表导出为 pdf 格式

authentication - 我可以使用带有额外 header 的 git-tfs 吗?

git - 在 Synology NAS 上启用 Gitlab LFS

python - WinError 10061 由于目标机器主动拒绝,无法建立连接

python-3.x - 重复的日志 Flask - Google Cloud Logging

javascript - 如何访问 react-image-gallery 中的 slideToIn

react-native - React Native Webview OnLoad 调用了两次

asp.net - SignalR 协商阶段发生 CORS 错误

firebase - 如何避免在 firebase ML Kit 的人脸检测 API 中捕获图像模糊

python - 无需安装即可导入 Python 库