文章目录

  • 深度学习中的Tensor 数据格式(N,C,H,W)
    • 1、深度学习框架中的图像格式
      • 1.1、4DTensor格式
      • 1.2、5DTensor格式
      • 1.3、ND格式
    • 2、数据格式
    • 3、物理存储
      • 3.1、NCHW
      • 3.2、NHWC
      • 3.3、CHWN:
      • 3.4、Strides
      • 3.5、Blocked layout
      • 3.6、zero_padding
    • 4、RGB图像数据举例
    • 5、不同框架的支持

深度学习中的Tensor 数据格式(N,C,H,W)

参考:

  • Intel Math Kernel Library for Deep Neural Networks (Intel MKL-DNN)
  • 数据格式- 图解NCHW与NHWC数据格式
  • NCHW-NHWC-NC/32HW32

1、深度学习框架中的图像格式

1.1、4DTensor格式

4DTensor格式:使用4D张量描述符来定义具有4个字母的2D图像批处理的格式

  • 数据布局由二维图像的四个字母表示:

    • N:Batch,批处理大小,表示一个batch中的图像数量
    • C:Channel,通道数,表示一张图像中的通道数
    • H:Height,高度,表示图像垂直维度的像素数
    • W:Width,宽度,表示图像水平维度的像素数
  • 常用的4-D tensor 格式为:
    • NCHW
    • NHWC
    • CHWN
    • NC/32HW32

1.2、5DTensor格式

5D Tensor 格式:使用5个字母描述的3D图像批处理格式

  • 数据布局由三位图像的5个字母表示:

    • N:批处理大小
    • C:channel,通道数
    • D:深度,表示图像Z维度的特征图数目
    • H:高度
    • W:深度

1.3、ND格式

Numpy Ndarray: Numpy 最重要的一个特点是其N维数组对象ndarry,它是一系列同类型数据的集合,以0下标为开始进行集合中元素的索引。
tensor 和 ndarray 具有很高的相似性,并且二者相互转化需要的开销很小。但是由于 ndarray 出现时间较早,相比于 tensor 有更多更简便的方法,因此在某些时候 tensor 无法实现某些功能,可以将tensor 抓换为 ndarray 格式进行处理后,再转化为 tensor 格式。

pytorch tensor 数据和 numpy ndarray 数据格式相互转换

import numpy as np# numpy to tensor
a = np.ones([2,3])         # [[1.,1.,1.],[1.,1.,1.]]
b = torch.from_numpy(a)     # tensor([[1.,1.,1.],[1.,1.,1.]],dtype=torch.float64)# tensor to numpy
a[0,1]=100         # [[1.,100.,1.],[1.,1.,1.]]
# 注意:转换后的 tensor 与 numpy 指向同一个地址,所以,对一方的改变,另一方也会随之改变
print(b)            # tensor([[1.,100.,1.],[1.,1.,1.]],dtype=torch.float64)
c = b.numpy()      # [[1.,100.,1.],[1.,1.,1.]]

2、数据格式

考虑4-D tensor数据格式,其中N=2,C=16,H=5,W=4,对应数据格式表示为

图中红色标注的数值就是数据里每个元素的数值:value(n,c,h,w) = n x CHW + c x HW + h x W + w
计算机中的数据是按照 1D 格式来存储的,要将 4D-tensor 映射到 1D memory中,要将 n,c,h,w 作为输入得到对应 value 值得位置(offset)

3、物理存储

不同的存储形式映射如下图所示:

3.1、NCHW

数据跳转:

  • 先取W方向得一行数据,从左向右
  • 然后H方向,从上向下
  • 之后C方向(in depth)
  • 最后N方向,从batch 中的一张图片(n=0) 跳转到下一张(n=1)
    最终序列化出的1D数据为:000(W方向)001 002 003,(H方向)004 005 … 019, (C方向)020 … 318 319 , (N方向)320 321 …
    offset_functoin: offset_nchw(n,c,h,w) = n x CHW + c x HW + h x W + w
    【注意】这里为了方便说明,offset 和 value 值相等。

3.2、NHWC

数据跳转:先取C方向数据;然后W方向,然后H方向,最后N方向
最终序列化出的1D数据为:000(C方向)020 … 300, (W 方向)001 021 … 303, (H方向)004 … 319, (N方向)320 340 …
offset_function: offset_nhwc(n,c,h,w) = n x HWC + h x WC + w x C + c

