CANN学习资源开源仓的形状和排布

举报
黄生 发表于 2026/03/25 11:34:00 2026/03/25
【摘要】 下面开始系统的学习一下tutorials.先看下基本概念。Tensor的形状,以(D0, D1, … ,Dn-1)的形式表示,D0到Dn是任意的正整数。如形状(3,4)表示第一维有3个元素,第二维有4个元素,是一个3行4列的矩阵数组。 张量 形状 1 (0,) [1,2,3] (3,) [[1,2],[3,4]] (2,2) [[[1,2],[3,4]], [[5,6],[...

下面开始系统的学习一下tutorials.先看下基本概念。

Tensor的形状,以(D0, D1, … ,Dn-1)的形式表示,D0到Dn是任意的正整数。如形状(3,4)表示第一维有3个元素,第二维有4个元素,是一个3行4列的矩阵数组。

张量 形状
1 (0,)
[1,2,3] (3,)
[[1,2],[3,4]] (2,2)
[[[1,2],[3,4]], [[5,6],[7,8]]] (2,2,2)

shape=(4, 20, 20, 3)的物理含义:假设有4张照片,即shape里4的含义,每张照片的宽和高都是20,也就是20*20=400个像素,每个像素点都由红/绿/蓝3色组成,即shape里面3的含义。体现在编程上,可以简单把shape理解为操作Tensor的各层循环。

import numpy as np

# 创建shape=(4,20,20,3)的Tensor:4张20*20的RGB图片,像素值[0,255]
img_np = np.random.randint(0, 256, size=(4,20,20,3), dtype=np.uint8)

# 多层循环遍历(对应shape的4个维度)
print("【遍历第1张图的前2行2列像素】")
for i in range(1):  # 只遍历第1张图(i=0)
    for j in range(2):  # 前2行(高)
        for p in range(2):  # 前2列(宽)
            for q in range(3):  # RGB3通道
                print(f"第{i+1}张图-({j},{p})像素-{['R','G','B'][q]}通道:{img_np[i,j,p,q]}")

输出:

【遍历第1张图的前2行2列像素】
第1张图-(0,0)像素-R通道:38
第1张图-(0,0)像素-G通道:238
第1张图-(0,0)像素-B通道:28
第1张图-(0,1)像素-R通道:122
第1张图-(0,1)像素-G通道:218
第1张图-(0,1)像素-B通道:242
第1张图-(1,0)像素-R通道:1
第1张图-(1,0)像素-G通道:249
第1张图-(1,0)像素-B通道:185
第1张图-(1,1)像素-R通道:56
第1张图-(1,1)像素-G通道:45
第1张图-(1,1)像素-B通道:200

Tensor的数据排布格式(format) 。卷积神经网络的特征图(Feature Map)通常用四维数组保存,即4D格式:

  • N:Batch数量,例如图像的数目。
  • H:Height,特征图高度,即垂直高度方向的像素个数。
  • W:Width,特征图宽度,即水平宽度方向的像素个数。
  • C:Channels,特征图通道,例如彩色RGB图像的Channels为3。

由于数据只能线性存储,因此这四个维度有对应的顺序

  • 比如Caffe,排列顺序为[Batch, Channels, Height, Width],即NCHW。
  • TensorFlow中,排列顺序为[Batch, Height, Width, Channels],即NHWC。

分别按照NHWC与NCHW的顺序分别对下图进行遍历,注意遍历是按照从低维到高维进行的。(先遍历 最低维度的索引,然后逐步向高维度变化。
其实是 “最内层循环是最低维”,也就是按存储顺序的 “先变最低维索引,再变高维索引” 来读取元素。)

import numpy as np

# 1. 创建模拟图片:N=1, H=3, W=3, C=3(对应教程中的RGB图片举例)
# 初始为NHWC格式(TensorFlow默认):shape=(1,3,3,3)
img_nhwc = np.array([
    [
        [[255,0,0], [255,255,0], [0,255,0]],
        [[0,255,255], [0,0,255], [255,0,255]],
        [[128,128,128], [0,0,0], [255,255,255]]
    ]
], dtype=np.uint8)
print("【NHWC格式】shape =", img_nhwc.shape)
print("NHWC遍历(低维到高维:N→H→W→C):\n", img_nhwc.flatten()[:12])  # 展平看前12个元素

# 2. NHWC转换为NCHW格式(Caffe/PyTorch默认):用transpose重排维度
# transpose(0,3,1,2):将维度顺序从(N,H,W,C)改为(N,C,H,W)
img_nchw = img_nhwc.transpose(0, 3, 1, 2)
print("\n【NCHW格式】shape =", img_nchw.shape)
print("NCHW遍历(低维到高维:N→C→H→W):\n", img_nchw.flatten()[:12])  # 展平看前12个元素

# 3. 格式还原:NCHW→NHWC
img_nhwc_back = img_nchw.transpose(0, 2, 3, 1)
print("\n【NCHW转回NHWC】是否与原数据一致:", np.array_equal(img_nhwc, img_nhwc_back))

输出:

【NHWC格式】shape = (1, 3, 3, 3)
NHWC遍历(低维到高维:N→H→W→C):
 [255   0   0 255 255   0   0 255   0   0 255 255]

【NCHW格式】shape = (1, 3, 3, 3)
NCHW遍历(低维到高维:N→C→H→W):
 [255 255   0   0   0 255 128   0 255   0 255 255]

【NCHW转回NHWC】是否与原数据一致: True
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。