粗糙tf.mapTensor上的Tensorflow www.example.com _fn失败,类型为“RaggedTensor”的对象没有len

m2xkgtsf  于 2022-10-29  发布在  其他
关注(0)|答案(5)|浏览(158)
  • 请确保这是一个错误。根据我们的

GitHub Policy
我们仅解决代码/文档错误、性能问题、功能请求和
GitHub上的构建/安装问题。tag:bug_template*

系统信息

  • 我是否编写了自定义代码(而不是使用TensorFlow中提供的常用示例脚本):没有
  • 操作系统平台和分发版(例如Linux Ubuntu 16.04):Linux(包括采用英特尔技术的RHEL 7 Power PC和Ubuntu 21.04)
  • TensorFlow安装自(源代码或二进制文件):康达安装tensorflow
  • TensorFlow版本(使用下面的命令):在2.4.1和2.5.0中进行测试
  • Python版本:3.7.10
  • CUDA/cuDNN版本:软件工具包10.1.243(英特尔)和10.2(PowerPC)
  • GPU型号和内存:2080 TI(英特尔)和A100(PowerPC)
python -c "import tensorflow as tf; print(tf.version.GIT_VERSION, tf.version.VERSION)
> "
2021-08-04 23:57:32.182116: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.10.1
unknown 2.4.1

描述当前行为

https://stackoverflow.com/questions/68658093/tensorflow-tf-map-fn-over-ragged-tensor-fails-with-object-of-type-raggedtensor
此Tensorflow文档给出了tf.map在粗糙Tensor上使用www.example.com _fn的示例,该示例适用于Tensorflow 2.4.1及更高版本:

digits = tf.ragged.constant([[3, 1, 4, 1], [], [5, 9, 2], [6], []])
print(tf.map_fn(tf.math.square, digits))

但是,以下示例在Tensorflow 2.4.1或Tensorflow 2.5中运行时会导致错误“类型为”RaggedTensor“的对象没有len”:

import tensorflow as tf

X=tf.ragged.constant([[1.,2.],[3.,4.,5.]], dtype=tf.float32)

@tf.function
def powerX(i):
    global X
    return X**i

Y = tf.map_fn(powerX, tf.range(3, dtype=tf.float32))

描述预期行为

它应该返回一个粗糙的Tensor。

重现问题的独立代码

import tensorflow as tf

X=tf.ragged.constant([[1.,2.],[3.,4.,5.]], dtype=tf.float32)

@tf.function
def powerX(i):
    global X
    return X**i

Y = tf.map_fn(powerX, tf.range(3, dtype=tf.float32))
rsaldnfx

rsaldnfx1#

@jvishnuvardhan,
我可以在TF 2.5TF nightly中重现错误。请找到gist here。谢谢!

gab6jxml

gab6jxml2#

我发现并行化任何涉及tf.where和tf.gather的函数都非常困难,这会导致中间步骤中存在不等长度的Tensor。这使得Tensorflow非常困难,不适合编写并行算法,而不适合编写所有大小都相同的机器学习工具。

2eafrhcq

2eafrhcq3#

当您使用tf.map_fn搭配RaggedTensors时,您目前需要指定函数的输出签章。在此情况下,您的函数会传回2D RaggedTensor,因此下列其中一项都可以使用:

Y = tf.map_fn(powerX, tf.range(3, dtype=tf.float32), 
              fn_output_signature=tf.RaggedTensorSpec([None, None], tf.float32))

或者:

Y = tf.map_fn(powerX, tf.range(3, dtype=tf.float32), 
              fn_output_signature=tf.RaggedTensorSpec([2, None], tf.float32))
nuypyhwy

nuypyhwy4#

(The tf.map_fn(tf.math.square, digits)示例在不指定输出签名的情况下工作的原因是输出签名与输入签名相同。在这种情况下,您不需要指定它。)

1l5u6lss

1l5u6lss5#

感谢您的澄清。我对tf.map_fn的经验是,无论如何,它都不会导致并行内核在GPU上运行。这与Python for循环差不多。获得真实的并行性的唯一方法是使用tf.vectorized_map。具有相同大小的Tensor这需要一些非常繁琐的方法重构、向量填充和巧妙的技巧,以便用于大小为M1的1个问题示例的算法可以在-将N个问题转化为一系列纯向量运算,这些运算对大小为max(M1,... MN)的大小一致的向量进行运算。我不确定如果我尝试沿着cupy的路线进行运算,是否会有相同的体验。无论如何,这是相当令人沮丧的。

相关问题