美文网首页
paddle中eigen的使用

paddle中eigen的使用

作者: sweetsky0901 | 来源:发表于2017-12-22 12:32 被阅读0次

最近在写ssd里需要用到的cross channel norm。第一次需要在paddlepaddle开发的时候需要用到eigen。过程有点坎坷
不过写过一次就还好了。
主要涉及到这么几点:

  • paddle的tensor和eigen的数据类型的转换
  • 对行(列)的求和等操作
  • 矩阵和向量按照行和列的操作。
  • GPU的支持
  • eps的数据类型问题

paddlepaddle的Tensor和eigen的矩阵的转化

第一步

template <typename T, int MajorType = Eigen::RowMajor,                                                 
          typename IndexType = Eigen::DenseIndex>                                                      
using EigenVector = framework::EigenVector<T, MajorType, IndexType>;                                   
template <typename T, int MajorType = Eigen::RowMajor,                                                 
          typename IndexType = Eigen::DenseIndex>                                                      
using EigenMatrix = framework::EigenMatrix<T, MajorType, IndexType>; 

这里有一个小坑,[1 ,n] 或者[n,1]的tensor,是不能转成Matrix的,只能转成Vector

第二步,开始转化,这里举例了一个求平方的操作

EigenMatrix<T>::From(paddle里的tensor, tensor的dims)

framework::Tensor x_square;                                                                         
x_square.mutable_data<T>(in_x->dims(), context.GetPlace());                                     
    auto x_square_eigen = EigenMatrix<T>::From(                                                     
        x_square, framework::make_ddim({batch_size, fea_len * channels}));   
auto x = EigenMatrix<T>::From(                                                                  
        *in_x, framework::make_ddim({batch_size, fea_len * channels}));                       
x_square_eigen.device(*place) = x.square();                           

对行和列的求和操作

比如对列求和

auto dim = Eigen::array<int, 1>({{0}});
xx.sum(dim)

framework::Tensor tmp_tensor;                                                                 
tmp_tensor.mutable_data<T>(framework::make_ddim({1, fea_len}),                                
                                 context.GetPlace());                                               
auto tmp = EigenVector<T>::Flatten(tmp_tensor);                                                                                                 
auto dim = Eigen::array<int, 1>({{0}});                                                       
tmp.device(*place) = x_square_batch_eigen.sum(dim);

矩阵和向量按照行和列的操作

需要用到broadcast
比如一个矩阵按row和一个行向量相乘

Eigen::array<int, 2> broadcast_dim_col;                                                       
broadcast_dim_col[1] = 1;                                                                     
broadcast_dim_col[0] = channels;                                                              
out_batch_eigen.device(*place) =                                                              
          in_x_batch_eigen * (tmp.broadcast(broadcast_dim_col)); 

GPU的支持

auto* place =                                                                                      
        context.template device_context<DeviceContext>().eigen_device();
xxx.device(*place) = ...;

eps的数据类型问题

目前尝试的是这样解决,就可以直接 ++ --了

T epsilon = context.Attr<T>("epsilon");

相关文章

网友评论

      本文标题:paddle中eigen的使用

      本文链接:https://www.haomeiwen.com/subject/dpdgwxtx.html