《PyTorch 实战宝典》重磅发布!

作者 : admin 本文共4279个字,预计阅读时间需要11分钟 发布时间: 2024-06-8 共5人阅读

Pytorch 是目前常用的深度学习框架之一,比起 TF 的框架环境配置不兼容,和 Keras 由于高度封装造成的不灵活,PyTorch 无论是在学术圈还是工业界,都相当占优势。

不夸张地说,掌握了 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()

上述例子中,yzout 都是通过对 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生成、图像描述和图像检索八大任务。

《PyTorch 实战宝典》重磅发布!插图(1)

NLP

包括RNN、LSTM、Transformer、BERT和GPT模型详解与应用,应用的任务有文本分类、机器翻译、命名体识别、QA问答和文章生成五大任务。

《PyTorch 实战宝典》重磅发布!插图(2)

LLM部分

包括4个LLM部署与代码分析和一个LLM行业应用——GPT Academic(GPT 学术优化),LLM包括国内开源的四大主流模型,Qwen、ChatGLM、Baichuan和Yi。

《PyTorch 实战宝典》重磅发布!插图(3)

本站无任何商业行为
个人在线分享 » 《PyTorch 实战宝典》重磅发布!
E-->