clean commit messages.

This commit is contained in:
Luo Mai
2022-03-01 15:22:19 +00:00
parent 9ba4715573
commit 86661feadd
115 changed files with 6994 additions and 67 deletions

View File

@@ -13,13 +13,13 @@
**数据排布格式**
机器学习系统中很多运算都会转换成为矩阵的乘法,例如卷积运算。我们知道矩阵乘法$A\times B = C$
,是以A的一行乘以B的一列求和后得到C的一个元素。以图:numref:`matmuldatalayout`为例,在图:numref:`matmuldatalayout`的上方矩阵数据的存储是按照行优先来进行存储虽然B在存储时是按照行存储但是读取数据时却按照列进行读取假如我们能把B的格式进行转换转换为列存储例如图:numref:`matmuldatalayout`下方所示,这样就可以通过访问连续内存的方式加快数据访问速度进而提升运算速度。由此可见不同的数据排布方式对性能有很大影响。
,是以A的一行乘以B的一列求和后得到C的一个元素。以图 :numref:`matmuldatalayout`为例,在图 :numref:`matmuldatalayout`的上方矩阵数据的存储是按照行优先来进行存储虽然B在存储时是按照行存储但是读取数据时却按照列进行读取假如我们能把B的格式进行转换转换为列存储例如图 :numref:`matmuldatalayout`下方所示,这样就可以通过访问连续内存的方式加快数据访问速度进而提升运算速度。由此可见不同的数据排布方式对性能有很大影响。
![矩阵乘法数据排布示意图](../img/ch05/matmuldatalayout.png)
:width:`800px`
:label:`matmuldatalayout`
在机器学习系统中我们常见的数据格式一般有两种分别为NCHW类型和NHWC类型。其中N代表了数据输入的BatchSize大小C代表了图像的通道H和W分别代表图像输入的长和宽。图:numref:`data_format`展示了BatchSize为2通道数16和长度为5\*4大小的数据逻辑示意图。
在机器学习系统中我们常见的数据格式一般有两种分别为NCHW类型和NHWC类型。其中N代表了数据输入的BatchSize大小C代表了图像的通道H和W分别代表图像输入的长和宽。图 :numref:`data_format`展示了BatchSize为2通道数16和长度为5\*4大小的数据逻辑示意图。
![常见数据格式](../img/ch05/data_format.png)
:width:`800px`
@@ -29,7 +29,7 @@
对于NCHW的数据是先取W轴方向数据再取H轴方向数据再取C轴方向最后取N轴方向。其中物理存储与逻辑存储的之间的映射关系为
$$offsetnchw(n,c,h,w) = n*CHW + c*HW + h*W +w$$
如图:numref:`nchw`所示这种格式中是按照最低维度W轴方向进行展开W轴相邻的元素在内存排布中同样是相邻的。如果需要取下一个图片上的相同位置的元素,就必须跳过整个图像的尺寸($C*H*W$。比如我有8张32\*32的RGB图像此时$N=8C=3,H=32,W=32$。在内存中存储们需要先按照w轴方向进行展开然后按照h轴排列这样之后便完成了一个通道的处理之后按照同样的方式处理下一个通道。处理完全部通道后处理下一张图片。PyTorch和MindSpore框架默认使用NCHW格式。
如图 :numref:`nchw`所示这种格式中是按照最低维度W轴方向进行展开W轴相邻的元素在内存排布中同样是相邻的。如果需要取下一个图片上的相同位置的元素,就必须跳过整个图像的尺寸($C*H*W$。比如我有8张32\*32的RGB图像此时$N=8C=3,H=32,W=32$。在内存中存储们需要先按照w轴方向进行展开然后按照h轴排列这样之后便完成了一个通道的处理之后按照同样的方式处理下一个通道。处理完全部通道后处理下一张图片。PyTorch和MindSpore框架默认使用NCHW格式。
![RGB图片下的NHWC数据格式](../img/ch05/nchw.png)
:width:`800px`
@@ -37,7 +37,7 @@ $$offsetnchw(n,c,h,w) = n*CHW + c*HW + h*W +w$$
类似的NHWC数据格式是先取C方向数据再取W方向然后是H方向最后取N方向。NHWC是Tensorflow默认的数据格式。这种格式在PyTorch中称为Chanel-Last。
$$offsetnchw(n,c,h,w) = n*HWC + h*HW + w*C +c$$
图:numref:`nchwandnhwc`展示了不同数据格式下逻辑排布到内存物理侧数据排布的映射。\[x:1\]代表从最内侧维度到最下一维度的索引变换。比如\[a:1\]表示当前行W轴结束后下一个H轴排布。\[b:1\]表示最内侧C轴排布完成后进行按照W轴进行排列。
:numref:`nchwandnhwc`展示了不同数据格式下逻辑排布到内存物理侧数据排布的映射。\[x:1\]代表从最内侧维度到最下一维度的索引变换。比如\[a:1\]表示当前行W轴结束后下一个H轴排布。\[b:1\]表示最内侧C轴排布完成后进行按照W轴进行排列。
![NHWC与NHWC数据存储格式](../img/ch05/nchwandnhwc.png)
:width:`800px`
@@ -56,7 +56,7 @@ Precision浮点表示。这种数据类型占用32位内存。还有一种精
:width:`800px`
:label:`floatdtype`
如图:numref:`floatdtype`其中sign代表符号位占1位表示了机器数的正负exponent表示指数位Mantissa为尾数位。其数据计算采用二进制的科学计数法转换为十进制的计算方式如下
如图 :numref:`floatdtype`其中sign代表符号位占1位表示了机器数的正负exponent表示指数位Mantissa为尾数位。其数据计算采用二进制的科学计数法转换为十进制的计算方式如下
$$(-1)^{sign}\times 2^{exponent-15}\times (\frac{mantissa}{1024}+1)$$
其中如果指数位全为0时且尾数位全为0时表示数字0。
如果指数位全为0尾数位不全为0则表示一个非常小的数值。