张量(Tensor)是深度学习和科学计算中的一个核心概念。在PyTorch中,张量是一个多维数组,是库操作的基本单位,可以看作是高维数组或矩阵的泛化。张量支持自动求导机制,非常适合在GPU或其他硬件加速器上进行高效计算。张量不仅可以用于存储数据,还可以通过计算图和梯度流来参与和构建复杂的数学模型。
张量的属性
张量具有以下几个关键属性:
- 维度(Dimension):张量的维度(或称为轴)表示数据的组织形式。例如,一个3维张量可以表示一个立方体的数据,维度分别对应高度、宽度和深度。
- 形状(Shape):张量的形状是一个由各维度大小组成的元组,描述了张量在每个维度上的尺寸。
- 数据类型(Dtype):张量可以存储不同类型的数值,如整数、浮点数等。PyTorch中的张量支持多种数据类型。
- 设备(Device):张量可以存储在不同的设备上,最常见的设备是CPU和GPU。将张量移动到GPU上可以加速计算。
创建张量
PyTorch提供了多种方法来创建张量:
1.直接从数据创建:
import torch
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
2.从NumPy数组创建:
import numpy as np
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
3.通过现有的张量创建: 使用现有张量来确定新张量的形状、数据类型和设备。新张量会重新分配内存。
x_ones = torch.ones_like(x_data) # 保留x_data的属性
x_rand = torch.rand_like(x_data, dtype=torch.float) # 覆盖x_data的数据类型
4.使用随机或常数值:
shape = (2,3,) # 形状为2x3的张量
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)
张量操作
PyTorch中的张量支持超过100种操作,包括算术、线性代数、矩阵操作等,这些操作可以在CPU或GPU上执行。示例:
import torch
import numpy as np
# 张量创建
# 从数据直接创建张量
tensor_from_data = torch.tensor([[1, 2], [3, 4]])
# 从NumPy数组创建张量
np_array = np.array([[1, 2], [3, 4]])
tensor_from_numpy = torch.from_numpy(np_array)
# 使用随机或常数值创建张量
shape = (2, 3)
tensor_rand = torch.rand(shape)
tensor_ones = torch.ones(shape)
tensor_zeros = torch.zeros(shape)
# 张量属性
print("张量形状:", tensor_from_data.shape)
print("张量类型:", tensor_from_data.dtype)
print("存储在哪个设备:", tensor_from_data.device)
# 张量操作
# 算术操作
tensor_add = tensor_from_data + tensor_ones # 张量加法
tensor_mul = tensor_from_data * tensor_ones # 张量乘法
# 切片和索引
tensor_slice = tensor_from_data[:, 1] # 获取所有行的第二列
# 形状变换
tensor_reshape = tensor_from_data.view(4) # 改变形状为4个元素的一维张量
tensor_resize = tensor_from_data.reshape(1, 4) # 改变形状为1x4的张量
# 张量拼接
tensor_concat = torch.cat([tensor_from_data, tensor_ones], dim=1) # 在列维度上拼接
# 张量广播
# 广播允许在算术操作中自动扩展尺寸不同的张量
tensor_broadcast = tensor_from_data + torch.tensor([1, 2])
# 将张量移动到不同的设备
if torch.cuda.is_available():
tensor_to_gpu = tensor_from_data.to('cuda')
# 打印结果示例
print("加法结果:\n", tensor_add)
print("乘法结果:\n", tensor_mul)
print("切片结果:\n", tensor_slice)
print("重塑结果:\n", tensor_reshape)
print("张量拼接结果:\n", tensor_concat)
print("广播结果:\n", tensor_broadcast)
# 注意:执行 tensor_to_gpu 时,确保你的环境支持CUDA
注:通过使用运算符+ 或 add函数,可以将两个相同形状的张量相加,以获得相同 形状的输出张量。PyTorch遵循为同一操作使用后缀下划线的惯例,但这会发生in- place。 例如,a.add(b)得到了一个新的张量,它是通过在a 和 b 上求和得到的结果。 此操作不会对现有的张量a 和 b 进行任何更改。但是a.add_(b)使用求和结果更新张 量 a 并返回更新后的a0 这同样适用于PyTorch中的所有操作。