【问题标题】:Calling scipy special functions on Tensorflow tensors?在 Tensorflow 张量上调用 scipy 特殊函数?
【发布时间】:2023-03-14 01:57:03
【问题描述】:

使用 Tensorflow 张量作为参数调用 scipy/numpy 特殊函数时是否有任何性能成本?而不是使用tensorflow.math提供的功能?

我问是因为 scipy 上提供了一些特殊功能,但 Tensorflow 上没有(例如scipy.special.erfcx)。我认为 Tensorflow 提供了 tensorflow.math 中的功能,而不是推荐直接使用 numpy 或 scipy,因为这提供了一些加速?

编辑:请注意,我尝试使用@tf.function

import scipy.special
import tensorflow as tf

@tf.function
def erfcx(x):
    return tf.convert_to_tensor(scipy.special.erfcx(x))

但是当我在 tf.Tensor 上调用它时出现错误。

A = tf.random.uniform((5,6))
erfcx(A)
# NotImplementedError: Cannot convert a symbolic Tensor (x:0) to a numpy array.

有什么建议吗?

【问题讨论】:

  • TF 拥有自己的高度优化的 CUDA 内核,用于其操作。因此,当您使用自定义函数时,您会失去这种效率(并非总是因为@tf.function 可以将 python 转换为tf.Graph)。因此,是的,总是首选使用tf.ops 而不是其他操作。但是,您获得的加速类型会有所不同,具体取决于该操作实际上的可并行化程度。
  • @thushv89 请参阅编辑。我尝试使用@tf.function,但它给出了错误。
  • 可能 TF 对它可以转换为 TF 操作的内容有限制。我试图使用tf.numpy_function,但也失败了。当我启动并运行某些东西时,我会看看并发布答案
  • scioy 函数不能直接使用 tensorflow 对象。他们将首先尝试将它们转换为 numpy 数组。最好让 tensorfow 先做正确的转换。

标签: python-3.x numpy scipy tensorflow2.0


【解决方案1】:

因此您可以执行以下操作。但是,我认为您不能将此函数与 @tf.function 一起使用,这对于 TF 构建图形来说可能太难了。这将在 Eager 执行模式下运行。

import tensorflow as tf

x = tf.ones(shape=[10,2], dtype=np.float32)
erfcx = tf.numpy_function(scipy.special.erfcx,[x], tf.float32)

【讨论】:

  • 是的,它实际上比调用它自己的函数慢(不幸的是)
  • 只使用tf.convert_to_tensor(scipy.special.erfcx(x)) 怎么样? (我不确定你如何对这些东西进行基准测试)。
  • 您可以在 Jupyter 上使用 %timeit 魔术命令来计时。你也可以做你刚才提到的。
猜你喜欢
  • 2021-12-10
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多