一.什么是张量(Tensor)?
1.通俗解释
张量就是PyTorch 里专门用来存数字、做计算的多维数组,是整个 PyTorch 的核心数据载体。
类比:
- 普通数字(单个数值)→ 0维张量
- 列表/一维数组 [1,2,3] → 1维张量(向量)
- 表格/矩阵 [[1,2],[3,4]] → 2维张量(矩阵)
- 多张表格叠在一起(比如多张图片)→ 3维/4维张量
核心作用:神经网络的所有数据(输入图片、标签、权重、偏置)全都要用张量存储,所有运算也都基于张量完成。
2.专业定义
张量是支持自动微分、硬件加速(CPU/GPU)、多维结构化的数值容器,区别于 Python 原生列表、NumPy 数组,它是为深度学习量身设计的。
3.张量 vs 普通列表 / NumPy 数组
1.** Python 列表**:只能存数据,不能GPU加速、不支持自动求导,运算慢;
2. NumPy 数组:多维数组、运算快,但无法直接放到GPU,没有深度学习必备的自动微分功能;
3. PyTorch 张量:兼容数组逻辑,支持CPU/GPU切换、原生自动求导、深度学习算子,是深度学习标配。
二.张量的维度(Rank/阶)与形状(Shape)
维度是张量最关键的概念,维度 = 有几层中括号,形状 shape 用来描述每一层有多少个元素。
1.0维张量(标量 Scalar)
- 形态:单个数字,没有中括号
- 例子:5、3.14
- 维度: dim=0
- shape:空 ()
- 用途:损失值、准确率、单个阈值
import torch
t0 = torch.tensor(5)
print(t0) # tensor(5)
print(t0.dim()) # 0 维度数
print(t0.shape) # torch.Size([]) 形状
2.1维张量(向量 Vector)
- 形态:一层中括号,类似 Python 列表
- 例子: [1, 2, 3, 4]
- 维度: dim=1
- shape: (元素个数,)
- 用途:一维特征、标签数组、简单序列数据
import torch
t1 = torch.tensor([1,2,3,4])
print(t1.dim()) # 1
print(t1.shape) # torch.Size([4])
3.2维张量(矩阵 Matrix)
- 形态:两层中括号,类似 Excel 表格、数学矩阵
- 格式:[[行1], [行2], …]
- shape: (行数, 列数)
- 维度:dim=2
- 用途:全连接层数据、表格型数据集
import torch
#2行3列
t2 = torch.tensor([[1,2,3],[4,5,6]])
print(t2.dim()) # 2
print(t2.shape) # torch.Size([2, 3])
4.3维张量
- 形态:三层中括号,矩阵的堆叠
- shape:(矩阵个数, 行数, 列数)
- 维度:dim=3
- 经典用途:单通道图片、文本词向量序列
举例: (3, 2, 2) → 3个 2行2列 的矩阵
import torch
t3 = torch.randn(3, 2, 2) # 随机生成3×2×2张量
print(t3.shape) # torch.Size([3, 2, 2])
5.4维张量(深度学习常用)
重中之重,图像、卷积网络全靠它!
标准格式(PyTorch 图像默认):
shape = (batch_size, channel, height, width)
翻译+拆解:
- 彩色图(RGB):三通道 channel=3
例子:(8, 3, 256, 256)
含义:一批8张RGB彩色图,每张图分辨率 256×256
import torch
#4维张量:8张图,3通道,256高,256宽
t4 = torch.rand(8, 3, 256, 256)
print(t4.dim()) # 4
print(t4.shape) # torch.Size([8, 3, 256, 256])
补充:高维张量
5维及以上多用于视频、3D图像、多模态数据,逻辑和上面一致,层数=维度数。
三.张量的数据类型(dtype)
张量存储的数字分不同类型,对应整数、浮点数,深度学习中浮点型是主力。
1.常用数据类型(专业名词+用途)
| torch.float32/torch.float | 32位单精度浮点数 | 默认浮点类型,网络权重,输入数据最常用 |
| torch.float64/torch.double | 64位单精度浮点数 | 高精度计算,深度学习极少用 |
| torch.int64/ torch.long | 64位长整数 | 标签,分类索引(分类任务必备) |
| torch.int32/ torch.int | 32位整数 | 普通整数数据 |
| torch.bool | 布尔型 | 掩码,条件判断 |
2.小知识点
示例:
import torch
t = torch.tensor([1.1, 2.2])
print(t.dtype) # torch.float32
t_long = torch.tensor([0,1,2])
print(t_long.dtype) # torch.int64
四.张量的两大核心属性(深度学习独有)
这是张量和 NumPy 数组最本质的区别。
1.设备属性(device):CPU / GPU
张量可以存放在CPU内存或GPU显存中,GPU 运算速度远快于CPU,训练模型必须用GPU。
- device(type='cpu') :存放在CPU(默认)
- device(type='cuda', index=0) :存放在0号GPU
常用操作:
import torch
t = torch.rand(3,3)
#1. 查看设备
print(t.device) # cpu
#2. 张量移到GPU
t_gpu = t.cuda()
#或写法(推荐,兼容性更好)
t_gpu = t.to("cuda")
#3. 张量移回CPU
t_cpu = t_gpu.to("cpu")
:::info
重要规则:两个张量做运算,必须在同一个设备上,否则直接报错。
:::
2.梯度属性(requires_grad & grad):自动微分
这是训练神经网络的灵魂,对应深度学习的反向传播、梯度下降。
名词解释
- False (默认):普通数据,不计算梯度(图片、输入数据)
- True :需要计算梯度(网络权重、参数)
通俗理解
模型训练就是不断更新权重:
示例:
import torch
#开启求导
w = torch.tensor([2.0], requires_grad=True)
y = w ** 2 # 计算 y = w²
y.backward() # 反向传播,计算梯度
print(w.grad) # tensor([4.]) 数学推导:y'=2w,w=2 → 梯度=4
五.张量的创建方式(高频用法)
日常编码最常用的创建函数,附通俗说明:
1.从手动数据创建
torch.tensor(列表/数值) :最基础,自定义数据
import torch
a = torch.tensor([1,2,3])
2.创建全0 / 全1 张量
- torch.zeros(形状) :所有元素为 0
- torch.ones(形状) :所有元素为 1
常用于初始化占位数据、掩码。
import torch
zeros = torch.zeros(2,3) # 2行3列全0
ones = torch.ones(4) # 1维全1
3.创建随机张量(深度学习最常用)
import torch
rand1 = torch.rand(3,3) # 0~1随机
rand2 = torch.randn(2,4) # 正态分布随机
4.等间隔序列
torch.arange(起始, 结束, 步长) :类似 Python range ,生成有序数列
import torch
seq = torch.arange(0, 10, 2) # [0,2,4,6,8]
六.张量维度变换(高频操作:变形、转置、拼接)
处理图像、特征时几乎天天用,重点掌握。
1.形状重塑: reshape() / view()
**作用:**不改变元素总数,只改变维度结构。
**规则:**新形状的元素总数 = 原形状总数
可以用 -1 让 PyTorch 自动计算维度。
import torch
t = torch.rand(2, 4) # 总共 2*4=8 个元素
t2 = t.reshape(4, 2) # 改成4行2列
t3 = t.view(–1, 2) # 自动计算第一维 → shape [4,2]
2.增减维度: unsqueeze() / squeeze()
- unsqueeze(dim) :增加一个维度(扩充批次/通道,处理单张图片必备)
- squeeze(dim) :删除长度为1的维度(压缩多余维度)
示例:单张图片 [3,256,256] → 模型要求4维 [1,3,256,256]
import torch
img = torch.rand(3, 256, 256) # 3维单张图
img_batch = img.unsqueeze(0) # 在第0维加维度 → [1,3,256,256]
img_restore = img_batch.squeeze(0) # 删除第0维 → 变回3维
3.张量拼接: cat()
把多个张量按指定维度拼在一起,常用于合并批次、合并特征。
import torch
a = torch.rand(2,3)
b = torch.rand(2,3)
c = torch.cat([a, b], dim=0) # 按行拼接 → shape [4,3]
:::info
对于二维张量 [行数, 列数]
- dim = 0:代表行方向(第一个维度)
- dim = 1:代表列方向(第二个维度)
:::
七.张量索引与切片(取数据)
规则和 Python 列表、NumPy 完全一致:
- t[索引] :取单个元素
- t[起始:结束] :切片
- 多维度: t[维度1, 维度2]
示例(4维图像张量):
import torch
imgs = torch.rand(8,3,256,256)
first_img = imgs[0] # 取第1张图 [3,256,256]
first_two = imgs[0:2] # 取前2张图 [2,3,256,256]
八.补充:张量和 NumPy 数组互转
实战中经常混用两者,转换非常简单:
1. 张量 → NumPy:tensor.numpy()
2. NumPy → 张量:torch.from_numpy(ndarray)
:::info
注意:如果张量在GPU上,要先转到CPU再转NumPy。
:::
九.核心总结
1. 本质:张量是 PyTorch 多维数值数组,深度学习唯一数据载体;
2. 维度:中括号层数 = 维度,4维 (批次,通道,高,宽) 是图像标准格式;
3. 两大独有特性:
- device :支持 CPU/GPU 切换,加速运算;
- requires_grad/grad :自动求导,支撑网络训练;
4. 高频操作:创建张量、 reshape 变形、 unsqueeze/squeeze 增减维度、切片索引。



