NCHW和NHWC

https://blog.csdn.net/zlgahu/article/details/109219322

 

转自:https://www.jianshu.com/p/61de601bc90f

在深度学习中,图像数据通道格式有两种:

NCHW,又称:“channels_first”,是nvidia cudnn库原生支持的数据模式;在GPU中,使用NCHW格式计算卷积,比NHWC要快2.5倍左右(0:54 vs 2:14)

GPU中NCHW比NHWC卷积计算速度快

  • NHWC, 又称“channels_last”,是CPU指令比较适合的方式,SSE 或 AVX优化,沿着最后一维,即C维计算,会更快。
  • NCHW排列,C在外层,所以每个通道内,像素紧挨在一起,即“RRRGGGBBB”;NHWC排列,C在最内层,所以每个通道内,像素间隔挨在一起,即“RGBRGBRGB”,如下所示:

  • 尽管存储的数据实际上是一样的,但是不同的顺序会导致数据的访问特性不一致,因此即使进行同样的运算,相应的计算性能也会不一样。对于"NCHW" 而言,其同一个通道的像素值连续排布,更适合那些需要对每个通道单独做运算的操作,比如"MaxPooling"。对于"NHWC"而言,其不同通道中的同一位置元素顺序存储,因此更适合那些需要对不同通道的同一像素做某种运算的操作,比如“Conv1x1”
  • NCHW和NHWC计算区别

  • 由于NCHW,需要把所有通道的数据都读取到,才能运算,所以在计算时需要的存储更多。这个特性适合GPU运算,正好利用了GPU内存带宽较大并且并行性强的特点,其访存与计算的控制逻辑相对简单;而NHWC,每读取三个像素,都能获得一个彩色像素的值,即可对该彩色像素进行计算,这更适合多核CPU运算,CPU的内存带宽相对较小,每个像素计算的时延较低,临时空间也很小;若采取异步方式边读边算来减小访存时间,计算控制会比较复杂,这也比较适合CPU。
    结论:在训练模型时,使用GPU,适合NCHW格式;在CPU中做推理时,适合NHWC格式。采用什么格式排列,由计算硬件的特点决定。OpenCV在设计时是在CPU上运算的,所以默认HWC格式
import cv2
img = cv2.imread('test.jpg')
print(img.shape)

(500, 500, 3)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值