按位修改Numpy float32并返回修改后的np.float32值



我目前正在研究一种比特斩波算法,用于模拟训练神经网络时减少内存占用的情况。我正在使用PyTorch来实现这一点。

然而,我基本上想做的是将float32值尾数的低有效位设置为0,看看神经网络是否会训练,以及它会损失多少精度,这取决于设置为0的位数。

我的问题是张量上的每个值都是Numpy float32类型,我想获得该值的字面位表示(实际float32值在内存中的表示方式(,或者作为一个整数,应用逐位修改并将其转换回np.float32。

然而,我已经尝试了以下操作(注意,x的类型是numpy.ndarray(:

print(x)
value_as_int = self.x.view(np.int32)
print(value_as_int)
value_as_int = value_as_int&0xFFFFFFFE
print(value_as_int)
new_float = value_as_int.view(np.float32)
print(new_float)

以下是工作部件的示例输出:

0.13498048
1040857171
1040857170

这确实将值转换为其文字位整数表示,并允许我将最后一位设置为0,尽管当试图将其转换回np.float32时,我会收到以下错误:

ValueError:只有当项目大小保持不变时,才支持更改0d数组的数据类型

有合适的方法吗?我是在代码中遗漏了什么,还是错误的方法?

提前感谢

这里的问题是0xFFFFFFFE是pythonint(而不是numpyint32(。当应用按位AND运算符时,Numpy隐式向上转换为int64。为了避免这种情况,您可以将比特掩码设为np.uint32

似乎在Windows(但不是Linux(中,您需要使用np.uint32而不是np.int32来避免得到";Python int太大,无法转换为C long";当您的位掩码大于0x7FFFFFFF时出错。

value_as_int = self.x.view(np.uint32)
value_as_int = value_as_int & np.uint32(0xFFFFFFFE)
new_float = value_as_int.view(np.float32)

最新更新