【问题标题】:How can tensorflow do basic math with integer data larger than 32 bits?tensorflow 如何对大于 32 位的整数数据进行基本数学运算?
【发布时间】:2019-12-11 12:51:25
【问题描述】:

使用带有张量的 int64、BigInt 甚至 float64 值进行简单数学运算的最佳方法是什么?我提到我想做简单的数学运算来说明我不认为用字符串支持张量会起作用(尽管此时我对任何事情都持开放态度)。通过简单的数学,我的意思是加、减、乘、除和比较。

我是 tensorflow 新手,在 Chrome 中使用 1.1.2 版 tensorflow for javascript。

以下是 Math.PI 产生错误张量值的示例:

Math.PI;                       //         3.141592653589793
tf.scalar(Math.PI).toString(); // "Tensor 3.1415927410125732"
                          // differs here:        ^^^^^^^^^^

let big =                            100000000000;
tf.scalar(big).toString(); // "Tensor 99999997952" // hmmmmm?

同样,使用 BigInt(Chrome 支持)会引发错误:

tf.scalar(BigInt(42).toString()).toString(true); // OK, but I can't do math with Strings
tf.scalar(BigInt(42)           ).toString(true);
    // Error: values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray

我真的没想到它可以与 BigInt 一起使用,但我至少希望 Math.PI 无需任何操作即可工作。

我知道这都与 tensorflow 内部使用 float32 而不是 float64 的事实有关。我尝试了 parseFloat(PI),但我很确定 parseFloat() 返回一个 float64(例如双精度)。我尝试指定 dtype 参数,但无济于事。

谁能指出一个使用 64 位或 128 位数值的 tensorflow 示例?我对使用 BigInt 等大整数值特别感兴趣。我的问题的浮点部分只是我在试验时遇到的一个相关问题。我认为它可能会为处理大整数提供一些线索。

谢谢

【问题讨论】:

  • parseFloat 返回一个数字。数字在 JS 中是 64 位浮点数(具有 52 位安全整数和 32 位二进制操作)
  • 感谢您的回复澄清了我的问题。我在我的问题中将 Numbers 称为 float64 很草率。我这样做是为了强调 32 位和 64 位浮点数之间的区别,尽管正如您所描述的那样,我指的是 Javascript 使用的 64 位浮点数数据类型。尽管如此,我最初的问题仍然存在,我可以对大于 32 位的数据进行基本的精确整数数学运算吗?例如,我可以添加两个标量张量,一个值为 2^60,另一个值为 (2^60)+1?有什么例子吗?
  • 是的,我说的上限是52bit

标签: javascript tensorflow biginteger bigdecimal tensorflow.js


【解决方案1】:

tensorflow.js 不支持 64 位浮点数。

这里有一个简单的操作,使用float32 dtype 会输出不正确的结果:

tf.scalar(12045).mul(tf.scalar(12045)).print() 

把dtype改成int32,问题就解决了。

console.log(12045 * 12045)
tf.scalar(12045).mul(tf.scalar(12045)).print() // wrong output because of dtype

console.log(tf.getBackend())
tf.scalar(12045, 'int32').mul(tf.scalar(12045, 'int32')).print()
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"> </script>
  </head>

  <body>
  </body>
</html>

tf.scalar(BigInt(42).toString()).toString(true)

它可以工作,因为数据仍然可以转换为 int32 或 float32 而不会溢出。 这是无效的转换

tf.scalar(BigInt(42455555555555555555544).toString()).print()

现在最好坚持使用 int32float32 进行张量操作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多