python - TensorFlow tf.sparse_tensor_dense_matmul

标签 python c++ matrix tensorflow

我运行了一个小实验来对 tf.sparse_tensor_dense_matmul 操作进行基准测试。不幸的是,我对结果感到惊讶。

我正在运行稀疏矩阵、密集 vector 乘法和变化

  • 稀疏矩阵的列数(递减)
  • 密集 vector 的行数(递减)
  • 稀疏矩阵的稀疏度(递增)

在增加每次运行的稀疏性的同时,我减少了列。这意味着非零值的数量 (nnz) 始终保持不变(每行 100 个)。

在测量计算 matml 操作所需的时间时,我希望它会保持不变(因为输出大小和 nnz 会发生变化)。

我看到的是以下内容: enter image description here

我查看了 C++ 代码,看是否能找出导致该结果的任何原因。不过,考虑到 C++ 代码,我希望每次运行的时间相同。如果我对代码的理解正确,它会遍历稀疏矩阵 ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L239) 的所有 nnz 值。对于每个 nnz 值,它循环遍历第二个密集矩阵的所有列(在我的例子中它只有一列,因为它是一个 vector )(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L245)。

我可以想象第二个矩阵/vector 的行数影响性能的唯一一点是 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L246如果它遍历第二个矩阵/vector 的所有行,则洞察“maybe_adjoint_b”函数以到达当前需要的行。

[“maybe_adjoint_b”调用让我感到不安的是,调用它时使用作为行索引传递的变量“k”。不过,我认为“m”是行索引,“k”是稀疏矩阵的列索引。]

问题:为什么 matmul 运算的执行时间不同,即使 nnz 和输出大小始终相同?

最佳答案

我实际上认为这不是 TensorFlow 的问题,而是第一种情况下输入 vector 的 8MB 输入不适合 L2 内存。在所有其他情况下, vector <= 800kb 并适合 L2 内存。

关于python - TensorFlow tf.sparse_tensor_dense_matmul,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39135024/

相关文章:

Python Telnet 脚本

C++:使用基类作为接口(interface)的实现

python - 如何使用 reshape 将 N 长度向量 reshape 为 numpy 中的 3x(N/3) 矩阵

python,测试矩阵中的所有值是否小于 numpy.finfo(float).eps

python - 如何从文件中读取位?

python - 如何在图像直方图上显示超出范围的值?

c++ - 使用 g++ 4.9.0 打包扩展失败,但适用于 clang++ 3.4

c++ - 如何通过多个步骤跟踪状态

javascript - 在 Javascript 中创建多维数组和矩阵

python - 在 igraph 中收缩顶点时如何保留/分配节点名称?