CANN学习资源开源仓的形状和排布
【摘要】 下面开始系统的学习一下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)