包裹Eigen的张量类来创建动态等级张量?

时间:2017-11-13 23:57:27

标签: c++ templates eigen eigen3

Eigen的张量模块通过使用模板参数支持静态秩张量,类似于Eigen::Tensor<typename T,int dims>。我只会使用Eigen::Tensor<double, n>,其中n在编译时不一定是已知的。无论如何要做一个类:

class TensorWrapper{
    Eigen::Tensor<double,??????> t; //not sure what could go here
    TensorWrapper(int dimensions){
        t = Eigen::Tensor<double,dimensions>(); //wouldn't work either way
    }
};

我知道Eigen::Tensor<double,2>Eigen::Tensor<double,3>完全没有任何关系,因为它们是模板化的,我不能在运行时确定模板参数,所以上面会失败百般。我也知道Tensorflow中的张量支持这一点,但它们在c ++中没有张量收缩(这就是我首先需要张量的原因)。有没有办法做我想要的,即使是有限数量的尺寸(我不需要超过5或6)?如果没有,是否有任何支持动态秩和张量收缩的c ++张量库?

1 个答案:

答案 0 :(得分:0)

您好我写了这个多维张量库(它没有完全成熟),它支持dotproduct和pointwise元素等基本操作。

https://github.com/josephjaspers/BlackCat_Tensors

Tensor<float> tensor3 = {3, 4, 5};   -- generates a 3 dimensional tensor (3 rows, 4 columns, 5 pages)
Tensor<float> tensor5 = {1,2,3,4,5}; -- generate a 5d tensors (1 rows, 2 columns, 3 pages, etc)
tensor3[1] = 3;                      -- returns the second matrix and sets all the values to 3. 
tensor3[1][2];                       -- returns the second matrx and then then 3rd column of that matrix
tensor3({1,2,3},{2,2});              -- at index 1,2,3, returns a sub-matrix of dimensions 2x2

所有的访问者运算符[](int index)和({initializer_list index},{initializer_list shape})都返回单独的张量,但它们都引用相同的内部数组。因此,您可以从这些sub_tensors修改原始张量。

所有数据都分配在一个阵列上。如果你想使用dotproduct,你需要将它链接到BLAS。这是头文件,它详细介绍了大多数方法。 https://github.com/josephjaspers/BlackCat_Tensors/blob/master/BC_Headers/Tensor.h

然而,它并不是特别快,我个人只是将这个个人库用于NeuralNetworks(https://github.com/josephjaspers/BlackCat_NeuralNetworks)的原型设计。