NCHW与NHWC数据格式之外之nChw8c

田海立@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格式数据的存储形式如下图所示:

Intel MKL-DNN 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很好的描述,目前网络上绝大多数介绍的图都来自那里。本文也是直接借助其中的图并修正其中错误来描述的。

猜你喜欢

转载自blog.csdn.net/thl789/article/details/109278794