文章目录
PyTorch是一个广泛使用的深度学习框架,它提供了丰富的函数和方法来处理张量、构建和训练神经网络。以下是一些PyTorch中常用的函数和方法:
一、张量操作
-
创建张量
torch.tensor()
: 从数据(如列表或NumPy数组)创建张量。torch.full()
: 用指定值填充指定大小的张量。torch.zeros()
: 创建全零张量。torch.ones()
: 创建全一张量。torch.randn()
: 创建符合标准正态分布的随机张量。
-
张量形状和维度变换
view()
: 改变张量的形状,不改变其数据。t()
: 对二维张量进行转置。permute()
: 重新排列张量的维度。unsqueeze()
: 增加张量的维度。squeeze()
: 去除张量中维度为1的维度。transpose()
: 交换张量的两个维度。
-
张量连接和分割
cat()
: 沿指定维度连接张量。stack()
: 沿新维度连接张量。chunk()
: 将张量均匀分割成若干小块。split()
: 根据给定的分割大小或索引列表分割张量。
-
索引和切片
- 使用索引和切片操作来访问张量的元素或子张量。
-
数学运算
- 张量支持基本的数学运算,如加法、减法、乘法、除法等。
torch.sum()
: 计算张量的元素和。torch.mean()
: 计算张量的平均值。torch.max()
: 返回张量中的最大值及其索引。torch.min()
: 返回张量中的最小值及其索引。torch.topk()
: 返回张量中指定维度上前k个最大的元素。
二、神经网络构建和训练
-
参数初始化
- 使用
nn.init
模块中的函数(如normal_
)来初始化神经网络的参数。
- 使用
-
激活函数
ReLU()
: 线性整流函数。sigmoid()
: S型函数,将输入映射到(0,1)之间。tanh()
: 双曲正切函数,将输入映射到(-1,1)之间。
-
损失函数
nn.MSELoss()
: 均方误差损失。nn.CrossEntropyLoss()
: 交叉熵损失,常用于分类任务。nn.CTCLoss()
: 连接时序分类损失,用于处理序列数据。
-
优化器
optim.SGD()
: 随机梯度下降优化器。optim.Adam()
: Adam优化器,一种基于一阶和二阶矩估计的自适应学习率优化算法。
-
训练过程
- 使用
model.train()
和model.eval()
来切换模型的训练模式和评估模式。 - 使用
optimizer.zero_grad()
来清除之前的梯度。 - 使用
loss.backward()
来计算损失函数的梯度。 - 使用
optimizer.step()
来更新模型的参数。
- 使用
-
数据加载和预处理
- 使用
torchvision.transforms
模块中的函数(如ToTensor()
、Normalize()
等)来预处理图像数据。 - 使用
DataLoader
来加载数据集,支持批量处理、打乱数据顺序等功能。
- 使用
三、其他常用函数和方法
-
设备管理
torch.device()
: 指定张量或模型所在的设备(CPU或GPU)。torch.cuda.is_available()
: 检查CUDA是否可用。
-
随机数和种子
torch.manual_seed(seed)
: 为CPU设置随机数种子。torch.cuda.manual_seed_all(seed)
: 为所有GPU设置随机数种子。
-
梯度管理
tensor.detach()
: 返回一个从当前计算图中分离的新张量,不再需要计算梯度。tensor.requires_grad_()
: 就地设置张量是否需要计算梯度。with torch.no_grad()
: 临时禁用梯度计算,用于推理或评估模式。
-
模型保存和加载
- 使用
torch.save()
和torch.load()
来保存和加载模型参数。
- 使用
PyTorch的函数和方法非常丰富,上述列举的只是一些常用的部分。在实际应用中,根据具体需求选择合适的函数和方法是非常重要的。
示例代码
一、张量操作
import torch
print("----------创建张量----------")
# 从列表创建张量
tensor_from_list = torch.tensor([1, 2, 3, 4])
print(tensor_from_list)
# 创建全零张量
zeros_tensor = torch.zeros((2, 3))
print(zeros_tensor)
# 创建符合标准正态分布的随机张量
randn_tensor = torch.randn(2, 3)
print(randn_tensor)
print("----------张量形状和维度变换----------")
# 改变张量的形状
reshaped_tensor = tensor_from_list.view(-1, 2) # -1表示自动计算该维度大小
print(reshaped_tensor)
# 转置二维张量
transposed_tensor = reshaped_tensor.t()
print(transposed_tensor)
# 增加张量的维度
unsqueeze_tensor = tensor_from_list.unsqueeze(0) # 在第0维增加一个维度
print(unsqueeze_tensor.shape)
# 重新排列张量的维度
permute_1 = unsqueeze_tensor.permute(1, 0)
print(permute_1)
# 去除维度为1的维度
squeeze_tensor = unsqueeze_tensor.squeeze(0)
print(squeeze_tensor.shape)
print("----------张量连接----------")
# 沿第0维连接两个张量
tensor1 = torch.tensor([[1, 2], [3, 4]])
tensor2 = torch.tensor([[5, 6], [7, 8]])
concatenated_tensor = torch.cat((tensor1, tensor2), dim=0)
print(concatenated_tensor)
二、神经网络构建和训练
import torch.nn as nn
import torch.nn.functional as F
print("----------激活函数----------")
# 使用ReLU激活函数
relu = nn.ReLU()
input_tensor = torch.tensor([-1.0, 0.0, 1.0, 2.0])
output_tensor = relu(input_tensor)
print(output_tensor)
# 使用sigmoid激活函数
sigmoid = nn.Sigmoid()
output_tensor = sigmoid(input_tensor)
print(output_tensor)
print("----------损失函数和优化器----------")
# 假设有一个简单的线性模型
model = nn.Linear(2, 1) # 输入特征数为2,输出特征数为1
# 损失函数
criterion = nn.MSELoss()
# 优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 假设有一些输入和目标数据
inputs = torch.tensor([[1.0, 2.0], [2.0, 3.0]], requires_grad=True)
targets = torch.tensor([[2.0], [4.0]])
# 前向传播
outputs = model(inputs)
loss = criterion(outputs, targets)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(loss.item()) # 打印损失值
三、其他常用函数和方法
import torch
""" 设备管理 """
# 检查CUDA是否可用
if torch.cuda.is_available():
device = torch.device("cuda")
print("CUDA is available! Training on GPU.")
else:
device = torch.device("cpu")
print("CUDA is not available. Training on CPU.")
# 将模型移动到指定设备
model.to(device)
""" 模型保存和加载 """
# 保存模型参数
torch.save(model.state_dict(), "model.pth")
# 加载模型参数
model = nn.Linear(2, 1) # 需要先创建一个相同结构的模型
model.load_state_dict(torch.load("model.pth"))
model.eval() # 切换到评估模式
标签:常用,tensor,torch,张量,维度,PyTorch,print,函数
From: https://blog.csdn.net/weixin_73504499/article/details/143312638