在 Tensorflow 中使用不同的 Tensor 类型

Working with different Tensor types in Tensorflow

我正在努力处理不同的张量类型和它们之间的操作。例如,基本除法 tf.divide(a, b) 给我以下错误:

TypeError: Failed to convert elements of SparseTensor(indices=Tensor("inputs_8_copy:0", shape=(None, 2), dtype=int64), values=Tensor("cond/Cast_1:0", shape=(None,), dtype=float64), dense_shape=Tensor("inputs_10_copy:0", shape=(2,), dtype=int64)) to Tensor. Consider casting elements to a supported type. See https://www.tensorflow.org/api_docs/python/tf/dtypes for supported TF dtypes.

我可以通过在 ab 上调用 tf.sparse.to_dense 来解决这个问题。但是当数据集很大时,该方法无法扩展。它通常也不起作用,因为我不知道所有特征的张量类型(我在 TFT 中的 preprocessing_fn 中工作,数据来自 BigQuery)。

这似乎是一个很常见的问题,应该有一个简单的答案,但我找不到关于它的任何信息。像基本除法这样的东西应该不会造成这么大的麻烦吧?

事实上,这是一个很难的问题。
特别是对于 element-wise 除法,假设 ai 和 bi 是标量。如果 ai = 0 且 bi 不为零,则 ai/bi = 0,但如果 ai = 0 且 bi = 0,ai/bi = 怎么办? 0?
更糟糕的是,如果 ai 不为零且 bi = 0,则 ai/bi 为 NaN! 因此,如果除数是稀疏张量,它将产生(可能很多)NaN,除非两个稀疏矩阵的索引相同。如果将密集矩阵除以稀疏矩阵,也会出现同样的问题。

有一个很好的解决方法,可以根据关系 (a+b)^2 = a^2 + b^2 + 2 ab 将两个稀疏张量 element-wise 相乘。
也可以计算稀疏张量 C 的倒数:tf.SparseTensor(indices=C.indices, values=1/C.values, dense_shape=C.dense_shape).

所以除法有这个NaN问题,关于稠密张量和稀疏张量的混合,一种选择是将稀疏张量转换为稠密张量。但我们想避免这种情况。另一方面,将密集张量转换为稀疏张量,如果张量不是真的稀疏,这可能非常无效。

说了这么多,好像不是个简单的问题。