Pytorch使用手册-Tensors(专题二)
这段代码是对 PyTorch 中张量(Tensors)的详细介绍和操作演示。以下是逐步讲解:
1. 什么是张量 (Tensor)
张量是一种专门的数据结构,与 NumPy 的多维数组(ndarray)类似:
- 它可以在 GPU 或其他硬件加速器上运行。
- 张量可以与 NumPy 共享内存,避免不必要的数据拷贝。
- 它是为自动微分(automatic differentiation)优化的,支持深度学习中的反向传播。
2. 初始化张量
张量可以通过多种方式初始化:
(a) 直接从数据创建
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
通过 Python 的嵌套列表直接创建张量,PyTorch 会自动推断数据类型。
(b) 从 NumPy 数组创建
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
可以从 NumPy 数组生成张量,且两者共享底层内存,修改其中之一会影响另一个。
© 从其他张量创建
x_ones = torch.ones_like(x_data) # 保留形状和数据类型
x_rand = torch.rand_like(x_data, dtype=torch.float) # 修改数据类型
基于已有张量创建新张量,可以选择保留或覆盖原张量的属性。
(d) 随机或常数值初始化
shape = (2, 3)
rand_tensor = torch.rand(shape) # 随机数
ones_tensor = torch.ones(shape) # 全1
zeros_tensor = torch.zeros(shape) # 全0
通过 shape
参数定义张量的维度,生成对应形状的随机、全 1 或全 0 张量。
3. 张量的属性
张量的属性包括:
- 形状 (shape): 表示张量的维度。
- 数据类型 (dtype): 张量中元素的数据类型。
- 存储设备 (device): 张量所在的设备(CPU/GPU)。
示例代码:
tensor = torch.rand(3, 4)
print(f"Shape of tensor: {tensor.shape}") # (3, 4)
print(f"Datatype of tensor: {tensor.dtype}") # float32
print(f"Device tensor is stored on: {tensor.device}") # 默认 CPU
4. 张量操作
PyTorch 提供了多种张量操作,支持线性代数、矩阵操作、索引切片等。
(a) 索引与切片
tensor = torch.ones(4, 4)
print(tensor[0]) # 第一行
print(tensor[:, 0]) # 第一列
print(tensor[..., -1]) # 最后一列
tensor[:, 1] = 0 # 将第二列的值改为0
(b) 张量拼接
使用 torch.cat
在指定维度上拼接多个张量:
t1 = torch.cat([tensor, tensor, tensor], dim=1) # 沿列拼接
© 算术运算
-
矩阵乘法:
y1 = tensor @ tensor.T # 矩阵乘法 y2 = tensor.matmul(tensor.T) # 等价操作 torch.matmul(tensor, tensor.T, out=y3) # 将结果写入 y3
-
元素级运算:
z1 = tensor * tensor z2 = tensor.mul(tensor) torch.mul(tensor, tensor, out=z3) # 将结果写入 z3
(d) 单元素张量
当张量通过聚合操作(如 sum()
)变成一个元素时,可以使用 item()
转换为 Python 标量:
agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item)) # 输出值和数据类型
(e) 原地操作
在原地修改张量的操作以 _
结尾,如 add_
:
tensor.add_(5) # 张量加5并修改自身
注意:原地操作节省内存,但可能影响梯度计算,因此需谨慎使用。
5. PyTorch 与 NumPy 的桥接
PyTorch 张量与 NumPy 数组可以共享内存,因此两者的修改是同步的。
(a) 张量转 NumPy
t = torch.ones(5)
n = t.numpy()
t.add_(1)
print(t, n) # t 和 n 的值都更新了
(b) NumPy 转张量
n = np.ones(5)
t = torch.from_numpy(n)
np.add(n, 1, out=n)
print(t, n) # t 和 n 的值都更新了
6. 张量在 GPU 上操作
默认情况下,张量是在 CPU 上创建的。如果需要加速计算,可以将张量移动到 GPU:
if torch.cuda.is_available():tensor = tensor.to("cuda")
总结
这段代码展示了张量的基本操作,包括创建、索引、拼接、算术运算以及 PyTorch 与 NumPy 的桥接。张量是 PyTorch 的核心数据结构,它既支持灵活的计算,也能高效地运行在硬件加速器上。