# #############添加##############
    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处理后的值来求梯度。