# #############添加##############
    def binarize(self, x):
        """
        Clip and binarize tensor using the straight through estimator (STE) for the gradient.
        """
        g = tf.get_default_graph()

        with ops.name_scope("Binarized") as name:
            # x=tf.clip_by_value(x,-1,1)
            ###当网络正向传播时,返回的是tf.sign(x),当反向求梯度时,用Identity代替了Sign函数,Identity一般可以认为等于。即直接用x来求梯度。
            with g.gradient_override_map({"Cast": "Identity"}):
                return tf.sign(x)#############结束##############

正如我在代码中注释的一样,gradient_override_map函数主要用于解决使用自己定义的函数方式来求梯度的问题,特别是在深度学习的二值化,无法对符号函数进行求导,需要使用straight through estimator (STE)求导。 gradient_override_map函数的参数值为一个字典。其表示的意思是:字典中value表示使用该值表示的函数代替key表示的函数进行梯度运算。例如例子中,在求梯度时,使用tf.identity函数代替tf.sign函数。即使用identity处理后的值来求梯度。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-10-21
  • 2021-08-31
  • 2021-09-01
  • 2022-01-13
  • 2021-12-21
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-07-06
  • 2022-03-03
  • 2022-12-23
  • 2022-01-17
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案