Commit 7d4ab222 by liyinqiao

Fix the mistakes in manual and clean the codes.

1. Fix the mistakes in manual. By the way, I have to say there are so many mistakes in the manual. I'm shocked it has been checked a lot of times, but why they are still be there. No one care about that? Really???
2. Clean the codes.
parent 8e21537a
......@@ -175,7 +175,7 @@ $$
* ~/NiuTensor/source/tensor/XCall.h - 定义了张量结构XTensor,以及构建和销毁XTensor的接口
* ~/NiuTensor/source/tensor/core - 存放张量计算的函数声明及函数体实现的源文件
* arithmetic - 存放有关算术运算的源文件
* getandset - 存放有关算术存取的源文件
* getandset - 存放有关数据存取的源文件
* math - 存放有关数学运算的源文件
* movement - 存放有关数据移动的源文件
* reduce - 存放有关规约操作的源文件
......@@ -190,7 +190,7 @@ $$
```cpp
#include "XTensor.h" // 引用XTensor定义的头文件
using namepsace nts; // 使用XTensor所在的命名空间nts
using namespace nts; // 使用XTensor所在的命名空间nts
int main(int argc, const char ** argv)
{
......@@ -212,14 +212,14 @@ int main(int argc, const char ** argv)
g++ sample.cpp -I~/NiuTensor/source/tensor -o sample
```
在sample.cpp中使用了XTensor,它是NiuTensor里的一个类,这个类定义了张量所需的数据结构,我们可以使用这个类轻松完成对张量的计算、拷贝等各种操作。XTensor类型的变量被声明后,还需要被初始化,或者说被真正指定为一个张量,比如,需要指定张量的各个维度、张量中每个单元的数据类型、给张量分配内存空间等。InitTensor2D()就是一个张量初始化函数,它把张量初始化为一个矩阵,有四个参数:指向被初始化的张量的指针,矩阵的列数,矩阵的行数,数据单元的类型。这里X_FLOAT,是NiuTensor自定义的枚举类型,它表示单精度浮点数,我们也可以使用X_INT或X_DOUBLE,将数据类型指定为32bit整数或者双精度浮点数。
在sample.cpp中使用了XTensor,它是NiuTensor里的一个类,这个类定义了张量所需的数据结构,我们可以使用这个类轻松完成对张量的计算、拷贝等各种操作。XTensor类型的变量被声明后,还需要被初始化,或者说被真正指定为一个张量,比如,需要指定张量的各个维度、张量中每个单元的数据类型、给张量分配内存空间等。InitTensor2D就是一个张量初始化函数,它把张量初始化为一个矩阵,有四个参数:指向被初始化的张量的指针,矩阵的列数,矩阵的行数,数据单元的类型。这里X_FLOAT,是NiuTensor自定义的枚举类型,它表示单精度浮点数,我们也可以使用X_INT或X_DOUBLE,将数据类型指定为32bit整数或者双精度浮点数。
NiuTensor也提供了其它方式定义张量。比如可以直接调用一个函数完成张量的创建,而且可以显性释放张量。下面是一段示例代码(sample2.cpp):
```cpp
#include "XTensor.h" // 引用XTensor定义的头文件
using namepsace nts; // 使用XTensor所在的命名空间nts
using namespace nts; // 使用XTensor所在的命名空间nts
int main(int argc, const char ** argv)
{
......@@ -237,55 +237,18 @@ int main(int argc, const char ** argv)
sample2.cpp中使用的NewTensor2D和DelTensor是一组函数,前者生成张量并返回指向这个张量的指针,后者释放指针所指向张量的内容。这种方法比较适合C/C++风格的开发。
> **注意**:在NiuTensor中所有张量默认都是“稠密”张量,也就是张量中所有的单元都会被分配空间,而且这些空间是连续的。有些情况下,张量里的单元仅有少数为非零单元,对于这类张量,可以使用“稀疏"的表示方法,这样可以有效的节省存储空间。
如果要定义稀疏张量,需要在原有的参数基础上额外指定一个参数 - 稠密度。所谓稠密度是指非零单元的比例,他是介于0和1之间的一个实数,0表示所有单元为零,1表示所有单元为非零。默认所有张量的稠密度都是1。下面是不同类型张量的定义方法示例(sample3.cpp)
```cpp
#include "XTensor.h" // 引用XTensor定义的头文件
using namepsace nts; // 使用XTensor所在的命名空间nts
int main(int argc, const char ** argv)
{
// 构建一个单精度浮点类型张量,维度为50列*100行
// 这个张量是稠密的
XTensor * tensor0 = NewTensor2D(50, 100, X_FLOAT);
// 构建一个单精度浮点类型张量,维度为50列*100行
// 这个张量是稠密的
XTensor * tensor1 = NewTensor2D(50, 100, X_FLOAT, 1.0F);
// 构建一个单精度浮点类型张量,维度为50列*100行
// 这个张量是稀疏的,有10%的单元非零
XTensor * tensor2 = NewTensor2D(50, 100, X_FLOAT, 0.1F);
// 之后就可以使用张量tensor0,tensor1和tensor2了
// 释放这些张量
DelTensor(tensor0);
DelTensor(tensor1);
DelTensor(tensor2);
return 0;
}
```
以下是关于张量定义的基础函数:
以下是关于张量定义的基础函数,函数接口在NiuTensor/source/tensor/XCall.h中定义:
| 功能 | 函数| 参数 |
| - | - | - |
| 初始化张量 | void InitTensor(<br>XTensor * tensor, <br>const int myOrder, <br> const int * myDimSize, <br> const TENSOR_DATA_TYPE myDataType, <br>const int myDevID, <br> const bool isEnableGrad) | tensor - 指向被初始化张量的指针 <br> myOrder - 张量的维度 <br> myDimSize - 张量每一维的大小,索引0表示第一维 <br> myDataType - 张量的数据类型 <br> myDevID - 张量所在的设备ID <br> isEnableGrad - 是否允许张量有梯度 |
| 创建空张量 | XTensor * NewTensor() | N/A |
| 创建张量 | XTensor * NewTensor(<br>const int myOrder, <br> const int * myDimSize, <br> const TENSOR_DATA_TYPE myDataType, <br>const int myDevID <br> const bool isEnableGrad) | myOrder - 张量的维度 <br> myDimSize - 张量每一维的大小,索引0表示第一维 <br> myDataType - 张量的数据类型 <br> myDevID - 张量所在的设备ID <br> isEnableGrad - 是否允许张量有梯度 |
| 销毁张量 | void DelTensor(const XTensor * tensor) | tensor - 指向要被销毁的张量的指针 |
| 销毁张量 | void DelTensor(XTensor * tensor) | tensor - 指向要被销毁的张量的指针 |
上述函数中需要说明的是
* 设备ID是指张量所申请的空间所在CPU或者GPU设备的编号,-1表示CPU
* XMem是NiuTensor中的一个内存/显存池类,它负责内存(或显存)的统一管理。关于设备ID和XMem的进一步说明,请参见下一节内容。
* TENSOR_DATA_TYPE定义了张量的数据类型,包括:
| 类型 | 说明 |
......@@ -296,7 +259,7 @@ int main(int argc, const char ** argv)
| X_INT8 | 8bit整数(计划支持)|
| X_FLOAT16 | 16bit浮点数(计划支持) |
此外,NiuTensor也提供了更多种类的张量初始化和创建方法,详见~/NiuTensor/source/tensor/XTensor.h。
此外,NiuTensor也提供了更多种类的张量初始化和创建方法,详见~/NiuTensor/source/tensor/XCall.h。
## 访问张量中的内容
......@@ -309,9 +272,9 @@ int main(int argc, const char ** argv)
| void * data | 保存元素的数据数组 |
| int devID | 设备ID,指张量所申请的空间所在CPU或者GPU设备的编号,-1表示CPU |
| int order | 张量的维度,例如:一个矩阵(维度为2)是一个二维张量 |
| int dimSize[ ] | 张量中每一维度的大小,索引0表示第1维 |
| int dimSize[MAX_TENSOR_DIM_NUM] | 张量中每一维度的大小,索引0表示第1维 |
| TENSOR_DATA_TYPE dataType | 每个数据单元的数据类型 |
| int unitSize | 数据单元的大小,类似于sizeof() |
| int unitSize | 数据单元的大小 |
| int unitNum | 数据单元的数量 |
| bool isSparse | 是否稠密,一个n * m稠密矩阵的数据量大小为n * m,而稀疏(非稠密)矩阵的数据量大小则取决于矩阵中非零元素个数。|
| float denseRatio | 稠密度,指非零单元的比例,是介于0和1之间的一个实数,0表示所有单元全为零,1表示全为非零单元。|
......@@ -321,7 +284,7 @@ int main(int argc, const char ** argv)
| 功能 | 函数 | 参数 |
| - | - | - |
| 设置张量每一维度的大小 | void SetDim(int * myDimSize) |myDimSize - 张量每一维度的大小 |
| 得到张量中给定的维度大小 | int GetDim(const int dim) | dim - 张量的维度 |
| 得到张量中给定的维度大小 | int GetDim(const int dim) const | dim - 张量的维度 |
| 重新调整矩阵维度 | void Reshape(<br> const int order, const int * myDimSize) | order - 张量的维度 <br> myDimSize - 张量每一维的大小 |
| 得到张量中元素数量 | int GetSize() const | N/A |
| 用数组赋值张量 | void SetData(<br> const void * d, int num, int beg) | d - 赋值数组 <br> num - 数组大小 <br> beg - 赋值时从张量的第几位开始 |
......@@ -334,15 +297,14 @@ int main(int argc, const char ** argv)
## 张量计算
NiuTensor提供关于张量计算的函数功能,主要包括一些基本的张量运算以及激活函数,在本节中,主要对这些函数及其用法用例进行介绍。我们以点乘(Multiply)操作为例介绍NiuTensor的几种函数定义形式:
NiuTensor提供关于张量计算的函数功能,主要包括一些基本的张量运算以及激活函数,在本节中,主要对这些函数及其用法用例进行介绍。我们以点乘(Multiply)操作为例介绍NiuTensor的几种推荐使用的函数定义形式:
* _Multiply: 需指定输出张量,只支持前向操作
* Multiply: 输出张量与输入张量相同,只支持前向操作
* MultiplyMe: 输出张量需返回给上层,同时支持前向和反向操作
* Multiply: 输出张量需指定或为函数返回值,同时支持前向和反向操作
* MultiplyMe: 输出张量与输入张量相同,只支持前向操作
### 代数计算(arithmetic)
此部分主要包括多种数学运算,如张量加法、减法、乘法、除法等。
此部分主要包括多种数学运算,如张量加法、减法、乘法(矩阵乘法、点乘)、除法、线性变换等。
#### 除法(Div)
......@@ -369,16 +331,16 @@ $$
```cpp
void Div(const XTensor &a, const XTensor &b, XTensor &c, DTYPE alpha = 0.0, int leadingDim = 0);
void DivMe(const XTensor &a, const XTensor &b, DTYPE alpha = 0.0, int leadingDim = 0);
void DivMe(XTensor &a, const XTensor &b, DTYPE alpha = 0.0, int leadingDim = 0);
XTensor Div(const XTensor &a, const XTensor &b, DTYPE alpha = 0.0, int leadingDim = 0)
XTensor Div(const XTensor &a, const XTensor &b, int leadingDim = 0)
```
Parameters:
* a(XTensor) - 输入张量
* b(XTensor) - 输入张量
* c(XTensor, optional) - 输出张量
* a(XTensor&) - 输入张量(对DivMe函数而言,a同时为输出张量)
* b(XTensor&) - 输入张量
* c(XTensor&) - 输出张量
* alpha(DTYPE) - 系数,默认为0
* leadingDim(int) - 广播维度,沿某一维度执行广播操作,默认为0
......@@ -439,9 +401,9 @@ XTensor Mask(const XTensor &a, const XTensor &mask, XTensor &c, DTYPE alpha = 0.
Parameters:
* a(XTensor) - 输入张量
* mask(XTensor) - 屏蔽张量
* c(XTensor, optional) - 输出张量
* a(XTensor&) - 输入张量(对MaskMe函数而言,a同时为输出张量)
* mask(XTensor&) - 屏蔽张量
* c(XTensor&) - 输出张量
* alpha(DTYPE) - 系数,默认为0
#### 矩阵乘法(MatrixMul)
......@@ -471,23 +433,21 @@ void MatrixMul(const XTensor &a, MATRIX_TRANS_TYPE transposedA, const XTensor &b
XTensor MatrixMul(const XTensor &a, MATRIX_TRANS_TYPE transposedA, const XTensor &b, MATRIX_TRANS_TYPE transposedB, DTYPE alpha = (DTYPE)1.0, XPRunner * parallelRunner = NULL);
void MatrixMul(const XTensor &a, MATRIX_TRANS_TYPE transposedA, const XTensor &b, MATRIX_TRANS_TYPE transposedB,XTensor &c, DTYPE alpha = (DTYPE)1.0, XPRunner * parallelRunner = NULL);
void MatrixMul(const XTensor &a, const XTensor &b, XTensor &c, DTYPE alpha = (DTYPE)1.0, XPRunner * parallelRunner = NULL);
XTensor MatrixMul(const XTensor &a, const XTensor &b, DTYPE alpha = (DTYPE)1.0, XPRunner * parallelRunner = NULL);
void MatrixMul(const XTensor &a, const XTensor &b, XTensor &c, DTYPE alpha = (DTYPE)1.0, XPRunner * parallelRunner = NULL);
```
Parameters:
* a(XTensor) - 输入张量1
* transposedA(MATRIX_TRANS_TYPE) - a是否进行转置
* b(XTensor) - 输入张量2
* transposedB(MATRIX_TRANS_TYPE) - b是否进行转置
* c(XTensor, optional) - 输出张量
* a(XTensor&) - 输入张量1
* transposedA(MATRIX_TRANS_TYPE) - 输入张量1是否进行转置
* b(XTensor&) - 输入张量2
* transposedB(MATRIX_TRANS_TYPE) - 输入张量2是否进行转置
* c(XTensor&) - 输出张量
* alpha(DTYPE) - 系数,默认为1.0
* beta(DTYPE) - 系数,默认为1.0
* parallelRunner(XPRunner) - 并行处理模块
* beta(DTYPE) - 系数,默认为0.0
* parallelRunner(XPRunner*) - 并行处理模块
##### 矩阵乘法片段示例
......@@ -532,12 +492,12 @@ XTensor MatrixMulBatched(const XTensor &a, const XTensor &b, DTYPE alpha = (DTYP
Parameters:
* a(XTensor) - 输入张量1
* transposedA(MATRIX_TRANS_TYPE) - a是否进行转置
* b(XTensor) - 输入张量2
* transposedB(MATRIX_TRANS_TYPE) - b是否进行转置
* a(XTensor&) - 输入张量1
* transposedA(MATRIX_TRANS_TYPE) - 输入张量1是否进行转置
* b(XTensor&) - 输入张量2
* transposedB(MATRIX_TRANS_TYPE) - 输入张量2是否进行转置
* alpha(DTYPE) - 系数,默认为1.0
* parallelRunner(XPRunner) - 并行处理模块,默认为NULL
* parallelRunner(XPRunner*) - 并行处理模块,默认为NULL
##### 矩阵Batch乘法片段示例
......@@ -569,18 +529,20 @@ $$
张量线性变换的调用方式以及参数说明如下所示:
```cpp
XTensor MulAndShift(const XTensor &x, const XTensor &w, const XTensor &b, DTYPE alpha = (DTYPE)1.0, XPRunner * parallelRunner = NULL);
XTensor MulAndShift(const XTensor &x, MATRIX_TRANS_TYPE transposedX, const XTensor &w, MATRIX_TRANS_TYPE transposedW, const XTensor &b, DTYPE alpha = (DTYPE)1.0, XPRunner * parallelRunner = NULL);
XTensor MulAndShift(const XTensor &x, const XTensor &w, const XTensor &b,DTYPE alpha = (DTYPE)1.0, XPRunner * parallelRunner = NULL);
```
Parameters:
* x(XTensor) - 输入张量
* w(XTensor) - 输入张量
* b(XTensor) - 输入张量
* x(XTensor&) - 输入张量
* transposedX(MATRIX_TRANS_TYPE) - 输入张量是否进行转置
* w(XTensor&) - 权重张量
* transposedW(MATRIX_TRANS_TYPE) - 权重张量是否进行转置
* b(XTensor&) - 偏置张量
* alpha(DTYPE) - 系数,默认为1.0
* parallelRunner(XPRunner) - 并行处理模块,默认为NULL
* parallelRunner(XPRunner*) - 并行处理模块,默认为NULL
#### 点乘(Multiply)
......@@ -614,9 +576,9 @@ XTensor Multiply(const XTensor &a, const XTensor &b, DTYPE alpha = 0.0, int lead
Parameters:
* a(XTensor) - 输入张量
* b(XTensor) - 输入张量
* c(XTensor, optional)- 输出张量
* a(XTensor&) - 输入张量(对MultiplyMe函数而言,a同时为输出张量)
* b(XTensor&) - 输入张量
* c(XTensor&)- 输出张量
* alpha(DTYPE) - 系数,默认为0.0
* leadingDim(int) - 沿着指定维度进行点乘操作,默认为0
......@@ -664,8 +626,8 @@ XTensor Negate(const XTensor & a);
Parameters:
* a(XTensor) - 输入张量
* b(XTensor) - 输出张量
* a(XTensor&) - 输入张量(对NegateMe函数而言,a同时为输出张量)
* b(XTensor&) - 输出张量
##### 张量取负片段示例
......@@ -705,8 +667,8 @@ XTensor Sign(const XTensor &a);
Parameters:
* a(XTensor) - 输入张量
* b(XTensor) - 输出张量
* a(XTensor&) - 输入张量(对SignMe函数而言,a同时为输出张量)
* b(XTensor&) - 输出张量
##### 张量符号片段示例
......@@ -754,9 +716,9 @@ XTensor Sub(const XTensor &a, const XTensor &b, DTYPE beta = (DTYPE)1.0)
Parameters:
* a(XTensor) - 输入张量
* b(XTensor) - 输入张量
* c(XTensor, optional) - 输出张量
* a(XTensor&) - 输入张量(对SubMe函数而言,a同时为输出张量)
* b(XTensor&) - 输入张量
* c(XTensor&) - 输出张量
* beta(DTYPE) - 缩放系数,默认为1.0
##### 张量减法片段示例
......@@ -806,9 +768,9 @@ XTensor Sum(const XTensor &a, const XTensor &b, DTYPE beta = (DTYPE)1.0);
Parameters:
* a(XTensor) - 输入张量
* b(XTensor) - 输入张量
* c(XTensor, optional) - 输出张量
* a(XTensor&) - 输入张量(对SumMe函数而言,a同时为输出张量)
* b(XTensor&) - 输入张量
* c(XTensor&) - 输出张量
* beta(DTYPE) - 缩放系数,默认为1.0
##### 张量加法片段示例
......@@ -845,9 +807,9 @@ XTensor ConvertDataType(const XTensor & input, TENSOR_DATA_TYPE dataType);
```
Parameters:
* input(XTensor) - 输入张量
* output(XTensor) - 输出张量
* dataType - 数据类型
* input(XTensor&) - 输入张量
* output(XTensor&) - 输出张量
* dataType(TENSOR_DATA_TYPE) - 数据类型
##### ConvertDataType片段示例
ConvertDataType示例代码如下,本例中将张量中元素数据类型由flaot32转换为int32。
......@@ -861,7 +823,7 @@ XTensor * b = NewTensor(aOrder, aDimSize, X_INT);
调用ConvertDataType函数
```cpp
/* call ConvertDataType function */
ConvertDataType(a, b, int);
ConvertDataType(a, b, X_INT);
```
有关张量ConvertDataType的详细代码示例见:
......@@ -901,13 +863,14 @@ NiuTensor提供了张量的选择操作,调用方法及参数说明如下所
第一种选择操由一个0,1构成的index矩阵对张量进行选择:
```cpp
XTensor Select(const XTensor &a, XTensor &indexCPU)
XTensor Select(const XTensor &a, XTensor &index, int dim)
```
Parameters:
* a(XTensor) - 输入张量
* indexCPU(int) - 张量选择标志
* a(XTensor&) - 输入张量
* index(XTensor&) - 张量选择索引
* dim(int) - 在哪一维对张量进行张量选择操作
第二种调用方式是按位置范围对张量进行选择:
```cpp
......@@ -915,10 +878,10 @@ XTensor SelectRange(const XTensor &a, int dim, int low, int high)
```
Parameters:
* a - 输入张量
* dim - 在哪一维对张量进行张量选择操作
* low - 张量选择范围的下限
* high - 张量选择范围的上限
* a(XTensor&) - 输入张量
* dim(int) - 在哪一维对张量进行张量选择操作
* low(int) - 张量选择范围的下限
* high(int) - 张量选择范围的上限
> 需要**注意**的是,当张量选择的取值范围为[1,3]时意味着选择的是索引位置为1和2的值
......@@ -954,8 +917,8 @@ void SetDataFixed(XTensor &tensor, DTYPE p)
```
Parameters:
* tensor(XTensor) - 输入张量
* p(int) - 设置的值
* tensor(XTensor&) - 输入张量
* p(DTYPE) - 设置的值
设置张量为整型值:
```cpp
......@@ -963,7 +926,7 @@ void SetDataFixedInt(XTensor &tensor, int p);
```
Parameters:
* tensor(XTensor) - 输入张量
* tensor(XTensor&) - 输入张量
* p(int) - 固定整型值
设置张量为单精度浮点值:
......@@ -972,7 +935,7 @@ void _SetDataFixedFloat(XTensor * tensor, float p)
```
Parameters:
* tensor(XTensor) - 输入张量
* tensor(XTensor*) - 输入张量
* p(float) - 固定单精度浮点值
设置张量为双精度浮点值:
......@@ -981,14 +944,14 @@ void _SetDataFixedDouble(XTensor * tensor, double p)
```
Parameters:
* tensor(XTensor) - 输入张量
* tensor(XTensor*) - 输入张量
* p(double) - 固定双精度浮点值
设置张量为随机分布:
```cpp
void _SetDataRand(XTensor * tensor, DTYPE low, DTYPE high)
```
* tensor(XTensor) - 输入张量
* tensor(XTensor*) - 输入张量
* low(DTYPE) - 取值下限
* high(DTYPE) - 取值上限
......@@ -998,7 +961,7 @@ void _SetDataRandN(XTensor * tensor, DTYPE mean, DTYPE standardDeviation)
```
Parameters:
* tensor(XTensor) - 输入张量
* tensor(XTensor*) - 输入张量
* mean(DTYPE) - 均值
* standardDeviation(DTYPE) - 标准差
......@@ -1059,8 +1022,8 @@ XTensor Clip(const XTensor & a, DTYPE lower, DTYPE upper)
```
Parameters:
* a(XTensor) - 输入张量
* b(XTensor) - 输出张量
* a(XTensor&) - 输入张量(对ClipMe函数而言,a同时为输出张量)
* b(XTensor&) - 输出张量
* lower(DTYPE) - 裁剪范围下限
* upper(DTYPE) - 裁剪范围上限
......@@ -1111,13 +1074,13 @@ XTensor Normalize(const XTensor &input, int dim, const XTensor &mean, const XTen
```
Parameters:
* input(XTensor) - 输入张量
* output(XTensor) - 输出张量
* input(XTensor&) - 输入张量(对NormalizeMe函数而言,input同时为输出张量)
* output(XTensor&) - 输出张量
* dim(int) - 沿着指定维度产生均值和方差
* mean(XTensor) - 均值
* var(XTensor) - 方差
* a(XTensor) - 缩放
* b(XTensor) - 偏置
* mean(XTensor&) - 均值
* var(XTensor&) - 方差
* a(XTensor&) - 缩放
* b(XTensor&) - 偏置
* epsilon(DTYPE) - 防止方差为0的参数
##### Normalize片段示例
......@@ -1168,8 +1131,8 @@ XTensor ScaleAndShift(const XTensor &a, DTYPE scale, DTYPE shift = 0)
Parameters:
* a(XTensor) - 输入张量
* b(XTensor) - 输出张量
* a(XTensor&) - 输入张量(对ScaleAndShiftMe函数而言,a同时为输出张量)
* b(XTensor&) - 输出张量
* scale(DTYPE) - 缩放参数
* shift(DTYPE) - 偏移参数,默认值为0
......@@ -1224,10 +1187,10 @@ XTensor CopyIndexed(const XTensor & s, int dim, const XTensor & srcIndex, const
```
Parameters:
* s(XTensor) - 输入张量
* s(XTensor&) - 输入张量
* dim(int) - 在哪一维对张量进行CopyIndexed操作
* srcIndex(int) - 源索引,即在指定dim上进行赋值的值的索引
* tgtIndex(XTensor) - 目标索引,所赋值的值在输出张量中的索引
* srcIndex(XTensor&) - 源索引,即在指定dim上进行赋值的值的索引
* tgtIndex(XTensor&) - 目标索引,所赋值的值在输出张量中的索引
* copyNum(int) - 以源索引为起始位置拷贝的元素个数,默认为1
##### 张量CopyIndexed片段示例
......@@ -1263,9 +1226,9 @@ XTensor CopyValues(const XTensor &s, XStream * stream = NULL)
```
Parameters:
* s(XTensor) - 输入张量
* t(XTensor,optional) - 输出张量
* stream(XStream) - 多线程流,默认为NULL
* s(XTensor&) - 输入张量
* t(XTensor&,optional) - 输出张量
* stream(XStream*) - 多线程流,默认为NULL
##### 张量拷贝片段示例
......@@ -1303,8 +1266,8 @@ XTensor Gather(XTensor &s, XTensor &index)
```
Parameters:
* s(XTensor) - 输入张量
* index(XTensor) - 聚合操作的索引
* s(XTensor&) - 输入张量
* index(XTensor&) - 聚合操作的索引
##### 张量聚合片段示例
......@@ -1349,7 +1312,7 @@ XTensor ReduceMax(const XTensor &input, int dim)
```
Parameters:
* input(XTensor) - 输入张量
* input(XTensor&) - 输入张量
* dim(int) - 沿着指定维度进行取最大值操作
##### 张量归约取最大值片段示例
......@@ -1392,8 +1355,8 @@ ReduceMean用来获得张量中沿指定维度取得的数值均值,张量归
Parameters:
* input(XTensor) - 输入张量
* output(XTensor,optional) - 输出张量
* input(XTensor&) - 输入张量
* output(XTensor&,optional) - 输出张量
* dim(int) - 沿着指定维度进行取平均值操作
##### 张量归约取均值片段示例
......@@ -1443,11 +1406,11 @@ XTensor ReduceSum(const XTensor &input, int dim, DTYPE power = (DTYPE)1.0F, bool
Parameters:
* input(XTensor) - 输入张量
* output(XTensor,optional) - 输出张量
* input(XTensor&) - 输入张量
* output(XTensor&,optional) - 输出张量
* dim(int) - 沿着指定维度进行取最大值操作
* shift(XTensor,optional) - 输入的偏移
* power(XTensor) - 元素的幂,默认为1.0F
* shift(XTensor&,optional) - 输入的偏移
* power(DTYPE) - 元素的幂,默认为1.0F
* isExp(bool) - 是否取指,默认为false
##### 张量归约求和片段示例
......@@ -1485,7 +1448,7 @@ ReduceSumAll用来计算张量的总和,张量归约取方差操作的参数
Parameters:
* source(XTensor) - 输入张量
* source(XTensor&) - 输入张量
##### 张量归约求总和片段示例
......@@ -1521,10 +1484,10 @@ ReduceSumSquared用来计算张量的沿着某一维度元素的方差,张量
Parameters:
* input(XTensor) - 输入张量
* output(XTensor,optional) - 输出张量
* input(XTensor&) - 输入张量
* output(XTensor&,optional) - 输出张量
* dim(int) - 沿着指定维度进行取平均值操作
* shift(XTensor) - 输入的偏移
* shift(XTensor&) - 输入的偏移
##### 张量归约取平方和片段示例
......@@ -1560,10 +1523,10 @@ ReduceVariance用来计算张量的沿着某一维度元素的方差,张量归
Parameters:
* input(XTensor) - 输入张量
* output(XTensor,optional) - 输出张量
* input(XTensor&) - 输入张量
* output(XTensor&,optional) - 输出张量
* dim(int) - 沿着指定维度进行取标准差操作
* mean(XTensor) - 均值
* mean(XTensor&) - 均值
##### 张量归约取方差片段示例
......@@ -1605,8 +1568,8 @@ XTensor Concatenate(const TensorList &smalls, int dim)
```
Parameters:
* smalls(XList) - 进行级联张量的列表
* big(XTensor, optional) - 输出张量
* smalls(TensorList&) - 进行级联张量的列表
* big(XTensor&) - 输出张量
* dim(int) - 在指定维度进行级联
第二种方法操作对象不再是列表中的张量而是直接对一系列张量进行级联操作:
......@@ -1615,8 +1578,8 @@ XTensor Concatenate(const XTensor &smallA, const XTensor &smallB, int dim)
```
Parameters:
* smallA(XTensor) - 输入张量1
* smallB(XTensor) - 输入张量2
* smallA(XTensor&) - 输入张量1
* smallB(XTensor&) - 输入张量2
* dim(int) - 进行级联的维度
##### 张量级联片段示例
......@@ -1651,9 +1614,9 @@ bool IsSameShaped(const XTensor & a, const XTensor & b)
bool IsSameShaped(const XTensor & a, const XTensor & b, const XTensor & c)
```
Parameters:
* a(XTensor) - 输入张量
* b(XTensor) - 输入张量
* c(XTensor, optional) - 输入张量
* a(XTensor&) - 输入张量
* b(XTensor&) - 输入张量
* c(XTensor&) - 输入张量
##### 张量IsSameShaped片段示例
s1、s2为需要进行比较的张量,t为结果(bool):
......@@ -1702,11 +1665,11 @@ XTensor Merge(const XTensor &smallA, const XTensor &smallB, int whereToMerge)
```
Parameters:
* s(smallA)(XTensor) - 输入张量(1)
* smallB(XTensor, optional) - 输入张量2
* t(XTensor, optional) - 输出张量
* s(smallA)(XTensor&) - 输入张量(1)
* smallB(XTensor&) - 输入张量2
* t(XTensor&) - 输出张量
* whereToMerge(int) - 沿着指定维度进行Merge操作
* leadingDim(int, optional) - 把指定维度进行Merge操作,默认为-1
* leadingDim(int) - 把指定维度进行Merge操作,默认为-1
在第二种调用方法中是将所操作张量存入列表smalls中,操作结果为张量t,whereToMerge为指定进行Merge操作的维度,例如:2 * (N/2, M) -> (N, M),参数说明如下表所示:
```cpp
......@@ -1716,8 +1679,8 @@ XTensor Merge(const TensorList &smalls, int whereToMerge)
```
Parameters:
* smalls(XList) - 存放进行合并张量的列表
* t(XTensor, optional) - 输出张量
* smalls(TensorList&) - 存放进行合并张量的列表
* t(XTensor&) - 输出张量
* whereToMerge(int) - 沿着指定维度进行Merge操作
##### 张量合并片段示例
......@@ -1757,8 +1720,8 @@ XTensor Reshape(XTensor &s, int order, int * dimSize)
```
Parameters:
* s(XTensor) - 输入张量
* t(XTensor, optional) - 输出张量
* s(XTensor&) - 输入张量
* t(XTensor&) - 输出张量
* order(int) - 张量的阶数
* dimsize(int) - 维度大小
......@@ -1802,20 +1765,19 @@ XTensor Split(const XTensor &s, int whereToSplit, int splitNum)
```
Parameters:
* s(XTensor) - 输入张量
* t(XTensor, optional) - 输出张量
* s(XTensor&) - 输入张量
* t(XTensor&) - 输出张量
* whereToSplit(int) - 在指定维度进行split操作
* splitNum(int) - 分成多少份
在第二种调用方法中是将所操作张量big按某一维度whereToSplit进行Split操作,操作结果为包含若干更小维度张量的列表smalls,splitNum表示分成多少份,例如:(N, M) -> 2 * (N/2, M),参数说明如下所示:
```cpp
void Split(const XTensor &big, TensorList &smalls, int whereToSplit, int splitNum)
```
Parameters:
* big(XTensor) - 输入张量
* smalls(TensorList, optional) - 存放切分出张量的列表
* big(XTensor&) - 输入张量
* smalls(TensorList&) - 存放切分出张量的列表
* whereToSplit(int) - 在指定维度进行split操作
* splitNum(int) - 分成多少份
......@@ -1869,8 +1831,8 @@ XTensor Squeeze(XTensor & source, int leadingDim = -1)
```
Parameters:
* source(XTensor) - 输入张量
* target(XTensor, optional) - 输出张量
* source(XTensor&) - 输入张量(对SqueezeMe函数而言,source同时为输出张量)
* target(XTensor&) - 输出张量
* leadingDim(int) - 沿着指定维度进行操作,默认为-1
##### Squeeze片段示例
......@@ -1916,9 +1878,9 @@ XTensor Stack(const TensorList &list, int leadingDim)
```
Parameters:
* smalls(TensorList) - 输入张量
* list(TensorList) - 输入张量
* t(XTensor, optional) - 输出张量
* smalls(TensorList&) - 输入张量
* list(TensorList&) - 输入张量
* t(XTensor&) - 输出张量
* leadingDim(int) - 沿着指定维度进行操作
* dim(int) - 沿着指定维度进行操作
......@@ -1956,7 +1918,7 @@ XTensor Transpose(const XTensor &a, const int i, const int j);
Parameters:
* a(XTensor) - 输入张量
* a(XTensor&) - 输入张量
* i(int) - 进行操作的维度1
* j(int) - 进行操作的维度2
......@@ -1965,9 +1927,9 @@ Parameters:
Transpose示例代码如下,其中s为输入的待操作张量,t1、t2代表输出结果张量,以下两行分别表示在维度1和维度2上插入的维度大小为2:
```cpp
/* call Unsqueeze function */
t1 = Unsqueeze(*s, 1, 2);
t2 = Unsqueeze(*s, 2, 2);
/* call Transpose function */
t1 = Transpose(*s, 1, 2);
t2 = Transpose(*s, 2, 2);
```
有关张量Transpose的详细代码示例见:
......@@ -2012,8 +1974,8 @@ XTensor Unsqueeze(const XTensor &a, int dim, int dSize)
```
Parameters:
* a(XTensor) - 输入张量
* b(XTensor, optional) - 输出张量
* a(XTensor&) - 输入张量
* b(XTensor&) - 输出张量
* dim(int) - 在指定维度进行Unsqueeze操作
* dSize(int) - 插入维度的大小
......@@ -2058,9 +2020,9 @@ void SortMe(XTensor & a, XTensor & index, int dim)
Parameters:
* a(XTensor) - 输入张量
* b(XTensor, optional) - 输出张量
* index(int) - 输出张量中元素的索引
* a(XTensor&) - 输入张量(对SortMe函数而言,a同时为输出张量)
* b(XTensor&) - 输出张量
* index(XTensor&) - 输出张量中元素的索引
* dim(int) - 沿着指定维度进行Sort操作
##### Sort片段示例
......@@ -2102,9 +2064,9 @@ void TopK(XTensor &a, XTensor &b, XTensor &index, int dim, int k, bool isSorted
Parameters:
* a(XTensor) - 输入张量
* b(XTensor, optional) - 输出张量
* index(XTensor) - 输出结果索引
* a(XTensor&) - 输入张量
* b(XTensor&) - 输出张量
* index(XTensor&) - 输出结果索引
* dim(int) - 沿着指定维度进行TopK操作
* k(int) - TopK中k代表取最大的k个值
* isSorted(bool) - 是否排序,默认值为false
......@@ -2146,7 +2108,7 @@ XTensor DropoutWithoutBroadcast(const XTensor &x, DTYPE dropProb)
Parameters:
* x(XTensor) - 输入张量
* x(XTensor&) - 输入张量
* dropProb(DTYPE) - 随机将单元隐藏的概率
* leadingDim(int) - 沿着指定维度进行操作,默认为-1
......@@ -2184,8 +2146,8 @@ XTensor HardTanH(const XTensor &x)
Parameters:
* x(XTensor) - 输入张量
* y(XTensor, optional) - 输出张量
* x(XTensor&) - 输入张量
* y(XTensor&) - 输出张量
##### HardTanH片段示例
......@@ -2219,8 +2181,8 @@ XTensor Identity(const XTensor &x)
Parameters:
* x(XTensor) - 输入张量
* y(XTensor, optional) - 输出张量
* x(XTensor&) - 输入张量
* y(XTensor&) - 输出张量
##### Identity片段示例
......@@ -2254,8 +2216,8 @@ XTensor LogSoftmax(const XTensor &x, int leadDim);
Parameters:
* x(XTensor) - 输入张量
* y(XTensor, optional) - 输出张量
* x(XTensor&) - 输入张量
* y(XTensor&) - 输出张量
* leadDim(int) - 沿着指定维度进行操作
##### LogSoftmax片段示例
......@@ -2290,8 +2252,8 @@ XTensor Rectify(const XTensor &x)
Parameters:
* x(XTensor) - 输入张量
* y(XTensor, optional) - 输出张量
* x(XTensor&) - 输入张量
* y(XTensor&) - 输出张量
##### Rectify片段示例
......@@ -2321,8 +2283,8 @@ XTensor Sigmoid(const XTensor &x)
```
Parameters:
* x(XTensor) - 输入张量
* y(XTensor, optional) - 输出张量
* x(XTensor&) - 输入张量
* y(XTensor&) - 输出张量
##### Sigmoid片段示例
......@@ -2352,8 +2314,8 @@ XTensor Softmax(const XTensor &x, int leadDim)
```
Parameters:
* x(XTensor) - 输入张量
* y(XTensor, optional) - 输出张量
* x(XTensor&) - 输入张量
* y(XTensor&) - 输出张量
* leadDim(int) - 沿着指定维度进行操作
##### Softmax片段示例
......
......@@ -103,7 +103,6 @@ XTensor MulAndShift(const XTensor &x, const XTensor &w, const XTensor &b,
DelTensorBuf(tmp);
return c;
}
/*
......@@ -114,17 +113,17 @@ operation c = x * w + b MulAndShift
>> parallelRunner - parallel processing module
<< return - the result of matrix multiplication
*/
XTensor MulAndShift(const XTensor& x, MATRIX_TRANS_TYPE transposedA,
const XTensor& w, MATRIX_TRANS_TYPE transposedB,
XTensor MulAndShift(const XTensor& x, MATRIX_TRANS_TYPE transposedX,
const XTensor& w, MATRIX_TRANS_TYPE transposedW,
const XTensor& b, DTYPE alpha, XPRunner* parallelRunner)
{
CheckNTErrors(x.dataType == w.dataType, "Input tensors should have the same data type!");
CheckNTErrors(x.order >= 2 && w.order >= 2, "Input tensors must have a order >= 2!");
int xn = transposedA == X_TRANS ? x.dimSize[x.order - 1] : x.dimSize[x.order - 2];
int xm = transposedA == X_TRANS ? x.dimSize[x.order - 2] : x.dimSize[x.order - 1];
int wn = transposedB == X_TRANS ? w.dimSize[w.order - 1] : w.dimSize[w.order - 2];
int wm = transposedB == X_TRANS ? w.dimSize[w.order - 2] : w.dimSize[w.order - 1];
int xn = transposedX == X_TRANS ? x.dimSize[x.order - 1] : x.dimSize[x.order - 2];
int xm = transposedX == X_TRANS ? x.dimSize[x.order - 2] : x.dimSize[x.order - 1];
int wn = transposedW == X_TRANS ? w.dimSize[w.order - 1] : w.dimSize[w.order - 2];
int wm = transposedW == X_TRANS ? w.dimSize[w.order - 2] : w.dimSize[w.order - 1];
int order = x.order + w.order - 2;
int sub = 0;
......@@ -141,7 +140,7 @@ XTensor MulAndShift(const XTensor& x, MATRIX_TRANS_TYPE transposedA,
XTensor * tmp = NewTensorBufV2(order, dimSize, x.dataType, dr, x.devID, x.mem);
/* call _MatrixMul function */
_MatrixMul(&x, transposedA, &w, transposedB, tmp, alpha, 0, parallelRunner);
_MatrixMul(&x, transposedX, &w, transposedW, tmp, alpha, 0, parallelRunner);
XTensor c(tmp);
c.SetTMPFlag();
......@@ -169,8 +168,8 @@ XTensor MulAndShift(const XTensor& x, MATRIX_TRANS_TYPE transposedA,
if (w.enableGrad && b.enableGrad) {
XLink::MakeLink(&x, &w, &b, &c, MATH_MULANDSHIFT);
XLink::AddParamToHeadInt(&c, n);
XLink::AddParamToHeadTrans(&c, transposedA);
XLink::AddParamToHeadTrans(&c, transposedB);
XLink::AddParamToHeadTrans(&c, transposedX);
XLink::AddParamToHeadTrans(&c, transposedW);
}
/* destroy variables */
......
......@@ -31,8 +31,8 @@ namespace nts { // namespace nts(NiuTrans.Tensor)
XTensor MulAndShift(const XTensor &x, const XTensor &w, const XTensor &b,
DTYPE alpha = (DTYPE)1.0, XPRunner * parallelRunner = NULL);
XTensor MulAndShift(const XTensor &x, MATRIX_TRANS_TYPE transposedA,
const XTensor &w, MATRIX_TRANS_TYPE transposedB,
XTensor MulAndShift(const XTensor &x, MATRIX_TRANS_TYPE transposedX,
const XTensor &w, MATRIX_TRANS_TYPE transposedW,
const XTensor &b, DTYPE alpha = (DTYPE)1.0, XPRunner * parallelRunner = NULL);
} // namespace nts(NiuTrans.Tensor)
......
......@@ -27,7 +27,7 @@ namespace nts { // namespace nts(NiuTrans.Tensor)
/*
case 1: element-wise division of two tensors
c(i) = a(i)/b(i) + \alpha * c(i)
In this case, (2, 2) (2, 2) -> (2, 2), leadingDim=0, alpha=0.
In this case, (2, 2) / (2, 2) -> (2, 2), leadingDim=0, alpha=0.
*/
bool TestDiv1()
{
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论