在 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.
我可以通过在 a
和 b
上调用 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问题,关于稠密张量和稀疏张量的混合,一种选择是将稀疏张量转换为稠密张量。但我们想避免这种情况。另一方面,将密集张量转换为稀疏张量,如果张量不是真的稀疏,这可能非常无效。
说了这么多,好像不是个简单的问题。
我正在努力处理不同的张量类型和它们之间的操作。例如,基本除法 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.
我可以通过在 a
和 b
上调用 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问题,关于稠密张量和稀疏张量的混合,一种选择是将稀疏张量转换为稠密张量。但我们想避免这种情况。另一方面,将密集张量转换为稀疏张量,如果张量不是真的稀疏,这可能非常无效。
说了这么多,好像不是个简单的问题。