田海立@CSDN 2020-10-25
《图解NCHW与NHWC数据格式》从逻辑表达和物理存储角度用图的方式来理解常用的NCHW和NHWC这两种数据格式,其实这两种之外还有别的数据格式。本文就介绍Intel MKL-DNN里所采用的nChw8c数据格式,你不一定要记住这种格式,而要学习分析的方法,这样就能应对你所要处理的特定的数据格式了。
一、基本概念
Intel MKL-DNN里所采用的nChw8c数据格式,用大小写区分了各维信息。其中:
- n - Batch
- C - Channel这里的Channel不是完全的Channel,而是Channel/8
- h - Height
- w - Width
- 8c - Channel方向上的8个。所以这里也可以是16c。
二、逻辑表达
逻辑上都是相通的,所以这里同《图解NCHW与NHWC数据格式》的逻辑表达。
假定N = 2,C = 16,H = 5,W = 4,那么这个4D数据,看起来是这样的:
人类比较直接的理解方式是3D,上图中从三个方向上理解,W方向、H方向、C方向,然后是N方向上,就是4D。
上图中红色标准的数值是这个数据里每个元素的数值。
三、物理存储
无论逻辑表达上是几维的数据,在计算机中存储时都是按照1D来存储的。nChw8c格式数据的存储形式如下图所示:
nChw8c是先Channel方向取8个数据,然后W方向取数据;然后H方向;再8个数据之后的C方向;最后N方向。
所以,序列化出来的1D数据:
- 000
- ([x:0]: 转8c方向) 020 040 ... 140 (此处已经取了8个,所以
Intel原文档处有误,左图也假定取的前面一个Channel 面140~159,下同) - ([x:1]: 转w方向) 001 021 ... 143
- ([x:2]: 转h方向) 004 024 ... 159
- ([x:3]: 转C方向) 160 180 ... 319([x:3]: 159转160是Channel方向还没有取完,接着8c之后继续取)
- ([x:4]: 转n方向) 320 340 ...
四、处理的意义
这里这样处理,可以优化处理,比如8个数据Channel的数据可以同时处理。
另外,这里的Tensor的Shape是[N = 2,C = 16,H = 5,W = 4],Channel数刚好是16,可以被8整除,如果不能整除,还需要padding Channel到8个整数倍。
在很多实际应用硬件处理数据时,会采用类似的方案。
【后注】:Intel Math Kernel Library for Deep Neural Networks (Intel MKL-DNN)中有关于NCHW和NHWC很好的描述,目前网络上绝大多数介绍的图都来自那里。本文也是直接借助其中的图并修正其中错误来描述的。