我想要一种方法来将TensorFlow中的浮点精度(大约:截断尾数)降低到定义的整个范围内的任意位数。我不需要完全以降低的精度编写代码(如tf.float16),而是需要提出一系列操作来降低张量的精度,同时保留原始类型(例如tf.float32)。 / p>
例如,如果整个范围是0到1,并且精度是8位,则0.1234将变为圆形(0.1234 * 256)/ 256 = 0.125。这使用简单的舍入。
我还想进行统计舍入,其中每个方向的舍入概率与该值的距离成正比。例如,0.1234 * 256 = 31.5904,59%的时间可以达到32/256,而41%的时间可以达到31/256。
额外的问题:如何获取现有图表并修改它以在每次卷积后添加舍入值?
答案 0 :(得分:2)
唯一棘手的部分是为舍入操作提供渐变。已实施的tf.round
没有实现渐变。但是你可以实现自己的舍入操作(统计或简单舍入两种工作),如下所示:
Tensorflow: How to write op with gradient in python?
您只需使用:
grad(round(T)) = round(grad(T))
现在,一旦您进行了个性化的round
操作,您可以转移渐变:
def reduce_precision(tensor, precision_bits=8):
N = 2**precision_bits
return round(N * tensor)/N
对于随机舍入,您可以创建一个简单的numpy函数,如
def stochastic_round(x):
r,f = np.modf(x)
return r + np.random.binomial(1,r)
然后按照How to make a custom activation function with only Python in Tensorflow?
中所示的方式进行数十次流动您可以将其渐变操作定义为
def grad_stochastic_round(op, grad):
return stochastic_round(grad)