Python 3.x 在Tensorflow张量上调用scipy特殊函数?

Python 3.x 在Tensorflow张量上调用scipy特殊函数?,python-3.x,numpy,scipy,tensorflow2.0,Python 3.x,Numpy,Scipy,Tensorflow2.0,当使用Tensorflow张量作为参数调用scipy/numpy特殊函数时,是否有性能代价?与使用tensorflow.math提供的函数相反 我这样问是因为scipy上有一些特殊功能,但Tensorflow上没有(例如scipy.special.erfcx)。我假设Tensorflow提供了Tensorflow.math中的函数,而不是建议直接使用numpy或scipy,因为这提供了一些加速 编辑:注意,我试图使用@tf.function: 导入scipy.special 导入tensorfl

当使用Tensorflow张量作为参数调用scipy/numpy特殊函数时,是否有性能代价?与使用tensorflow.math提供的函数相反

我这样问是因为scipy上有一些特殊功能,但Tensorflow上没有(例如
scipy.special.erfcx
)。我假设Tensorflow提供了
Tensorflow.math
中的函数,而不是建议直接使用numpy或scipy,因为这提供了一些加速

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

导入scipy.special
导入tensorflow作为tf
@功能
def erfcx(x):
返回tf.convert_到_张量(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.function
一起使用,这对于tf构建图形来说可能太难了。这将在紧急执行模式下运行

import tensorflow as tf

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

TF有自己的高度优化的CUDA内核用于其操作。因此,每当您使用自定义函数时,都会失去这种效率(并非总是@tf.function可以将python转换为
tf.Graph
)。因此,是的,总是首选使用
tf.ops
而不是其他ops。但是,您得到的加速比类型是不同的,这取决于op实际上是如何可并行的。@thushv89请参见编辑。我试图使用
@tf.function
,但它给出了一个错误。很可能tf在转换成tf-ops时有局限性。我试图使用
tf.numpy\u函数
,但也失败了。我会看一看,然后在我启动并运行时发布一个答案。scioy函数不能直接使用tensorflow对象。他们将首先尝试将它们转换为numpy数组。最好让tensorfow先做正确的转换。是的,它比调用函数本身要慢。事实上(不幸的是)只使用
tf。convert_to_tensor(scipy.special.erfcx(x))
?(我不确定如何对这些东西进行基准测试)。您可以在Jupyter上使用
%timeit
magic命令对这些东西进行计时。你也可以做你刚才提到的事情。