想象一下,一个繁忙的国际港口。来自世界各地的货物——装在纸箱里的玩具、捆扎好的棉纱、冷藏柜中的海鲜——它们形状各异,吊装运输极其低效。直到有一天,人们发明了标准集装箱:不论里面装了什么,外观都是统一的方形铁盒,可以层层堆叠、快速吊装、无缝换乘轮船、卡车和火车。整个物流世界从此被彻底改变。 深度学习的世界也在经历同样的变革。图像、语音、文字、标签、模型的参数、甚至“错误信号”(梯度),这些形态完全不同的数据,在深度学习框架里统统被装进一种统一的容器——张量(Tensor)。张量就是深度学习世界的标准集装箱:所有数据用它装载,所有运算在它上面进行,所有模型参数以它为单位组织。你只要学会看懂张量的“箱子规格”(形状)、“码放方式”(布局)和“运输路线”(计算图),就能从底层数据视角理解深度学习模型到底在做什么。 这篇文章将带你走进这个集装箱堆场:从张量的概念、形状约定,到NCHW与NHWC两种码放方案,再到权重梯度、卷积与注意力中的张量变换,最后聊聊混合精度训练里的“轻量化集装箱”策略。
张量是深度学习从业者的“底层通用语言”。理解张量表示,意味着你不仅会调 API,还能读懂框架报错、诊断性能瓶颈、优化模型部署,这是从调包侠走向工程师的关键一步。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
张量概念本质
在集装箱发明之前,港口工人要按货物的形状分别装卸:圆柱形的油桶滚着走,方形的木箱用叉车抬,袋装的粮食靠吊网兜。每种货物都有自己的一套搬运规则。深度学习和这种情况很像:图像是二维像素网格,文本是一维单词序列,模型参数又是一堆杂乱数字。如果每种数据都用专属结构存储,运算器就要为每种结构分别写一套逻辑。这时,工程师们找到了深度学习世界的“标准集装箱”——张量。
张量本质上就是一个多维数值数组。0 维张量是标量,比如一个温度读数 23.5;1 维张量是向量,比如一排商品价格;2 维张量是矩阵,比如一张 Excel 表格;3 维、4 维乃至更高维的张量,就是把这个概念继续推广。在 PyTorch 中一个 torch.tensor([[[1,2],[3,4]]]) 就是一个三维张量。深度学习里,任何数据都可以被“装进”张量——一张 224×224 的彩色图片,就是一个形状为 [3, 224, 224] 的三维张量。
我们将张量用数学符号统一地写出来:
回到港口比喻:集装箱不管里面是玩具还是海鲜,外观永远是一个标准铁箱。张量也一样——不管是图像、文本还是权重,在深度学习框架里都以统一的张量对象出现。这种统一让框架可以写出通用的运算内核、自动求导逻辑和分布式策略。可以说,理解了张量,你就拿到了进入深度学习底层世界的通行证。
- X 是张量名就像每个集装箱都有一个编号,我们通常用大写字母 X 来称呼整个张量。
- \mathbb{R} 表示实数域张量内部装的全是实数,图像像素的 0~255、模型权重的浮点数都落在实数范围里。
- d₁×d₂×…×dₙ 是每维尺寸用乘号连接的序列描述每一维的长度,比如 3 行 4 列的矩阵就是 3×4。
- n 是张量的维数维数 n 决定张量是“几层嵌套的盒子”,0 维是单个数字,1 维是一排数字,2 维是一张表。
张量形状约定
港口对集装箱有严格的尺寸标准:20 英尺柜、40 英尺柜、高柜。只有规格统一,船上的槽位、卡车的底盘、吊具的锁扣才能相互匹配。张量也有自己严格的“尺寸规格”,称为形状(shape)。形状描述的是张量每一维有多长,它决定了张量占多少内存、能被哪些运算接收。
一个形状为 [2, 3, 4, 5] 的四维张量,分别有 4 个轴:第 0 轴长 2、第 1 轴长 3、第 2 轴长 4、第 3 轴长 5。张量元素的总个数等于各轴长度的乘积,也就是 2×3×4×5 = 120 个元素。如果两个张量要做矩阵乘法或拼接操作,框架会先检查它们的形状是否“接得上”——就像两个积木的凸起和凹槽必须匹配。形状对不上,就会抛出 shape mismatch 报错。
在深度学习的视觉任务里,最常见的形状约定是四维张量:
集装箱的尺寸决定了能装多少货,张量的形状则决定了能算多少数据。初学深度学习时最常见的报错之一就是形状不匹配——比如想给一个形状 [4, 3] 的矩阵乘一个 [4, 3] 的矩阵,内维对不上,框架会立刻通知你。学会看形状报错,就像码头工人学会看箱体的规格标签,是基本功中的基本功。
- N 是批次大小(Batch)一次同时处理的样本数,比如一次喂给模型 32 张图片,N 就是 32。
- C 是通道数(Channel)彩色图片有红、绿、蓝三个通道,灰度图只有一个通道,C 就是通道的数量。
- H 是高度(Height)图像在竖直方向上的像素行数,224×224 的图片 H 就是 224。
- W 是宽度(Width)图像在水平方向上的像素列数,与 H 一起决定了单张图的分辨率。
NCHW与NHWC
同一批货物装进集装箱后,在箱内的码放方式也很有讲究。可以按颜色把红色货物放第一层、绿色放第二层、蓝色放第三层,也可以按大小每个颜色混着放。哪种方式更好取决于取货的顺序。图像张量的 [N, C, H, W] 四维结构在内存中也有两种主流“码放”顺序,分别是 NCHW 和 NHWC。
NCHW 格式把 C 放在 H、W 之前,意味着同一张图片的所有像素先按颜色通道分开存储,先把整个红色通道存完,再存绿色通道;NHWC 格式则把 C 放在最后,意味着每个像素位置的三个颜色分量紧挨在一起存储。在 PyTorch 中默认是 NCHW,在 TensorFlow 中默认是 NHWC,两者在数学上完全等价,但在内存布局上截然不同。
两种布局之间的转换,本质上就是把张量的轴重新排列:
哪种布局更好?取决于硬件。GPU 擅长合并访问连续内存。在卷积网络中,NCHW 让每个通道的二维平面内存连续,方便做矩阵乘法;而 CPU 推理时 NHWC 有时更能利用缓存局部性。实际工程中,很多推理引擎(如 TensorRT)在内部自动把权重重排为最合适的布局。理解这种“码放”差异,能帮你读懂框架日志、解释莫名其妙的性能差异,还会在写自定义算子时避免踩坑。
- X 的上标 NCHW/NHWC表示同一批数据在不同内存布局下的两个“视图”,箱子里货物相同,只是码放顺序不同。
- 方括号中的下标序列按顺序标出要访问的元素在四个轴上的编号,比如
[n, c, h, w]从批次、通道、高度、宽度四个方向定位。 - 等式右侧到左侧的映射NCHW 用
[n, c, h, w]访问的位置,在 NHWC 中需要用[n, h, w, c]访问。也就是说,通道轴从第 1 位挪到了最后 1 位。
权重与梯度张量
集装箱堆场里有一批“固定货柜”——它们是港口预先配置好的装卸设备,比如吊机的配重块、固定缆绳的锚点。深度学习模型里的可学习参数(权重)就像是这样的固定货柜:它们不随输入数据变化,而是在训练过程中被反复调整。这些参数同样以张量形式存在。一个全连接层的权重是二维张量 [输入特征数, 输出特征数],一个卷积核是四维张量 [输出通道, 输入通道, 高, 宽]。
在训练过程中,模型会不断计算“当前预测与正确答案差多远”,这个误差信号对每个参数的偏导数就是梯度。一个最关键的约定是:每个权重参数都有一个与之形状完全相同的梯度张量。如果没有这条约定,框架就无法实现精确的参数更新——好比你调整舵轮的角度,必须知道每个旋钮对应的刻度变化量。
权重更新遵循最朴素的梯度下降规则,用数学写出来就是:
把权重想象成固定货柜的位置,梯度就是“当前位置该往哪儿挪多少”的指示牌。指示牌和货柜必须一一对应,否则工人就不知道去调整哪个柜子。在实际框架中,optimizer.step() 做的事情就是遍历所有权重张量、找到同形状的梯度张量,然后执行 W -= lr * grad。理解“梯度与权重同形状”这条约定,能让你读懂训练日志里每一层的参数维度,也能在手动实现优化器时不至于晕头转向。
- W 是权重张量代表模型中某一层要学习的参数“集装箱”,里面装着成千上万个待调整的数字。
- \leftarrow 表示赋值更新右边的计算结果会覆盖左边的旧值,把新权重写入“货柜”。
- \eta 是学习率一个控制每次调整步长的小数,学习率太大容易震荡,太小则训练缓慢,它决定这一步“走多远”。
- \nabla W 是梯度损失函数对 W 中每个元素的偏导数组成的张量,它的形状与 W 完全一致,指向损失下降最快的方向。
卷积张量变换
在港口流水线上,有一种作业叫“拆箱重组”:把一个大集装箱里的货物按网格位置逐一取出,装进新的小箱中。卷积运算干的正是类似的事。卷积核(kernel)可以看作一个固定大小的“滑动放大镜”,它在输入特征图上从左到右、从上到下地滑动,每停在一个位置,就用放大镜覆盖的区域与核内的权重做加权求和,把结果写进输出特征图对应的位置。
一个卷积核本身也是一个四维张量:[输出通道数, 输入通道数, 核高, 核宽]。它滑动一次产生的局部操作可以写成矩阵乘法,这也是 GPU 上卷积加速的关键。为了把“滑动窗口”变成纯粹的矩阵运算,工程师想出了 im2col 技巧:把输入张量上每个窗口位置的数据取出来,展开成一列,所有窗口拼成一个巨大的二维矩阵。这样卷积就变成了一次大型矩阵乘法,极大地利用了 GPU 的并行能力。
经过卷积后,输出特征图的高度和宽度由输入尺寸、核尺寸、填充和步长共同决定:
在流水线比喻里,输入特征图是大货柜,im2col 是把每个窗口位置拍平成一列货的“拆箱机”,矩阵乘法则是把拆出的货统一装进新集装箱的高效机械臂。理解了卷积的张量变换流程,你就明白了为什么调整卷积核大小、步长和填充会显著影响特征图尺寸——这个公式是设计现代 CNN 网络结构时的“算舱容”基本功。
- O_H 是输出高度卷积完成后特征图在竖直方向上的行数。
- H 是输入高度原始特征图的行数,比如一个 32×32 的图像 H 就是 32。
- P 是填充(Padding)在特征图四周补上的零行/零列数,防止边缘信息丢失,相当于在箱体四边加一圈缓冲垫。
- K 是卷积核大小放大镜的边长。核越大,一次覆盖的范围越广。
- S 是步长(Stride)放大镜每次滑动的距离。步长越大,输出越小,相当于隔几格取一个样。
注意力张量流动
在现代化的智能分拣中心,传送带上的货物不再按固定路线运输,而是由系统动态决定“这件货应该重点关注哪个区域”。注意力机制(Attention)在深度学习中的作用也是如此:让模型在处理一个数据元素时,动态地决定应该关注输入序列中的哪些其他元素。
在 Transformer 的注意力层中,输入张量 X 被三组不同的加权矩阵投影,得到查询(Query, Q)、键(Key, K)和值(Value, V)三个张量。你可以这样理解:Q 是“我手中正在处理的货物清单”,K 是“仓库里每批货的标签”,V 是“这批货真正的内容”。模型通过比较 Q 与所有 K 的相似度,决定从哪些 V 中提取多少信息。整个过程用公式表示为:
真正的 Transformer 还会把注意力拆成多个“头”(Multi-Head),每个头独立做投影和注意力计算,最后把多个头的输出张量在特征维度上拼接起来。这个过程形成一个形状流动:输入 [序列长度, 特征维度] 变成 Q/K/V 三个同形状张量,经过注意力权重矩阵加权后,再拼回原来的特征维度。从张量视角看,注意力机制就是一连串精心设计的矩阵乘法与形状变换——就像智能分拣中心里,货物在不同传送带之间流动,最终汇入通往下一站的主管道。
- Q 与 K 的转置相乘计算每个查询与每个键之间的点积相似度,点积越大,说明越匹配。
- 除以 \sqrt{d_k} 缩放把相似度数值缩回合理范围,防止点积过大把 softmax 推向极端——相当于给温度计加一个矫正刻度。
- softmax 归一化把全部相似度变成和为 1 的权重,确保“关注度”是一个合法比例,就像把预算按比例分给所有供应商。
- 与 V 相乘用归一化后的权重对所有内容向量做加权求和,得到该位置最终的输出向量。
混合精度策略
集装箱的重量直接决定运输成本:同样体积的箱子,用更轻的合金板材制造,就能装更多货、烧更少的油。混合精度训练(Mixed Precision Training)的出发点一模一样——用更“轻”的数据类型来装张量。深度学习默认使用 32 位浮点数(FP32)存储所有参数和中间张量。32 位能提供高精度和巨大数值范围,但也占 4 字节内存。换用 16 位浮点数(FP16),内存占用直接减半,矩阵运算在支持 FP16 的 GPU 上还能提速一倍以上。
但事情没有这么简单。FP16 的数值范围和精度都比 FP32 小得多,直接把所有张量换成 FP16,训练很容易发散——就像用薄纸板做集装箱,路上稍微颠簸就散了架。于是工程师想出一个折中方案:权重在更新时保持 FP32 的“主副本”,计算时复制一份 FP16 的“工作副本”参与前向和反向传播,梯度也以 FP16 计算,但更新主副本之前先做一步“加固”——损失缩放。
损失缩放的核心思想是:在反向传播前先把损失放大若干倍(比如 256 倍),做完梯度计算后再缩回来,避免小梯度在 FP16 中因精度不足而直接变成 0。用公式表示:
回到集装箱比喻:FP32 是不锈钢厚箱,成本高但坚固;FP16 是轻量铝箱,省油但脆弱。混合精度策略就是“货运时用轻箱,箱内关键结构仍然用厚钢加固”。在 PyTorch 中,torch.cuda.amp 库已经把这整套流程封装成几行 API。理解张量数据类型的选择逻辑,能帮你在模型训练和部署时做出正确的精度-性能权衡,也能读懂训练日志中"GradScaler"在做什么。
- L 是原始损失模型当前预测与正确答案之间的差距,通常是一个很小的标量数值。
- s 是缩放因子人为规定的一个放大倍数,通常取 2 的幂(如 256、1024),因为乘 2 的幂在浮点运算中不损失精度。
- L' 是缩放后的损失放大后的损失用于反向传播,梯度整体也被放大,FP16 的小数值部分因此能被更精确地表示。
张量与计算图
港口最有价值的不是单个集装箱,而是那张规划了所有船舶靠岸、吊装落位、卡车调度顺序的作业路线图。深度学习模型同样有着一张“路线图”,叫做计算图(Computational Graph)。在这张图里,张量是沿着路线流动的“货物”,算子是执行装卸动作的“节点”,边则标记着张量从哪个操作流向下一个操作。
当你书写 y = W @ x + b 时,深度学习框架并不会立刻算出结果就完事,它会暗中记录:x 和 b 进过矩阵乘法节点、加法节点,最后产出 y。这个记录过程就是前向传播(Forward Pass)。等到计算损失 L 之后,框架自动从 L 出发,沿着计算图反向走一遍,每经过一个节点就用链式法则把梯度乘上去,最终得到每个中间张量的梯度。这条反向路径就是反向传播(Backward Pass)。
链式法则是反向传播的数学引擎,它告诉我们复合函数的梯度如何逐级分解传播:
集装箱路线图让港口几千个集装箱井然有序地流转,计算图则让模型中几十亿个参数张量在训练中高效地同步更新。当你在 PyTorch 中调用 loss.backward() 时,框架就是沿着这张路线图,把梯度一箱一箱地运回每个参数所在的仓库。这就是“深度学习的张量表示”全貌的最后一环:张量不仅是静态的容器,更是在计算图中流动的生命体。
- \partial L / \partial y 是上游梯度从损失节点传回来的误差信号,代表“y 的微小变化会引起损失多大变化”。
- \partial y / \partial x 是局部梯度当前算子自身的导数,代表“x 的微小变化会引起 y 多大变化”。
- 两者相乘得到下游梯度误差信号经过算子时被“乘以”局部梯度,再传给更上游的节点。
AI 应用场景
场景1:图像模型部署时的 NCHW/NHWC 调优
阶段:模型部署与推理优化
解决的问题:一个训练好的图像分类模型,在 PyTorch 中默认以 NCHW 格式运行,推理时每秒只能处理 80 张图。部署团队把模型导出到推理引擎时发现问题出在内存布局上——GPU 对 NHWC 布局的卷积核访问更连续,但框架未自动转换,导致频繁的非连续内存访问拖慢速度。
具体案例:某安防公司部署人脸识别模型到 Jetson 边缘设备,工程师利用 TensorRT 将权重张量从 NCHW 重排为 NHWC,并开启 NHWC 算子内核,推理吞吐从 80 FPS 提升到 145 FPS。整个改动没有修改任何模型参数,只是改变了张量的“码放方式”。
场景2:Transformer 推理中的张量重组优化
阶段:模型推理优化与内存规划
解决的问题:大语言模型推理时,注意力机制中的 Q、K、V 张量需要反复计算和缓存。如果 KV Cache 的形状规划不合理,会出现大量内存碎片和频繁的显存分配,拖低生成速度。
具体案例:某大模型推理服务团队在做 7B 模型部署时,将 KV Cache 预分配为连续的 [层数, 批次, 头数, 序列长度, 头维度] 五维张量,并将注意力计算中的张量重排与缓存合并,避免了每次生成 token 都重新申请显存。最终首 token 延迟降低 30%,并发能力提升一倍。
场景3:混合精度训练的落地实践
阶段:模型训练与资源优化
解决的问题:在 8 卡 GPU 集群上训练大规模推荐模型时,FP32 全精度训练显存占用接近上限,无法加大批次。团队希望用混合精度省出显存,又担心精度损失导致 AUC 下降。
具体案例:团队采用 PyTorch AMP 自动混合精度方案,保留 FP32 主权重,前反向用 FP16,配合 GradScaler 做损失缩放。显存占用下降约 40%,训练速度提升 1.6 倍,AUC 仅损失不到 0.02%,通过调大缩放因子和学习率预热后完全恢复。
Python 演示
import numpy as np class ImageBatch: """一个极简的图片批张量容器,演示 NCHW 与 NHWC 布局转换。""" def __init__(self, data, fmt="NCHW"): self.tensor = np.asarray(data) self.format = fmt def to_nhwc(self): "将 NCHW 布局转为 NHWC 布局。" if self.format == "NCHW": permuted = np.transpose(self.tensor, (0, 2, 3, 1)) return ImageBatch(permuted, "NHWC") return ImageBatch(np.array(self.tensor), "NHWC") def shape(self): "返回当前张量的形状元组。" return tuple(self.tensor.shape) def conv2d_single(input_2d, kernel_2d, stride=1, pad=0): "最简二维卷积:单输入通道、单输出通道、无批量维。" H, W = input_2d.shape K = kernel_2d.shape[0] if pad > 0: padded = np.zeros((H + 2 * pad, W + 2 * pad)) padded[pad:pad + H, pad:pad + W] = input_2d else: padded = input_2d out_h = (padded.shape[0] - K) // stride + 1 out_w = (padded.shape[1] - K) // stride + 1 output = np.zeros((out_h, out_w)) for i in range(out_h): for j in range(out_w): region = padded[i * stride:i * stride + K, j * stride:j * stride + K] output[i, j] = np.sum(region * kernel_2d) return output def sgd_update(weight, grad, lr=0.01): "权重更新:W <- W - lr * grad,梯度形状必须与权重一致。" return weight - lr * grad def main(): batch = np.random.rand(2, 3, 4, 4) # N=2, C=3, H=4, W=4 img_batch = ImageBatch(batch, "NCHW") print("初始张量形状:", img_batch.shape()) nhwc_batch = img_batch.to_nhwc() print("转 NHWC 后形状:", nhwc_batch.shape()) kernel = np.array([[1.0, 0.0], [0.0, -1.0]]) single_img = batch[0, 0] conv_out = conv2d_single(single_img, kernel, stride=1, pad=0) print("单通道卷积输出形状:", conv_out.shape) w = np.random.rand(3, 3) grad = np.random.rand(3, 3) w_updated = sgd_update(w, grad, lr=0.01) print("权重更新前后形状一致:", w.shape == w_updated.shape) if __name__ == "__main__": main()
np.random.rand(2, 3, 4, 4)生成一个四维随机张量,模拟 2 张 3 通道 4×4 的图片,这正是[N, C, H, W]约定的直观体现。np.transpose(self.tensor, (0, 2, 3, 1))把轴的顺序从[N, C, H, W]重排为[N, H, W, C],这就是 NCHW 到 NHWC 布局转换的核心一步。out_h = (padded.shape[0] - K) // stride + 1对应卷积输出尺寸公式,体现输入高、核大小、步长、填充四者的关系。np.sum(region * kernel_2d)卷积核覆盖的局部区域与核逐元素相乘再求和,这是“滑动加权求和”的数学本质。sgd_update(w, grad, lr=0.01)权重张量减去学习率乘以同形状梯度张量,实现一步最朴素的参数更新。
常见误区
误区“我学过线性代数,张量不就是矩阵吗?都是一堆数字排成的表,没必要区分。” 于是看到三维、四维张量时总想强行压成一张二维表格来理解。
正解矩阵只是二维张量的一种特例,就像 20 英尺柜是集装箱的一种规格,但你不能说“集装箱就是 20 英尺柜”。深度学习里的图像批次是四维张量 [N,C,H,W],Transformer 的注意力权重也是张量。强行把多维张量看成二维表,会丢失通道、序列等轴的语义,导致后续操作和形状推断全部混乱。
为何常见:大多数教材从线性代数进入深度学习,矩阵的概念先入为主,而“张量”这个术语看起来又只是矩阵的另一个名字。
误区“NCHW 和 NHWC 不就是把字母顺序换一下吗?文档里标注清楚就行,反正数学上完全等价,不影响任何东西。”
正解数学上两者确实等价,但内存中元素的物理排列顺序完全不同。在 NCHW 中,同一通道的像素连续存放;在 NHWC 中,同一像素位置的多个通道连续存放。硬件访存模式不同,会导致几十甚至成倍的性能差异。比如 GPU 卷积在 NCHW 下更高效,而某些 CPU 推理引擎和 TensorRT 在 NHWC 下更高效。
为何常见:初学者通常只接触一个框架的默认格式,且高层 API 会隐藏布局细节,让人误以为布局只是“写法”层面的差异。
误区“梯度不就是个数值吗?代表损失下降的方向。或者至少应该比权重小很多,反正只是给权重一个调整量。”
正解梯度张量与权重张量的形状必须完全一致。权重有多大的“货柜”,梯度这个“指示牌”就有多大。因为每个权重参数都需要一个独立的偏导数值,梯度的第 i 个元素对应权重的第 i 个元素,这样才能执行逐元素的 W = W - lr * grad 更新。形状不一致框架会直接报错。
为何常见:学习深度学习的推导时,梯度常被写成“一个数”或“更新量”这类模糊说法,让人误以为它是个小标量,而忽略它与参数张量的逐元素对应关系。
误区“FP16 省显存又能加速,那我直接把模型参数、输入数据、梯度全转成 FP16 训练不就完了?省事又高效。”
正解如果所有张量全用 FP16,反向传播时小梯度很容易因为 FP16 精度不足而变成 0,模型直接不收敛。混合精度的标准做法是:维持一份 FP32 的“主权重”用于更新,前向和反向计算用 FP16 副本,并配合损失缩放(把损失乘一个大因子,算完梯度再除回来),才能兼顾速度与稳定。
为何常见:看到“混合精度”的加速收益后容易忽视其工程细节,误以为只是换个数据类型那么简单,直到实验发散才意识到问题。
面试题
Q1. 下面哪一项最接近“张量”在深度学习中的含义?
- A.一个带标签的二维表格
- B.任意维度的数值数组← 正确答案
- C.只有三个维度的立方体
- D.只能存整数的容器
答案:B。张量是标量、向量、矩阵向任意维度的推广,本质上是多维数值数组。A 只描述了 DataFrame 式的表格,C 把张量局限为三维,D 错误——张量通常存浮点数而非仅整数,故选 B。
Q2. 张量形状 [3, 4] 表示什么?
- A.3 行 4 列的矩阵← 正确答案
- B.3 列 4 行的矩阵
- C.4 行 3 列的矩阵
- D.4 列 3 行的矩阵
答案:A。形状按轴的顺序描述维度,[3, 4] 表示第 0 轴长度为 3、第 1 轴长度为 4。习惯上把第 0 轴当行、第 1 轴当列,所以是 3 行 4 列,选 A。
Q3. NCHW 格式中,字母 C 代表哪个轴?
- A.批次大小(Batch)
- B.特征图的高(Height)
- C.通道数量(Channel)← 正确答案
- D.特征图的宽(Width)
答案:C。NCHW 四个字母依次对应 Batch、Channel、Height、Width。C 表示通道维,比如彩色图的 RGB 三通道。A 对应 N,B 对应 H,D 对应 W,所以选 C。
Q4. 以下哪些属于深度学习中常见的张量数据类型?
- A.32 位浮点(FP32)← 正确答案
- B.16 位浮点(FP16)← 正确答案
- C.8 位整型(INT8)← 正确答案
- D.字符串类型(String)
答案:ABC。FP32 是训练默认精度,FP16 用于混合精度训练,INT8 常见于量化推理部署。字符串不是张量的数值元素类型,张量要求元素能参与数值运算,故选 A、B、C。
Q5. 卷积核张量在深度学习框架中的常见形状是?
- A.输出通道、输入通道、高、宽← 正确答案
- B.输入通道、输出通道、宽、高
- C.批次大小、通道数、高和宽
- D.高、宽、输入通道、输出通道
答案:A。PyTorch 和 TensorFlow 中卷积核的常见形状约定是 [输出通道, 输入通道, 核高, 核宽],即 [out_channels, in_channels, kh, kw]。B 交换了前两轴,C 是输入数据形状,D 是某些框架内部重排后的布局,故选 A。
Q6. 关于权重梯度张量的形状,正确说法是?
- A.与权重张量形状相同← 正确答案
- B.比权重的形状小一号
- C.与输入数据形状相同
- D.与输出数据形状相同
答案:A。梯度中每个元素对应权重中同位置的参数,二者形状必须完全一致,才能执行逐元素更新 W -= lr * grad。它既不等于输入形状,也不等于输出形状,故选 A。
Q7. 混合精度训练通常需要哪些策略?
- A.用 FP16 减少显存占用← 正确答案
- B.维护 FP32 主权重副本← 正确答案
- C.对损失函数进行缩放← 正确答案
- D.把所有算子换成整数运算
答案:ABC。混合精度用 FP16 做前反向计算以省显存提速,但需要保留 FP32 主权重保证更新精度,同时用损失缩放防止小梯度溢出为 0。D 是量化推理的思路而非混合精度训练,故选 A、B、C。
Q8. im2col 的核心思想是什么?
- A.把卷积变成矩阵乘法← 正确答案
- B.用更大卷积核代替池化
- C.把图像编码成二进制
- D.用随机采样代替全连接
答案:A。im2col 把输入特征图上每个卷积窗口位置的数据展开成一列,所有窗口拼成一个大矩阵,卷积核也展开成矩阵,于是卷积就变成了标准矩阵乘法。这是 GPU 加速卷积的经典手段,故选 A。
Q9. 注意力机制中的 Q、K、V 通常来自?
- A.同一个输入张量的线性投影← 正确答案
- B.三个不同的权重矩阵变换← 正确答案
- C.输入序列的逐元素相加
- D.直接复制输入张量本身
答案:AB。在自注意力中,Q、K、V 由同一个输入张量 X 分别乘上三个不同的可学习权重矩阵得到,因此它们既同源又各自独立。C 是残差连接的操作,D 缺少投影变换,故选 A、B。
Q10. 在自动求导计算图中,反向传播传递的核心量是?
- A.损失关于每个张量的梯度← 正确答案
- B.权重矩阵的逆矩阵
- C.每个算子的执行时间
- D.训练数据的统计分布
答案:A。反向传播沿着计算图从输出往输入传递的是梯度——即损失对每个中间张量的偏导数。通过链式法则逐层相乘得到各参数的梯度。B 与求逆无关,C 是性能分析,D 是数据分布,故选 A。