张量和矩阵的关系
Tensor 的ndim 就是阶数,shape=(10, 2)、ndim=2 的张量,本质就是一个10*2矩阵。
创建一个 (10, 2) 的张量
import torch
t = torch.tensor([
[1.0, 2.0],
[3.0, 4.0],
[5.0, 6.0],
[7.0, 8.0],
[9.0, 10.0],
[11.0, 12.0],
[13.0, 14.0],
[15.0, 16.0],
[17.0, 18.0],
[19.0, 20.0],
])
print(t)
print("shape:", t.shape)
print("ndim :", t.ndim)
print("numel:", t.numel())
输出:
tensor([[ 1., 2.],
[ 3., 4.],
[ 5., 6.],
[ 7., 8.],
[ 9., 10.],
[11., 12.],
[13., 14.],
[15., 16.],
[17., 18.],
[19., 20.]])
shape: torch.Size([10, 2])
ndim : 2
numel: 20
这就是"嵌套"的样子
- 最外层
[...]:包住 10 个元素 - 里面每个元素又是一个
[...]:各有 2 个数字
人类看起来是"10 个长度 2 的列表嵌套在一起"。
但它底层不是嵌套的
PyTorch 内部其实是一段连续的 20 个数:
print(t.flatten())
# tensor([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
# 11., 12., 13., 14., 15., 16., 17., 18., 19., 20.])
再配合 shape=(10, 2) 和 stride=(2, 1),PyTorch 就知道"怎么把它读成 10 行 2 列":
print("stride:", t.stride()) # (2, 1)
stride=(2, 1)意思是:- 行号 +1 → 内存下标 +2
- 列号 +1 → 内存下标 +1
所以 t[3][1](第 4 行第 2 列)= 内存下标 3*2 + 1 = 7 = 数值 8.0。验证一下:
print(t[3, 1]) # tensor(8.)
顺带对比不同阶数
a = torch.tensor([1.0, 2.0, 3.0]) # 1 阶, shape (3,)
b = torch.tensor([[1.0, 2.0], [3.0, 4.0]]) # 2 阶, shape (2, 2)
c = torch.tensor([[[1.0, 2.0], [3.0, 4.0]],
[[5.0, 6.0], [7.0, 8.0]]]) # 3 阶, shape (2, 2, 2)
print(a.ndim, b.ndim, c.ndim) # 1 2 3
print(a.shape, b.shape, c.shape)
方括号嵌套的层数 = 张量的阶数,这只是书写约定,不是内存结构。
两个"阶"的对比
| 出处 | "阶"指什么 | 英文 | 例子 |
|---|---|---|---|
| 线性代数 | 方阵的边长 n | order (of a square matrix) | 3 阶方阵 = 3×3 |
| 张量/深度学习 | 张量的维度数 | rank / order / ndim | 2 阶张量 = 矩阵 |
总结
torch.tensor([[...], [...], ...])只是书写成嵌套的样子;创建出来的t是shape=(10, 2)、ndim=2的张量,底层是一段长度为 20 的连续内存。数学上它就是(10, 2)的矩阵。