如何将 2D Eigen::Tensor 更改为 Eigen::Matrix
how to change 2D Eigen::Tensor to Eigen::Matrix
看起来很简单。我原以为可以进行某种类型的转换,但我似乎找不到任何文档。
虽然我在我的应用程序中找到了避免使用 Eigen::Matrix class 的方法,但 TensorFlow 仅适用于 Eigen::Tensor,而我使用的另一个库仅具有直接使用的功能Eigen::Matrix。如果我可以将 Tensor 转换为 Matrix 并使用它,那么代码的可读性将是惊人的。
编辑:似乎 TensorFlow 确实有一个函数可以得到一个 Eigen::Matrix(仍在测试中)。也许这会使原来的问题变得不那么有趣(也许没有人需要将张量转换为矩阵。)但是我仍然认为这是一个有效的问题。所以我不会放下我的
edit 2:在一些构建错误后查看 TF 文档,似乎 tensorflow 的 Tensor::matrix() 函数只是 returns a 2d Eigen::Tensor,所以转换实际上是必须的。
这是 TensorFlow 线性代数运算的常见用例,可以在 tensorflow/core/kernels/linalg_ops_common.cc
中找到实现。但是,该代码是高度模板化的,因此有一个具体示例可能会有用。
假设您从元素类型为 float
的名为 t
的 tensorflow::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 */);
看起来很简单。我原以为可以进行某种类型的转换,但我似乎找不到任何文档。
虽然我在我的应用程序中找到了避免使用 Eigen::Matrix class 的方法,但 TensorFlow 仅适用于 Eigen::Tensor,而我使用的另一个库仅具有直接使用的功能Eigen::Matrix。如果我可以将 Tensor 转换为 Matrix 并使用它,那么代码的可读性将是惊人的。
编辑:似乎 TensorFlow 确实有一个函数可以得到一个 Eigen::Matrix(仍在测试中)。也许这会使原来的问题变得不那么有趣(也许没有人需要将张量转换为矩阵。)但是我仍然认为这是一个有效的问题。所以我不会放下我的
edit 2:在一些构建错误后查看 TF 文档,似乎 tensorflow 的 Tensor::matrix() 函数只是 returns a 2d Eigen::Tensor,所以转换实际上是必须的。
这是 TensorFlow 线性代数运算的常见用例,可以在 tensorflow/core/kernels/linalg_ops_common.cc
中找到实现。但是,该代码是高度模板化的,因此有一个具体示例可能会有用。
假设您从元素类型为 float
的名为 t
的 tensorflow::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 */);