Tensor:PyTorch中最基础的计算单元
一、什么是Tensor
Tensor(张量) 是 PyTorch 中极为基础的数据存储和处理结构,也是深度学习框架中最核心的概念之一。
标量、向量、矩阵与Tensor的关系
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
标量可以组合成向量,向量可以组合成矩阵。在 PyTorch 中,统一称为张量(Tensor),用 Rank(秩) 表示"维度"。
二、Tensor的常用数据类型
|
|
|
|
|---|---|---|
|
|
torch.float32
torch.float
|
|
|
|
torch.float64
torch.double
|
|
|
|
torch.float16
torch.half
|
|
|
|
torch.uint8 |
|
|
|
torch.int8 |
|
|
|
torch.int16
torch.short
|
|
|
|
torch.int32
torch.int
|
|
|
|
torch.int64
torch.long
|
|
|
|
torch.bool |
|
★实际使用中,
torch.float32、torch.float64、torch.uint8和torch.int64用得相对较多,需根据实际情况选择。
三、Tensor的创建方式
1. 直接创建:torch.tensor()
torch.tensor(data, dtype=None, device=None, requires_grad=False)
参数说明:
-
data:支持 list、tuple、numpy array、scalar 等多种类型传入并转换为 tensor -
dtype:指定返回的 Tensor 类型 -
device:指定数据返回到的设备(CPU/GPU) -
requires_grad:是否保留梯度信息,训练时设为 True,验证/测试时设为False
2. 从NumPy创建
torch.from_numpy(ndarry)
3. 创建特殊形式的Tensor
|
|
|
|---|---|
torch.zeros(*size) |
|
torch.eye(size) |
|
torch.ones(*size) |
|
4. 创建随机矩阵Tensor
|
|
|
|---|---|
torch.rand(size) |
|
torch.randn(size) |
|
torch.normal(mean, std, size) |
|
torch.randint(low, high, size) |
|
四、Tensor的转换操作
1. Int ↔ Tensor
a = torch.tensor(1) # 数字(标量)→ Tensor
b = a.item() # Tensor → Python number
2. List ↔ Tensor
a = [1, 2, 3]
b = torch.tensor(a) # list → Tensor
c = b.numpy().tolist() # Tensor → NumPy → list
3. NumPy ↔ Tensor
使用 torch.tensor() 即可将 NumPy 转换为 Tensor。
4. CPU ↔ GPU
CPU → GPU: data.cuda()
GPU → CPU: data.cpu()
五、Tensor的常用操作
1. 获取形状
a = torch.zeros(2, 3, 5)
a.shape # torch.Size([2, 3, 5])
a.size() # torch.Size([2, 3, 5])
a.numel() # 30(统计元素总数)
2. 矩阵转置(维度转换)
permute() — 对任意高维矩阵进行转置:
x = torch.rand(2, 3, 5)
x = x.permute(2, 1, 0)
x.shape # torch.Size([5, 3, 2])
★
x.permute(2,1,0)中,2表示原来的第2个维度现在放在第0个维度,依此类推。
transpose() — 每次只能交换两个维度:
x = torch.rand(2, 3, 4)
x = x.transpose(1, 0)
x.shape # torch.Size([3, 2, 4])
★⚠️ 重要注意:经过
transpose或permute处理后,数据在内存中不再连续。
3. 形状变换
view() — 改变形状,但要求 Tensor 内存连续:
x = torch.randn(4, 4)
x = x.view(2, 8)
x.shape # torch.Size([2, 8])
view 的局限:不能处理内存不连续的 Tensor。
x = x.permute(1, 0) # 内存不再连续
x.view(4, 4) # 报错!RuntimeError
reshape() — 解决内存不连续问题:
x = x.reshape(4, 4)
x.shape # torch.Size([4, 4])
★原理:
reshape相当于先执行contiguous()将内存捋顺,再执行view()。
4. 增减维度
squeeze() — 删除指定维度(要求该维度值为1):
x = torch.rand(2, 1, 3)
y = x.squeeze(1)
y.shape # torch.Size([2, 3])
z = y.squeeze(1) # 第1维度大小为3,删除失败
z.shape # torch.Size([2, 3])
unsqueeze() — 在指定位置增加维度(值为1):
x = torch.rand(2, 1, 3)
y = x.unsqueeze(2)
y.shape # torch.Size([2, 1, 1, 3])
六、NumPy与Tensor的对比
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
七、每课一练
问题:torch.Tensor() 和 torch.tensor() 两种函数有何区别?
解答:
-
torch.Tensor是默认 tensor 类型(torch.FloatTensor)的别名,无论输入什么类型,都输出 FloatTensor; -
torch.tensor会根据输入的数据类型自动判断,创建对应类型的 tensor。例如输入 int 类型时,输出torch.int32; -
torch.Tensor()是 Tensor 类的构造方法;torch.tensor()是 Tensor 类内部的方法,调用后会对参数中的数据做拷贝。
八、小结
-
Tensor 是 PyTorch 的基础计算单元,对标量、向量、矩阵进行了统一表示,使用 Rank(秩)表示维度。 -
创建方式多样:直接创建、从NumPy创建、特殊形式(zeros/ones/eye)、随机矩阵(rand/randn/normal/randint)。 -
类型转换灵活:支持 int、list、NumPy、CPU/GPU 之间的相互转换。 -
核心操作: -
形状相关: shape、size()、numel() -
维度变换: permute()(任意维度)、transpose()(两两交换) -
形状变换: view()(需内存连续)、reshape()(自动处理不连续) -
增减维度: squeeze()(删减)、unsqueeze()(增加) -
内存连续性是使用 view()时需特别注意的坑点,可用contiguous()解决或直接用reshape()。

