PyTorch torch张量
一、张量基础概念
在深度学习领域,张量是一个核心概念。PyTorch 是一个功能强大的开源深度学习框架,它提供了灵活的张量操作,使得它在科研和工业应用中都备受青睐。张量本质上是一个多维数组,你可以将它理解为一个包含单个数据类型元素的多维矩阵。
PyTorch 的张量具有多种数据类型,包括 32 位浮点型 (torch.float32
或 torch.float
)、64 位浮点型 (torch.float64
或 torch.double
)、16 位浮点型 (torch.float16
或 torch.half
)、8 位无符号整型 (torch.uint8
)、8 位有符号整型 (torch.int8
)、16 位有符号整型 (torch.int16
或 torch.short
)、32 位有符号整型 (torch.int32
或 torch.int
)、64 位有符号整型 (torch.int64
或 torch.long
) 以及布尔型 (torch.bool
),同时支持 CPU 和 GPU 加速。
torch.Tensor
是默认张量类型的别名,它为 PyTorch 中的张量操作提供了便捷的接口。通过这个接口,我们可以轻松地创建、操作和转换张量,以满足各种深度学习任务的需求。
二、创建张量
(一)从 Python 列表或 NumPy 数组构造张量
可以使用 torch.tensor()
构造函数从 Python list
或序列构造张量:
import torch
## 从 Python 列表构造张量
x = torch.tensor([[1., -1.], [1., -1.]])
print(x)
## 输出:
## tensor([[ 1.0000, -1.0000],
## [ 1.0000, -1.0000]])
## 从 NumPy 数组构造张量
import numpy as np
x = torch.tensor(np.array([[1, 2, 3], [4, 5, 6]]))
print(x)
## 输出:
## tensor([[ 1, 2, 3],
## [ 4, 5, 6]])
(二)构造特定数据类型的张量
可以通过将 torch.dtype
和/或 torch.device
传递给构造函数或张量创建操作来构造特定数据类型的张量:
## 构造一个 2x4 的张量,数据类型为 32 位整数
x = torch.zeros([2, 4], dtype=torch.int32)
print(x)
## 输出:
## tensor([[ 0, 0, 0, 0],
## [ 0, 0, 0, 0]], dtype=torch.int32)
## 构造一个 2x4 的张量,数据类型为 64 位浮点型,设备为 GPU
device = torch.device('cuda:0') if torch.cuda.is_available() else torch.device('cpu')
x = torch.ones([2, 4], dtype=torch.float64, device=device)
print(x)
## 输出:
## tensor([[ 1.0000, 1.0000, 1.0000, 1.0000],
## [ 1.0000, 1.0000, 1.0000, 1.0000]], dtype=torch.float64, device='cuda:0')
三、张量操作
(一)索引和切片
张量的内容可以使用 Python 的索引和切片符号来访问和修改:
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
## 访问张量元素
print(x[1][2]) # 输出:6
## 修改张量元素
x[0][1] = 8
print(x)
## 输出:
## tensor([[ 1, 8, 3],
## [ 4, 5, 6]])
(二)获取单个值
可以使用 torch.Tensor.item()
从张量中获取包含单个值的 Python 数字:
x = torch.tensor([[1]])
print(x.item()) # 输出:1
x = torch.tensor(2.5)
print(x.item()) # 输出:2.5
(三)自动微分
PyTorch 提供了强大的自动微分功能,可以通过设置 requires_grad=True
创建一个张量,以便 torch.autograd
对其进行记录操作以进行自动微分:
x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)
out = x.pow(2).sum()
out.backward()
print(x.grad)
## 输出:
## tensor([[ 2.0000, -2.0000],
## [ 2.0000, 2.0000]])
四、张量属性
(一)数据类型
torch.dtype
定义了张量中元素的数据类型。可以通过 dtype
属性获取张量的数据类型:
x = torch.tensor([1.0])
print(x.dtype) # 输出:torch.float32
(二)设备
torch.device
指定了张量所在的计算设备(CPU 或 GPU)。可以通过 device
属性获取张量的设备信息:
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
x = torch.tensor([1.0], device=device)
print(x.device) # 输出:cuda:0 或 cpu
(三)形状
torch.Size
表示张量的形状。可以通过 shape
属性获取张量的形状:
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(x.shape) # 输出:torch.Size([2, 3])
五、张量转换
(一)改变数据类型
可以使用 to()
方法改变张量的数据类型:
x = torch.tensor([1.0])
x = x.to(torch.int32)
print(x) # 输出:tensor([1], dtype=torch.int32)
(二)改变设备
可以使用 to()
方法将张量从 CPU 移动到 GPU 或反之:
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
x = torch.tensor([1.0])
x = x.to(device)
print(x) # 输出:tensor([1.0], device='cuda:0') 或 tensor([1.0])
六、实际案例
假设我们正在使用 PyTorch 构建一个简单的神经网络,用于对编程狮平台上的用户行为数据进行分类。我们需要对输入数据进行预处理,包括将数据转换为张量并进行归一化。以下是具体的代码示例:
import torch
import numpy as np
## 假设我们有用户行为数据
user_data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=np.float32)
## 将 NumPy 数组转换为 PyTorch 张量
tensor_data = torch.tensor(user_data)
## 对张量进行归一化
mean = tensor_data.mean(dim=0)
std = tensor_data.std(dim=0)
normalized_data = (tensor_data - mean) / std
print(normalized_data)
## 输出:
## tensor([[-1.2247, -1.2247, -1.2247],
## [ 0.0000, 0.0000, 0.0000],
## [ 1.2247, 1.2247, 1.2247]])
在这个案例中,我们首先将用户行为数据从 NumPy 数组转换为 PyTorch 张量,然后对张量进行归一化处理,使其适合用于神经网络的训练。
七、总结
张量是 PyTorch 中的核心数据结构,通过掌握张量的创建、操作、属性和转换,可以为深入学习深度学习奠定坚实的基础。在实际应用中,合理地使用张量操作可以高效地处理各种数据任务。无论是在编程狮平台学习深度学习,还是在 W3Cschool 上探索其他编程知识,理解张量的基本概念和操作都是非常重要的。
更多建议: