NCHW与NHWC格式

NCHW与NHWC格式

下图很好的描述了各种不同的格式。

N代表数量, C代表channel,H代表高度,W代表宽度。

NCHW其实代表的是[W H C N],第一个元素是000,第二个元素是沿着w方向的,即001,这样下去002 003,再接着呢就是沿着H方向,即004 005 006 007...这样到019后,沿C方向,轮到了020,之后021 022 ...一直到319,然后再沿N方向。

NHWC的话以此类推,代表的是[C W H N],第一个元素是000,第二个沿C方向,即020,040, 060..一直到300,之后沿W方向,001 021 041 061...301..到了303后,沿H方向,即004 024 .。。304.。最后到了319,变成N方向,320,340....

图中所示a就是指四个维度。

 

 

 在不同的硬件加速的情况下,选用的类型不同,在intel GPU加速的情况下,因为GPU对于图像的处理比较多,希望在访问同一个channel的像素是连续的,一般存储选用NCHW,这样在做CNN的时候,在访问内存的时候就是连续的了,比较方便。

TensorFlow有两种数据格式NHWC和NCHW

TensorFlow有两种数据格式NHWC和NCHW,默认的数据格式是NHWC,可以通过参数data_format指定数据格式。这个参数规定了 input Tensor 和 output Tensor 的排列方式。

1、data_format

设置为 “NHWC” 时,排列顺序为 [batch, height, width, channels]
设置为 “NCHW” 时,排列顺序为 [batch, channels, height, width]

data_format 默认值为 "NHWC。其中 N 表示这批图像有几张,H 表示图像在竖直方向有多少像素,W 表示水平方向像素数,C 表示通道数(例如黑白图像的通道数 C = 1,而 RGB 彩色图像的通道数 C = 3)。为了便于演示,后面作图均使用 RGB 三通道图像。

 

 

 NCHW 中,C 排列在外层,每个通道内像素紧挨在一起,即 'RRRRRRGGGGGGBBBBBB' 这种形式。

NHWC 格式,C 排列在最内层,多个通道对应空间位置的像素紧挨在一起,即 'RGBRGBRGBRGBRGBRGB' 这种形式。

如果需要对图像做彩色转灰度计算,NCHW 计算过程如下:

 

 

 即 R 通道所有像素值乘以 0.299,G 通道所有像素值乘以 0.587,B 通道所有像素值乘以 0.114,最后将三个通道结果相加得到灰度值。

相应地,NHWC 数据格式的彩色转灰度计算过程如下:

 

 

 最佳实践:设计网络时充分考虑两种格式,最好能灵活切换,在 GPU 上训练时使用 NCHW 格式,在 CPU 上做预测时使用 NHWC 格式。

在不同的硬件加速的情况下,选用的类型不同,在intel GPU加速的情况下,因为GPU对于图像的处理比较多,希望在访问同一个channel的像素是连续的,一般存储选用NCHW,这样在做CNN的时候,在访问内存的时候就是连续的了,比较方便。

# NCHW [batch,in_channels,in_height,in_weight]

# NHWC [batch,in_height,in_weight,in_channels]

# CHWN [in_channels,in_height,in_weight,batch]

# 转换 NCHW---NHWC

import tensorflow as tf

x = tf.reshape(tf.range(24),[1,2,3,4])

out = tf.transpose(x,[0,2,3,1])

print (x.shape)

print (out.shape)

#转换NHWC--NCHW

import tensorflow as tf

x = tf.reshape(tf.range(24), [1, 3, 4, 2])

out = tf.transpose(x, [0, 3, 1, 2])

print  (x.shape)

print  (out.shape)

 

  

参考链接:

https://www.cnblogs.com/sunny-li/p/9630305.html

https://blog.csdn.net/weixin_37801695/article/details/86614566

https://mp.weixin.qq.com/s/I4Q1Bv7yecqYXUra49o7tw

https://blog.csdn.net/weixin_41847115/article/details/83794551

 

posted @   吴建明wujianming  阅读(1076)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2021-02-09 pytorch生成对抗示例
2021-02-09 PyTorch 进行 Neural-Transfer
2021-02-09 pytorch空间变换网络
2021-02-09 Jittor 的Op, Var算子
2021-02-09 元算子卷积层实现
2021-02-09 Caffe实现概述
2021-02-09 Halide视觉神经网络优化
点击右上角即可分享
微信分享提示