3.3、CHWN:

数据跳转:先取N方向数据,然后W方向,然后H方向,然后C 方向
最终序列化出的1D数据为:000(N方向) 320,(W方向)001 321…(H方向)004 324 …019 339, (C 方向)020 340 …
offset_function: offset_chwn(n,c,h,w) = c x HWN + h x WN + w x N + n

3.4、Strides

上面的例子中数据是 packed 的,即表示像素之间是 dense 的。有时数据在memory 中不是连续存储的,例如有时需要选取较大的tensor 中的一个 sub-tensor 工作。有时需要人为的让数据不连续存储。
下图显示了以行为主格式保存的,大小为行 x 列的 2D 矩阵的简化情况,其中行具有一些 non-trivial (非平凡, 即不等于列数)步幅。

offset_function:offset(n,c,h,w) = n x stride_n + c x stride_c + h x stride_h + w x stride_w
注意,NCHW,NHWC,CHWN 格式都是 strides格式的特殊情况,如 NCHW 格式:
stride_n = CHW , stride_c = HW , stride_h = W, stride_w=1

3.5、Blocked layout

简单的layout便于灵活的数据使用,因此大多数框架和应用使用NCHW 或 NHWC layout。但是数据的应用场景不同,这些布局对应性能方面可能不是最优的。
为了实现更好的矢量化和缓存重用,Intel MKL-DNN 引入了 blocked layout,将一个或多个维度拆分成固定大小的块,如nChw8c、nChw16c 格式等。
如 nChw8c 格式,只有 channel 维度被分块,block size 为 8
offset_funciont :

offset_nChw8c(n,c,h,w) = n x CHW + (c / 8) x HW x 8 + h x W x 8 + w x 8 + c % 8

注意:8个channels 的block 在 memory 中是连续存储的。逐个像素地覆盖空间域。然后下一个 slice 覆盖随后的 8个channels(即从 c=0…7 移动到 c=8…15)。一旦覆盖了所有 channel blocks,就会出现 batch 中的下一个图像。


【注意】格式中使用小写和大写字母来却分块(如8c) 和 剩余的维度(C=channels/8)

3.6、zero_padding

**如果channels 不是8(或16)的整数倍 ,如channels=17—— zero padding **
方法:将 channels 数目向上取整为 block size 的整数倍,将padding tiles 的数值置为0( 24 = div_up(17,8) * 8 )。之后卷积之类的操作对向上取整的channels 进行操作( zero padding 不改变结果)。
支持任意数量的channels,并且几乎不改变 kernels。对zero padding 的额外计算开销忽略不计。
zero padding 的图示如下图所示:

4、RGB图像数据举例

表达 RGB 彩色图像时,一个像素的RGB值用3个数值表示,对应channel为3。假定N=1,则NCHW、NHWC数据格式可以存储为:

NCHW格式:

  • 先在一个channel面上把W方向、H方向上元素存储起来 —— R
  • 然后在另一个 channel 面上把W方向、H方向上元素存储起来 —— G
  • 最后一个 channel 面上把W方向、H方向上元素存储起来 —— B

NHWC 格式:

  • 先把3个channel 上第一个位置的元素存储起来 —— 一个像素的RGB
  • 然后在 W方向上、H方向上依次将所有位置的元素存储起来 —— RGBRGBRGB…,即顺序地将每个像素的RGB数值存储起来

5、不同框架的支持

目前的主流ML 框架对 NCHW 和 NHWC 数据格式做了支持,有些框架可以支持两种且用户未作设置时有一个缺省值:

  • TensorFlow:默认NHWC,GPU也支持 NCHW
  • Caffe:NCHW
  • PyTorch:NCHW

