如何在TensorFlow中打印SparseTensor内容?

Ada*_*air 1 python tensorflow

为了快速调试,我正在尝试打印出刚刚初始化的SparseTensor.

内置的print函数只是说它是一个SparseTensor对象,而tf.Print()给出了一个错误.错误语句会打印对象的内容,但不会以显示实际条目的方式打印(除非它告诉我它是空的,有一些:0我不知道它的意义).

rows = tf.Print(rows, [rows])

TypeError: Failed to convert object of type <class 'tensorflow.python.framework.sparse_tensor.SparseTensor'> to Tensor. Contents: SparseTensor(indices=Tensor("SparseTensor/indices:0", shape=(6, 2), dtype=int64), values=Tensor("SparseTensor/values:0", shape=(6,), dtype=float32), dense_shape=Tensor("SparseTensor/dense_shape:0", shape=(2,), dtype=int64)). Consider casting elements to a supported type.
Run Code Online (Sandbox Code Playgroud)

Ada*_*air 6

方式0:运行SparseTensor并打印结果

运行图形(在本例中只是SparseTensor对象)返回一个SparseTensorValue对象,该对象的打印格式与用于初始化SparseTensor的调用相同,这最终是我想要的.

with tf.Session() as sess:
  rows = sess.run(rows)
  print(rows)
Run Code Online (Sandbox Code Playgroud)

方法1:转换为密集矩阵后使用打印

要使用Print功能,我可以在我的情况下转换为密集矩阵.但是Print仅在运行图形时执行:

rows = tf.sparse_tensor_to_dense(rows)
rows = tf.Print(rows, [rows], summarize=100)
with tf.Session() as sess:
  sess.run(rows)
Run Code Online (Sandbox Code Playgroud)

注意"汇总" - 默认设置只打印出零,因为它获得了以密集形式表示的稀疏矩阵的前几个条目!

方式2:使用tf.test.TestCase

我发现TestCase.evaluate方法给了我一种我想要的漂亮格式,与上面的Way 0相同:

print(str(self.evaluate(rows)))
Run Code Online (Sandbox Code Playgroud)

输出例如:

SparseTensorValue(indices=array([[1, 2],
   [1, 7],
   [1, 8],
   [2, 2],
   [3, 4],
   [3, 5]]), values=array([1., 1., 1., 1., 1., 1.], dtype=float32), dense_shape=array([4, 9]))
Run Code Online (Sandbox Code Playgroud)