Tensor 的形状、dtype 与 device
正确改变形状、轴、类型和设备,避免静默广播和不兼容运算。
学习目标
- 广播把两条误差变成四条
- reshape 能代替 NHWC 到 NCHW 的转换吗?
- 说明:广播在某些运算中是设计行为;需要按任务语义判断,不能一概禁止。
为什么需要这个概念
shape 描述各轴长度,dtype 描述元素类型,device 描述存储与运算设备。它们共同构成张量接口,语义轴顺序必须由数据与模型明确约定。
学习前需要掌握
背景与问题
许多训练错误没有复杂算法原因:通道轴放错、类别标签是浮点型,或广播把一维目标扩成二维,都会使训练失败甚至悄悄优化错误目标。
概念定义
shape 描述各轴长度,dtype 描述元素类型,device 描述存储与运算设备。它们共同构成张量接口,语义轴顺序必须由数据与模型明确约定。
直观理解
reshape 像重新分格,permute 像重新排列坐标轴。格子总数相同不代表图片通道与空间顺序就正确。
核心原理
reshape 保持元素的逻辑遍历顺序并重新解释形状,必要时会复制;view 对内存布局有额外要求。permute 改变轴次序,通常生成非连续视图。NHWC 图像转成 NCHW 必须换轴,不能只改成同样元素数的 shape。
广播从尾部比较维度,维度相同或其中之一为 1 才兼容。例如预测为 、标签为 ,相减可能得到 ,并非逐样本误差。无参数 squeeze 在 N=1 时还会删掉 batch 轴。
同一算子一般要求张量设备兼容,整数索引和浮点特征也有不同 dtype 约定。tensor.to 返回转换结果,应赋回变量;把标签随意转 float 可能破坏交叉熵的类别索引接口。
数学表达
核心公式
shape 描述各轴长度,dtype 描述元素类型,device 描述存储与运算设备。它们共同构成张量接口,语义轴顺序必须由数据与模型明确约定。
变量含义
Nbatch 轴C通道轴
计算步骤
- 1先直接相减,观察结果变为 (2,2)。
- 2把目标 reshape 为 (2,1) 后再相减。
代码对应位置
示例 1广播把两条误差变成四条的最小验证:使用完整构造输入核对广播把两条误差变成四条,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
N | batch 轴 |
C | 通道轴 |
完整数值示例
广播把两条误差变成四条
已知条件
- 预测为形状 (2,1) 的 1、2
- 目标为形状 (2,) 的 1、2
计算步骤
- 先直接相减,观察结果变为 (2,2)。
- 把目标 reshape 为 (2,1) 后再相减。
计算结果
错误广播的均方误差为 0.5;对齐形状后误差为 0。
处理前后对比
- 广播在某些运算中是设计行为;需要按任务语义判断,不能一概禁止。
案例推演与判断
原本两条预测都完全正确,但广播把每条预测分别与两个目标比较,构造出额外的交叉样本误差。程序能够求梯度,损失也会变化,因此这种错误比直接报错更难发现。
图像通道换轴同理:打印一个 shape 只能验证长度,不能验证元素是否仍对应原坐标。排错时应使用带编号的小张量,并检查少数元素位置。
计算与实现步骤
- 先直接相减,观察结果变为 (2,2)。
- 把目标 reshape 为 (2,1) 后再相减。
代码实现
示例 1
广播把两条误差变成四条的最小验证
example_01.py用途:使用完整构造输入核对广播把两条误差变成四条,输出只表示本例计算。
import torch
pred = torch.tensor([[1.], [2.]])
target = torch.tensor([1., 2.])
wrong = pred - target
right = pred - target.reshape(-1, 1)
print(tuple(wrong.shape), f"mse={wrong.square().mean().item():.1f}")
print(tuple(right.shape), f"mse={right.square().mean().item():.1f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对广播把两条误差变成四条,输出只表示本例计算。
mean- 训练特征逐列均值。
Step 1 · 1–7 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
pred = torch.tensor([[1.], [2.]])
target = torch.tensor([1., 2.])
wrong = pred - target
right = pred - target.reshape(-1, 1)
print(tuple(wrong.shape), f"mse={wrong.square().mean().item():.1f}")
print(tuple(right.shape), f"mse={right.square().mean().item():.1f}")代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
预期输出或运行结果
(2, 2) mse=0.5 (2, 1) mse=0.0
常见错误 · 6 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- reshape 当换轴
- 设备不一致
- CE 标签 float
- 无参 squeeze
- 确认样本轴、特征轴以及 X 与 y 的第一维完全对应。
实际应用
- 排查损失输入形状
- 图像与序列数据的轴变换
常见错误
- reshape 当换轴
- 设备不一致
- CE 标签 float
- 无参 squeeze
常见问题
reshape 能代替 NHWC 到 NCHW 的转换吗?
不能。它只改变分格,不按通道轴重排元素;应使用 permute(0,3,1,2),再按需要处理连续性。
这个示例能说明什么边界?
广播在某些运算中是设计行为;需要按任务语义判断,不能一概禁止。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。