深度学习中的Tensor 数据格式(N,C,H,W)相关推荐

  1. 如何理解深度学习中的tensor(涉及numpy的二维,三维以及四维数据的理解)

    0. 写作目的 好记性不如烂笔头. 结论:无论几维,都可以按照(Batch_size, Height, Width, Channle)来理解. 1. 二维数据的理解 理解为:只有(Height, Wi ...

  2. 一文带你读懂深度学习中的张量(tensor)是什么,它的运算是怎样的,如何理解张量,张量的维度,浅显易懂

    深度学习的数学基础(不要被吓到,很浅显) 数据表示与张量运算 张量 在多维 Numpy 数组中,也叫张量(tensor).一般来说,当前所有机器学习系统都使用张量作为基本数据结构. 张量这一概念的核心 ...

  3. 1 图片channels_深度学习中各种图像库的图片读取方式

    深度学习中各种图像库的图片读取方式总结 在数据预处理过程中,经常需要写python代码搭建深度学习模型,不同的深度学习框架会有不同的读取数据方式(eg:Caffe的python接口默认BGR格式,Te ...

  4. 深度学习中GPU和显存分析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 转自:机器学习AI算法工程 深度学习最吃机器,耗资源,在本文,我将 ...

  5. AI部署:聊一聊深度学习中的模型权重

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨Oldpan 来源丨Oldpan博客 编辑丨极市平台 导读 本文简要介绍了模型权重的统计方法,以 ...

  6. 科普帖:深度学习中GPU和显存分析

    深度学习最吃机器,耗资源,在本文,我将来科普一下在深度学习中: 何为"资源" 不同操作都耗费什么资源 如何充分的利用有限的资源 如何合理选择显卡 并纠正几个误区: 显存和GPU等价 ...

  7. 深度学习中,Batch_Normalization加速收敛并提高正确率的内部机制

    文章转自https://blog.csdn.net/whitesilence/article/details/75667002, 初非常感谢作者的原创,转载一下方便自己以后的学习 在看 ladder ...

  8. 深度学习中常见的损失函数

    文章来源于AI的那些事儿,作者黄鸿波 2018年我出版了<TensorFlow进阶指南 基础.算法与应用>这本书,今天我把这本书中关于常见的损失函数这一节的内容公开出来,希望能对大家有所帮 ...

  9. 代码+实例:深度学习中的“轴”全解

    ©PaperWeekly 原创 · 作者|海晨威 学校|同济大学硕士生 研究方向|自然语言处理 在深度学习中,轴,指的就是张量的层级,一般通过参数 axis/dim 来设定.很多张量的运算.神经网络的 ...

最新文章

  1. 合肥师范学院计算机毕设选老师,计算机毕设被导师要求反复修改?
  2. 设计模式 — 行为型模式 — 模板方法模式
  3. 由浅入深:自己动手开发模板引擎——解释型模板引擎
  4. Linux下计划任务:crontab 命令的权限说明
  5. X3C to X9T
  6. 2个字节能存多少个16进制_MySql中的varchar长度究竟是字节还是字符
  7. [ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式
  8. php 下拉菜单多选get,Jquery实现select二级联动多选下拉菜单
  9. Keil | 解决Keil与Source Insight4.0配合使用时,代码与注释位置(乱码)不一样的问题
  10. 计算机英语小短文单词易懂,求计算机英语短文译文。。。。急急急!悬赏10
  11. rabbitmq之window环境启动
  12. 如何结合短信和邮件有效的监控网站
  13. 计算机桌面程序经常打不开了,电脑开机后桌面软件打不开怎么办
  14. 通过反汇编一个简单的C程序理解计算机是如何工作的
  15. Acme CAD Converter 8.9.8.1480 汉化破解版本
  16. 每日英语Daily English
  17. CR渲染器全景图如何渲染颜色通道_【3D】日不落投影灯 VR/CR投影效果制作
  18. Region Proposal by Guided Anchoring
  19. 车载网络测试 - UDS诊断篇 - 诊断数据简析
  20. 怎么装python的keras库_Keras教程:用Python进行深度学习的终极入门指南

热门文章

  1. 测量开关电源纹波的方法
  2. Ubuntu+ visual studio + visualGdb
  3. VSCode安装和Python安装及其配置
  4. 前端React教程第二课 React生命周期设计思想
  5. 达成学习目标的四个步骤
  6. 用返利网商家会知道吗
  7. AUTOWARE下底盘CAN通讯实现
  8. java的dowhile循环语句_java do while 循环语句用法
  9. 深度剖析陈晓和贝恩之阴谋
  10. CK-GW208-EC与汇川PLC配置走EtherCAT通讯指南