【PyTorch学习-1】张量操作|自动求导|神经网络模块|优化器|数据加载与处理|GPU 加速...
【PyTorch学习-1】张量操作|自动求导|神经网络模块|优化器|数据加载与处理|GPU 加速…
【PyTorch学习-1】张量操作|自动求导|神经网络模块|优化器|数据加载与处理|GPU 加速…
文章目录
- 【PyTorch学习-1】张量操作|自动求导|神经网络模块|优化器|数据加载与处理|GPU 加速...
- 前言
- 1. PyTorch 常用库和模块
- 2. 张量操作(Tensor)
- 2.1 创建张量
- 2.2 张量的属性
- 2.3 张量的操作
- 2.4 张量与 NumPy 的转换
- 3. 自动求导(Autograd)
- 3.1 自动求导的基本操作
- 3.2 停止梯度追踪
- 3.3 计算图与梯度累积
- 4. 神经网络模块(torch.nn)
- 4.1 定义神经网络模型
- 4.2 常用层
- 4.3 损失函数
- 5. 优化器(torch.optim)
- 5.1 常用优化器
- 5.2 使用优化器
- 6. 数据加载与处理(torch.utils.data)
- 6.1 Dataset 类
- 6.2 DataLoader 类
- 7. GPU加速
- 7.1 检查是否支持 GPU
- 7.2 将模型和张量迁移到 GPU
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
前言
PyTorch 是一个非常流行的深度学习框架,提供了灵活和易用的 API,支持张量计算、自动求导、构建神经网络、GPU 加速等。下面是 PyTorch 常用的语法和函数的全面介绍,涵盖张量操作、神经网络构建、优化器、自动求导、数据处理等。
1. PyTorch 常用库和模块
- 1.
torch
:核心模块,包含张量操作、数学计算、自动求导等功能。 - 2.
torch.nn
:神经网络相关的模块,提供各种层(如卷积、全连接等)和常用损失函数。 - 3.
torch.optim
:优化器模块,用于定义优化算法,如 SGD、Adam 等。 - 4.
torch.autograd
:自动求导模块,用于实现自动反向传播计算。 - 5.
torch.utils.data
:数据处理模块,包含Dataset
和DataLoader
,用于处理和加载数据集。
2. 张量操作(Tensor)
张量是 PyTorch 的核心数据结构,类似于 NumPy 的数组,但可以在 GPU 上运行。
2.1 创建张量
- 通过
torch.tensor()
创建张量:
import torch
a = torch.tensor([1, 2, 3])
print(a) # tensor([1, 2, 3])
- 创建随机数张量:
rand_tensor = torch.rand(3, 4) # 3x4的随机数张量
print(rand_tensor)
2.2 张量的属性
shape
、dtype
和device
:
tensor = torch.rand(3, 4)
print(tensor.shape) # 输出张量的形状
print(tensor.dtype) # 数据类型
print(tensor.device) # 设备(CPU or GPU)
2.3 张量的操作
- 张量的数学运算,如加减乘除、矩阵乘法:
a = torch.tensor([1, 2])
b = torch.tensor([3, 4])
print(a + b) # 加法
print(a * b) # 乘法
print(a @ b.T) # 矩阵乘法
- 维度变换:
view()
、reshape()
和transpose()
用于改变张量形状:
x = torch.randn(4, 3)
y = x.view(3, 4) # 改变形状
print(y)
- 索引和切片:
x = torch.tensor([[1, 2], [3, 4], [5, 6]])
print(x[0]) # 选择第一行
print(x[:, 1]) # 选择第二列
print(x[1:, :]) # 选择从第二行开始的所有行
2.4 张量与 NumPy 的转换
- 从
torch.Tensor
转换为numpy.array
:
a = torch.ones(5)
b = a.numpy()
print(b)
- 从
numpy.array
转换为torch.Tensor
:
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(b)
3. 自动求导(Autograd)
PyTorch 中的 autograd
模块支持自动求导功能,即反向传播。
3.1 自动求导的基本操作
requires_grad
标志用于启用对张量的梯度跟踪:
x = torch.tensor([2.0, 3.0], requires_grad=True)
y = x ** 2 # y = [4, 9]
y.backward(torch.tensor([1.0, 1.0])) # 计算梯度
print(x.grad) # 输出 x 的梯度
3.2 停止梯度追踪
在推理阶段或者某些计算中,我们不需要计算梯度,可以使用 torch.no_grad()
或 detach()
。
- 使用
no_grad()
:
with torch.no_grad():y = model(x)
- 使用
detach()
:
x = torch.tensor([1.0], requires_grad=True)
y = x ** 2
z = y.detach() # z 不会计算梯度
3.3 计算图与梯度累积
- 反向传播时,PyTorch 会默认将梯度累积到
grad
属性中,因此在每次反向传播之前,需要清零梯度:
optimizer.zero_grad()
loss.backward()
optimizer.step()
4. 神经网络模块(torch.nn)
PyTorch 提供了 torch.nn
模块,用于定义神经网络的层和损失函数。
4.1 定义神经网络模型
torch.nn.Module
是所有神经网络的基类,通常需要在类的 __init__
方法中定义网络的层,在 forward()
方法中定义前向传播过程。
- 简单的前馈神经网络示例:
import torch.nn as nnclass SimpleNet(nn.Module):def __init__(self):super(SimpleNet, self).__init__()self.fc1 = nn.Linear(10, 50)self.fc2 = nn.Linear(50, 1)def forward(self, x):x = torch.relu(self.fc1(x))x = self.fc2(x)return xmodel = SimpleNet()
4.2 常用层
- 全连接层:
torch.nn.Linear
用于实现全连接层。
fc = nn.Linear(in_features=10, out_features=5)
- 卷积层:
torch.nn.Conv2d
用于实现二维卷积。
conv = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3)
-
激活函数:
ReLU:torch.nn.ReLU()
Sigmoid:torch.nn.Sigmoid()
Tanh:torch.nn.Tanh()
-
池化层:
torch.nn.MaxPool2d
和torch.nn.AvgPool2d
用于池化操作。
pool = nn.MaxPool2d(kernel_size=2, stride=2)
4.3 损失函数
PyTorch 提供了多种常用的损失函数,如均方误差(MSE)、交叉熵损失(CrossEntropy)。
- 均方误差(MSE)损失函数:
loss_fn = nn.MSELoss()
loss = loss_fn(predicted_output, target_output)
- 交叉熵损失函数:
loss_fn = nn.CrossEntropyLoss()
loss = loss_fn(predictions, labels)
5. 优化器(torch.optim)
PyTorch 的 torch.optim
模块提供了多种优化算法,用于更新模型的参数。
5.1 常用优化器
- 随机梯度下降(SGD):
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
- Adam 优化器:
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
5.2 使用优化器
- 在每个训练迭代中,使用优化器更新模型参数的典型步骤:
optimizer.zero_grad() # 清空梯度
loss.backward() # 反向传播
optimizer.step() # 更新参数
6. 数据加载与处理(torch.utils.data)
6.1 Dataset 类
torch.utils.data.Dataset
是数据集的抽象类,用户可以通过继承 Dataset
类来自定义数据集。
- 自定义数据集:
from torch.utils.data import Datasetclass CustomDataset(Dataset):def __init__(self, data, labels):self.data = dataself.labels = labelsdef __len__(self):return len(self.data)def __getitem__(self, index):return self.data[index], self.labels[index]
6.2 DataLoader 类
torch.utils.data.DataLoader
用于将 Dataset
打包成可迭代的数据批次,并支持多线程加载。
- 使用
DataLoader
:
from torch.utils.data import DataLoaderdataset = CustomDataset(data, labels)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
for batch in dataloader:inputs, targets = batch
7. GPU加速
PyTorch 提供了对 GPU 的支持,可以使用 CUDA 设备加速计算。
7.1 检查是否支持 GPU
print(torch.cuda.is_available())
7.2 将模型和张量迁移到 GPU
- 将张量迁移到 GPU:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
tensor = tensor.to(device)
- 将模型迁移到 GPU:
model = model.to(device)
通过这份全面的 PyTorch 语法和函数介绍,你可以更好地掌握 PyTorch 的基本用法以及常用的深度学习相关功能。