如何在TensorFlow中模拟精度降低的浮子?

时间:2017-03-23 00:14:19

标签: python tensorflow rounding precision

我想要一种方法来将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。

额外的问题:如何获取现有图表并修改它以在每次卷积后添加舍入值?

1 个答案:

答案 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)