Pytorch 是目前常用的深度学习框架之一,比起 TF 的框架环境配置不兼容,和 Keras 由于高度封装造成的不灵活,PyTorch 无论是在学术圈还是工业界,都相当占优势。
不夸张地说,掌握了 PyTorch ,就相当于走上了深度学习、机器学习、大模型的快车道。
它凭借着对初学者的友好性、灵活性,发展迅猛,也深受学生党的喜爱。
但是目前市面上的Pytorch学习资料并不系统,且很多资源都非中文版,从业者的学习门槛比较高。
整体概览
部分内容
下面是在 PyTorch 中创建张量和进行基本操作的详细介绍。
1. 张量的创建
从 Python 列表或 NumPy 数组创建张量:
import torch
import numpy as np
# 从列表创建张量
tensor_from_list = torch.tensor([1, 2, 3])
# 从 NumPy 数组创建张量
numpy_array = np.array([4, 5, 6])
tensor_from_numpy = torch.tensor(numpy_array)
使用特定值创建张量:
# 创建全零张量
zeros_tensor = torch.zeros((3, 4))
# 创建全一张量
ones_tensor = torch.ones((2, 2))
# 创建指定范围的张量
range_tensor = torch.arange(0, 10, 2)
# 创建均匀分布的张量
uniform_tensor = torch.rand((3, 3))
# 创建正态分布的张量
normal_tensor = torch.randn((2, 2))
使用特定形状的张量:
# 创建未初始化的张量
uninitialized_tensor = torch.empty((2, 2))
# 创建与现有张量相同形状的张量
like_tensor = torch.ones_like(zeros_tensor)
2. 张量的基本操作
索引和切片:
# 获取张量中的特定元素
element = tensor_from_list[1]
# 切片操作
sliced_tensor = tensor_from_list[1:3]
张量的形状操作:
# 获取张量的形状
shape = tensor_from_list.shape
# 改变张量的形状
reshaped_tensor = tensor_from_list.view(1, 3)
# 转置张量
transposed_tensor = tensor_from_list.t()
数学运算:
# 加法
sum_tensor = tensor_from_list + tensor_from_numpy
# 乘法
product_tensor = torch.matmul(zeros_tensor, ones_tensor)
# 广播操作
broadcasted_tensor = tensor_from_list * 2
这些功能使得 PyTorch 成为深度学习领域的一流选择,因为它提供了方便、灵活且高效的工具来处理张量和构建神经网络模型。
自动求导
PyTorch中的自动求导(Autograd)允许用户自动计算张量的梯度,而无需手动编写反向传播算法。
Autograd的核心是计算图(computational graph),它记录了计算张量的操作,并在需要时能够生成梯度。
1. 张量的requires_grad
属性
在创建张量时,可以通过设置requires_grad
属性为True来指示PyTorch跟踪对该张量的操作,从而构建计算图。
import torch
# 创建一个需要梯度的张量
x = torch.tensor([1.0, 2.0], requires_grad=True)
2. 张量操作和计算图
一旦设置了requires_grad=True
,PyTorch将自动追踪对该张量的所有操作,构建一个计算图。这个计算图记录了张量之间的关系和操作。
y = x + 2
z = y * y * 3
out = z.mean()
上述例子中,y
、z
和 out
都是通过对 x
进行操作得到的新张量,这些操作构成了计算图。
3. 计算梯度
一旦有了计算图,可以调用 backward()
方法计算梯度。梯度计算完成后,可以通过张量的 grad
属性获取梯度值。
out.backward() # 计算梯度
# 获取梯度
print(x.grad)
4. 阻止梯度追踪
在某些情况下,可能需要阻止PyTorch对某些操作的梯度追踪,可以使用 torch.no_grad()
上下文管理器或者在张量上使用 .detach()
方法。
with torch.no_grad():
# 不追踪梯度的操作
y = x + 2
# 或者
z = y.detach()
5. 使用with torch.autograd.set_grad_enabled(False):
控制梯度计算
在某些情况下,可能需要在一段代码中关闭梯度计算,可以使用上下文管理器 torch.autograd.set_grad_enabled
。
with torch.autograd.set_grad_enabled(False):
# 在此处的操作不会被追踪,也不会计算梯度
y = x + 2
6. 示例:使用自动求导进行优化
import torch.optim as optim
# 定义一个变量并设置需要梯度
x = torch.tensor([1.0, 2.0], requires_grad=True)
# 定义一个优化器(例如梯度下降)
optimizer = optim.SGD([x], lr=0.01)
# 在循环中执行优化步骤
for _ in range(100):
y = x + 2
loss = y[0] * y[1] # 这里定义了一个简单的损失函数
optimizer.zero_grad() # 清零梯度
loss.backward() # 计算梯度
optimizer.step() # 更新参数
# 查看优化后的结果
print(x)
这个例子演示了如何使用自动求导来执行优化步骤,通过反向传播计算梯度并使用优化器更新参数。
总体而言,PyTorch中的自动求导提供了一个方便的工具,使得深度学习的模型训练变得更加简单和高效。
神经网络层
在 PyTorch 中,nn.Module
是构建神经网络模型的基础类。nn.Module
提供了一个模块化和灵活的方式来组织复杂的神经网络结构。通过继承 nn.Module
类,可以创建自定义的神经网络层、模型或整个神经网络。
1. 创建一个简单的神经网络层
import torch
import torch.nn as nn
class SimpleLayer(nn.Module):
def __init__(self, input_size, output_size):
super(SimpleLayer, self).__init__()
self.linear = nn.Linear(input_size, output_size)
self.relu = nn.ReLU()
def forward(self, x):
x = self.linear(x)
x = self.relu(x)
return x
上面的例子中,SimpleLayer
继承自 nn.Module
,并定义了一个包含线性层(nn.Linear
)和激活函数 ReLU 的简单神经网络层。forward
方法定义了前向传播的计算过程。
2. 构建更复杂的模型
可以通过将多个神经网络层组合在一起构建更复杂的模型。下面是一个简单的多层感知机 (MLP) 的例子:
class MLP(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(MLP, self).__init__()
self.layer1 = SimpleLayer(input_size, hidden_size)
self.layer2 = SimpleLayer(hidden_size, output_size)
def forward(self, x):
x = self.layer1(x)
x = self.layer2(x)
return x
3. 模块的嵌套和子模块
nn.Module
支持嵌套和包含其他 nn.Module
实例,这有助于构建更复杂的神经网络。子模块会自动跟踪其参数和梯度。
class ComplexModel(nn.Module):
def __init__(self):
super(ComplexModel, self).__init__()
self.layer1 = SimpleLayer(10, 20)
self.layer2 = MLP(20, 30, 5)
def forward(self, x):
x = self.layer1(x)
x = self.layer2(x)
return x
4. 访问模块的参数
通过 named_parameters()
或 parameters()
方法可以访问模块中的所有参数。
model = ComplexModel()
for name, param in model.named_parameters():
print(f"{name}: {param.size()}")
5. 模型的保存和加载
可以使用 torch.save
保存模型的状态字典,并使用 torch.load
加载模型。
# 保存模型
torch.save(model.state_dict(), 'model.pth')
# 加载模型
loaded_model = ComplexModel()
loaded_model.load_state_dict(torch.load('model.pth'))
获取方式
技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。
成立了 PyTorch 算法技术交流群,相关资料、技术交流&答疑,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。
方式①、微信搜索公众号:机器学习社区,后台回复:PyTorch 实战宝典
方式②、添加微信号:mlc2040,备注:来自CSDN + PyTorch 实战宝典
通俗易懂讲解大模型系列
- 《大模型面试宝典》(2024版) 正式发布!
- 《大模型实战宝典》(2024版) 正式发布!
精彩项目
CV八大项目
包括图像分类、图像分割、目标检测、目标跟踪、GAN生成、Diffusion生成、图像描述和图像检索八大任务。
NLP
包括RNN、LSTM、Transformer、BERT和GPT模型详解与应用,应用的任务有文本分类、机器翻译、命名体识别、QA问答和文章生成五大任务。
LLM部分
包括4个LLM部署与代码分析和一个LLM行业应用——GPT Academic(GPT 学术优化),LLM包括国内开源的四大主流模型,Qwen、ChatGLM、Baichuan和Yi。