从 Eigen::Tensor 创建张量流::张量

Creating tensorflow::Tensor from Eigen::Tensor

本文关键字:张量流 张量 创建 Tensor Eigen      更新时间:2023-10-16

我应该如何从Eigen::Tensor创建一个张量流::张量?我可以一个接一个地复制元素,但我希望有更好的方法。

没有公共 API 可以在不复制数据的情况下从 Eigen::Tensor 创建 tensorflow::Tensor。但是,您可以使用以下 API 创建一个 tensorflow::Tensor 并将其解释为 Eigen::TensorMap: tensorflow::Tensor tf_tensor(tensor_constructor_args); // For the general case: Eigen::TensorMap<type_params> eigen_tensor = tf_tensor.tensor<Type, NumDims>(); // shortcuts if you know the tensor is a matrix/vector/scalar Eigen::TensorMap<type_params> eigen_matrix = tf_tensor.matrix<Type>(); Eigen::TensorMap<type_params> eigen_vector = tf_tensor.vector<Type>(); Eigen::TensorMap<type_params> eigen_scalar = tf_tensor.scalar<Type>();

这将避免复制。此外,特征张量和张量映射共享相同的 API,因此您可以互换使用它们。

下面是一个可能有用的示例:

Eigen::Tensor<float, 3> TensorflowToEigen(const tensorflow::Tensor& tensor) {
const tensorflow::TensorShape dims = tensor.shape();
Eigen::Tensor<float, 3, Eigen::RowMajor> rm_tensor =
tensor.tensor<float, 3>();
// Change to ColMajor. swap_layout changes the ordering of dimensions, so we
// shuffle them back.
Eigen::Tensor<float, 3> cm_tensor =
rm_tensor.swap_layout().shuffle(Eigen::make_index_list(2, 1, 0));
return cm_tensor;
}
tensorflow::Tensor EigenToTensorflow(const Eigen::Tensor<float, 3>& tensor) {
const Eigen::DSizes<int64_t, 3> dims = tensor.dimensions();
// Change to RowMajor. swap_layout  changes the ordering of dimensions, so we
// shuffle them back.
Eigen::Tensor<float, 3, Eigen::RowMajor> rm_tensor =
tensor.swap_layout().shuffle(Eigen::make_index_list(2, 1, 0));
tensorflow::Tensor tf_tensor(
tensorflow::DT_FLOAT,
tensorflow::TensorShape({dims[0], dims[1], dims[2]}));
tf_tensor.tensor<float, 3>() = rm_tensor;
return tf_tensor;
}