gpt4 book ai didi

python - 如何在 TensorFlow 中模拟降低精度的 float ?

转载 作者:太空狗 更新时间:2023-10-29 20:29:54 26 4
gpt4 key购买 nike

我想要一种方法来将 TensorFlow 中 float 的精度(大约:截断尾数)降低到定义的完整范围内的任意位数。我不需要完全以降低精度编写代码(如 tf.float16),而是想出一系列操作来降低张量的精度,同时保留其原始类型(例如 tf.float32)。

例如,如果完整范围是 0 到 1,精度是 8 位,则 0.1234 将变为 round(0.1234 * 256)/256 = 0.125。这使用简单的舍入。

我还想进行统计舍入,其中在每个方向上舍入的概率与值与该值的距离成正比。例如,0.1234 * 256 = 31.5904,在 59% 的情况下会四舍五入到 32/256,在 41% 的情况下会四舍五入到 31/256。

额外问题:如何获取现有图并对其进行修改以在每次卷积后添加舍入?

最佳答案

唯一棘手的部分是为舍入操作提供梯度。已经实现的 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? 所示对其进行 tensoflow 化处理

在这里你可以将它的梯度操作定义为

def grad_stochastic_round(op, grad):
return stochastic_round(grad)

关于python - 如何在 TensorFlow 中模拟降低精度的 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42964980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com