【问题标题】:how to change 2D Eigen::Tensor to Eigen::Matrix如何将 2D Eigen::Tensor 更改为 Eigen::Matrix
【发布时间】:2016-09-13 17:00:17
【问题描述】:

看起来很简单。我原以为可以进行某种类型的转换,但我似乎找不到任何文档。

虽然我在我的应用程序中找到了避免使用 Eigen::Matrix 类的方法,但 TensorFlow 仅适用于 Eigen::Tensor,而我使用的另一个库仅具有直接使用 Eigen::Matrix 的功能。如果我可以将张量转换为矩阵并使用它,那么代码的可读性将会非常出色。

edit:似乎 TensorFlow 确实具有获取 Eigen::Matrix 的功能(仍在测试中)。也许这会使原始问题变得不那么有趣(也许没有人需要将张量转换为矩阵。)但是我仍然认为这是一个有效的问题。所以我不会放下我的

编辑 2:在一些构建错误后查看 TF 文档,似乎 tensorflow 的 Tensor::matrix() 函数只是返回一个 2d Eigen::Tensor,因此实际上必须进行转换。

【问题讨论】:

    标签: tensorflow eigen3


    【解决方案1】:

    这是 TensorFlow 线性代数运算的常见用例,可在 tensorflow/core/kernels/linalg_ops_common.cc 中找到实现。但是,该代码是高度模板化的,因此提供一个具体示例可能会很有用。

    假设您从一个名为 t 且元素类型为 floattensorflow::Tensor 开始,您可以制作一个特征矩阵 m,如下所示:

    tensorflow::Tensor t = ...;
    
    auto m = Eigen::Map<Eigen::Matrix<
                 float,           /* scalar element type */
                 Eigen::Dynamic,  /* num_rows is a run-time value */
                 Eigen::Dynamic,  /* num_cols is a run-time value */
                 Eigen::RowMajor  /* tensorflow::Tensor is always row-major */>>(
                     t.flat<float>().data(),  /* ptr to data */
                     t.dim_size(0),           /* num_rows */
                     t.dim_size(1)            /* num_cols */);
    

    如果您的张量来自 tensorflow::OpKernel 的输入(例如在 Compute() 方法中),您将使用稍微不同的类型,并带有适当的 const 限定条件:

    OpKernelContext* ctx = ...;
    const tensorflow::Tensor t = ctx->input(...);
    
    const auto m = Eigen::Map<const Eigen::Matrix<
                       float,           /* scalar element type */
                       Eigen::Dynamic,  /* num_rows is a run-time value */
                       Eigen::Dynamic,  /* num_cols is a run-time value */
                       Eigen::RowMajor  /* tensorflow::Tensor is always row-major */>>(
                           t.flat<float>().data(),  /* ptr to data */
                           t.dim_size(0),           /* num_rows */
                           t.dim_size(1)            /* num_cols */);
    

    【讨论】:

    • 哦,嘿,我在完成编辑时看到了这一点。这个答案实际上比我想象的更有意义。非常感谢您的帮助!
    • 是的,成功的一半是取消模板定义:)。很高兴为您提供帮助!
    • 另外,虽然您的回答完全正确,但一般的 Tensorflow 用例可能涉及通过 OpKernelContext* 输入函数获取张量,该函数返回一个 const Tensor。同样,映射到的 Eigen::Matrix 也需要为 const。 (这仅适用于像我这样不太了解 c++ 并且不能很好地阅读编译器错误的人。我花了一个小时弄清楚为什么它抱怨找不到合适的构造函数。)
    • 这很好!在这种情况下,您可能希望使用来自tensorflow/core/kernels/linalg_ops_common.hConstMatrixMap。请注意,它是在一个类中定义的,该类又以Scalar 类型(例如float)为模板。为此,我用具体类型更新了答案。
    • @mrry 非常感谢您的回答!完成计算后,我们如何将 Eigen::Matrix 类型的结果分配给 tensorflow::Tensor 类型的 output_tensor?
    猜你喜欢
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多