如何将2D Eigen :: Tensor更改为Eigen :: Matrix

Ale*_*kov 6 eigen3 tensorflow

看起来很简单.我本以为某种铸造是可能的,但我似乎找不到任何文件.

虽然我在我的应用程序中找到了避免使用Eigen :: Matrix类的方法,但TensorFlow仅适用于Eigen :: Tensor,而我使用的另一个库只具有直接使用Eigen :: Matrix的功能.如果我可以将Tensor作为矩阵进行投射并使用它,那么代码可读性将是非常壮观的.

编辑:似乎TensorFlow DOES有一个函数来获取Eigen :: Matrix(仍在测试它).也许这会使原始问题变得不那么有趣(也许没有人需要将Tensors转换为Matrices.)但我仍然认为这是一个有效的问题.所以我不会放下我的

编辑2:在一些构建错误之后通过TF文档,似乎tensorflow的Tensor :: matrix()函数只返回一个2d Eigen :: Tensor,所以转换实际上是必要的.

mrr*_*rry 12

这是TensorFlow的线性代数操作的常见用例,可以在其中找到实现tensorflow/core/kernels/linalg_ops_common.cc.但是,该代码是高度模板化的,因此有一个具体的例子可能是有用的.

假设您从一个带元素类型的tensorflow::Tensor被调用开始,您可以按如下方式创建一个特征矩阵:tfloatm

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 */);
Run Code Online (Sandbox Code Playgroud)

如果你的张量来自a的输入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 */);
Run Code Online (Sandbox Code Playgroud)

  • 此外,虽然您的答案是完全正确的,但一般的Tensorflow用例可能涉及通过OpKernelContext*输入函数获取张量,该函数返回const Tensor.同样,映射到的Eigen :: Matrix也需要是const.(这只适用于像我这样不熟悉c ++并且无法很好地读取编译器错误的人.我花了一个小时来弄清楚为什么抱怨找不到合适的构造函数.) (2认同)