在本文中,我们将探讨深度学习及其框架PyTorch。PyTorch简洁易用、功能强大,是深度学习入门的首选框架。

一、PyTorch介绍

PyTorch是一个灵活、高效、易上手的深度学习框架,由Facebook开源,它广泛用于计算机视觉、自然语言处理等领域。

PyTorch的基本功能涵盖了构建和训练神经网络的所有操作,如张量、自动微分(Autograd)、神经网络模块、数据集、优化器、GPU支持。

除此之外,PyTorch还有丰富的库支持,比如Torchvision(用于图像处理)和Torchtext(用于文本处理),这些库可以帮助我们快速实现复杂任务。

PyTorch中的主要模块

PyTorch由多个模块组成,每个模块负责不同的功能,这些模块帮助我们实现从数据处理、模型构建到训练优化的完整流程。这些模块包括:

  • torch:PyTorch的核心模块,提供了张量(Tensor)运算、随机数生成等基本功能,是其他模块的基础。

  • torch.autograd:自动微分模块,支持自动计算梯度,主要用于神经网络的反向传播。

  • torch.nn:神经网络模块,提供了各种神经网络层、激活函数、损失函数等。

  • torch.optim:优化模块,提供多种优化算法如SGD、Adam等,用于神经网络的训练和优化。

  • torch.utils.data:数据处理模块,包含DatasetDataLoader等类,用于处理数据集并进行批量加载。

  • torch.cuda:GPU支持模块,提供与GPU相关的操作,如将张量移动到GPU上以加速计算。

  • torchvision:图像处理模块(扩展库),专为计算机视觉任务提供数据集、预训练模型和图像预处理工具。

  • torchtext:自然语言处理模块(扩展库),提供文本数据集、词向量和常见的文本处理工具。

  • torchaudio:音频处理模块(扩展库),用于音频数据的加载、转换和特征提取。

  • torch.jit:模型序列化与部署模块。

PyTorch中常用的类和函数

以下是PyTorch中一些常用的类与函数(可结合上一部分中相应的模块学习):

1、torch.Tensor:张量,是所有数据的基础。无论是输入数据、模型参数还是中间计算结果,都是通过张量来表示的,张量可以是一维、二维或多维的。

2、torch.nn.Module:神经网络模块,是所有神经网络模块的基类,用户自定义模型时通常继承此类。常用层有:

  • torch.nn.Linear(in_features, out_features):全连接层。

  • torch.nn.Conv2d(in_channels, out_channels, kernel_size):卷积层。

  • torch.nn.ReLU():ReLU 激活函数。

3、损失函数(torch.nn.functional),如:

  • torch.nn.CrossEntropyLoss():用于分类任务的交叉熵损失函数。

  • torch.nn.MSELoss():用于回归任务的均方误差损失函数。

4、优化器(torch.optim),如:

  • torch.optim.SGD(params, lr):随机梯度下降优化器。

  • torch.optim.Adam(params, lr):Adam优化器。

优化器常用的函数有包括:

  • optimizer.zero_grad():清零梯度。

  • optimizer.step():更新模型参数。

5、数据加载(torch.utils.data

  • torch.utils.data.Dataset:自定义数据集的基类。

  • torch.utils.data.DataLoader:用于批量加载数据,支持多线程。

6、自动微分(autograd)

  • tensor.backward():计算张量的梯度。

7、设备支持

  • torch.device:用于指定计算设备(CPU 或 GPU)。

  • tensor.to(device):将张量移动到指定设备。

在进行神经网络构建和训练时,我们会经常用到上面这些类或函数,因此必须熟悉。

二、深度学习与神经网络

深度学习是机器学习的一个分支,相比传统的机器学习,深度学习模型一般比较复杂,深度学习采用的模型主要是神经网络模型,这是因为神经网络能够很好地模拟复杂的非线性关系。

在这里插入图片描述

深度学习模型通常包含多个层和大量的参数。所谓“深度”指的是神经网络的层数。深度学习使用多层的神经网络来进行计算和学习。神经网络的构成一般包括输入层、隐藏层和输出层:

  • 输入层(Input Layer):神经网络的第一层,负责接收外部数据,神经元代表输入数据的一个特征或属性,将其传递给下一层(隐藏层)。

  • 隐藏层(Hidden Layer):位于输入层和输出层之间,主要负责神经网络学习和数据处理。隐藏层提取数据的特征,并逐层将处理结果传递给下一个隐藏层或输出层。之所以叫隐藏层,是因为其内部处理过程对外是“隐藏”的。

  • 输出层(Output Layer):神经网络的最后一层,输出最终结果。根据网络前几层的处理结果,生成最终的预测或分类。每个神经元代表一种输出类别或预测值。

在这里插入图片描述

神经网络的基本单位是神经元。神经元接收输入,进行处理后输出结果,多个神经元组成网络层,协同工作以完成复杂的任务。

在这里插入图片描述

三、示例

接下来,我们通过示例来具体了解PyTorch的应用以及深度学习模型的构建。

在示例中,我们使用鸢尾花数据集。鸢尾花数据集用于分类,它包含150个样本和有3个标签。

编码前,如果还未安装PyTorch,可通过pip install torch命令安装。

首先我们添加引用、加载数据集、并对数据作标准化处理。

代码如下:

import torch  
import torch.nn as nn  
import torch.optim as optim  
from sklearn.datasets import load_iris  
from sklearn.model_selection import train_test_split  
from sklearn.preprocessing import StandardScaler  
  
# 1. 加载 Iris 数据集  
iris = load_iris()  
data, target = iris['data'], iris['target']  
  
# 2. 将数据分为训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=42)  
  
# 3. 标准化特征数据  
scaler = StandardScaler()  
X_train = scaler.fit_transform(X_train)  
X_test = scaler.transform(X_test)  

上面我们引用了PyTorch的核心模块torch、神经网络模块torch.nn以及优化器模块torch.optim,除了这些,我们还引用了Scikit-learn库中的鸢尾花数据集、train_test_split函数和标准化类StandardScaler

接着,我们需要将数据转化为PyTorch张量,前面提到过,张量是PyTorch进行数据处理的核心数据结构。

# 4. 将数据转换为PyTorch向量  
X_train = torch.tensor(X_train, dtype=torch.float32)  
X_test = torch.tensor(X_test, dtype=torch.float32)  
y_train = torch.tensor(y_train, dtype=torch.long)  
y_test = torch.tensor(y_test, dtype=torch.long)  

之后,通过派生nn.Module类定义神经网络模型,在派生的类中,我们可以定义隐藏层与输出层,并定义激活函数。

# 5. 定义神经网络模型  
class IrisNet(nn.Module):  
    def __init__(self):  
        super().__init__()  
        # 定义第一个全连接层,将输入的4维特征映射到10维  
        self.fc1 = nn.Linear(4, 10)  
        # 定义第二个全连接层,将10维映射到3维输出(对应3个分类)  
        self.fc2 = nn.Linear(10, 3)  
  
    def forward(self, x):  
        # 输入数据通过第一个全连接层  
        x = self.fc1(x)  
        # 通过ReLU激活函数增加非线性特性  
        x = torch.relu(x)  
        # 通过第二个全连接层,得到3维输出  
        x = self.fc2(x)  
        return x  

上面代码中,我们通过nn.Linear类创建了两层,分别是一个隐藏层和一个输出层。nn.Linear用于定义全连接层,它有两个主要参数,分别是输入特征的维度和输出特征的维度。

第一层(fc1)的输入维度为4,对应每个样本的4个特征,输出维度设置为10,我们希望将这些特征映射到一个10维向量空间,从而学习到更复杂的特征表示。

通过第一层后,输出会经过ReLU激活函数(见forward函数)。ReLU将隐藏层输出中的负值置为0,正值保持不变,使网络能够从数据中捕捉更丰富的特征。

第二层(fc2)输入的维度是10(对应前一层的输出维度),输出的维度是3,用于分类3个类别,生成3个类别的预测结果。

在这里插入图片描述

这两层共同组成了一个简单的神经网络(更准确地说,是前馈神经网络),实现了将4维输入映射到3维输出。

接下来,我们创建模型并定义损失函数和优化器,代码如下:

# 6. 创建模型,定义损失函数和优化器  
model = IrisNet()  
loss_fn = nn.CrossEntropyLoss()  # 交叉熵损失  
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)  

损失函数用于计算模型预测与预期结果之间的差异,这里我们使用交叉熵损失。

交叉熵损失的特点是适用于分类任务,并且已经集成了Softmax操作。Softmax能将输出层的结果(logits)转换为概率分布,这些概率值在0到1之间且总和为1,Softmax适合多类别分类问题。

接下来,我们进行100轮训练:

epochs = 100  
  
# 7. 训练模型  
for epoch in range(epochs):  # 训练100个 epoch  
    # 梯度清零  
    optimizer.zero_grad()  
  
    # 前向传播  
    outputs = model(X_train)  
  
    # 计算损失  
    loss = loss_fn(outputs, y_train)  
  
    # 反向传播  
    loss.backward()  
  
    # 更新参数  
    optimizer.step()  
    if (epoch + 1) % 10 == 0:  
        print(f"Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}")  
          
print("训练完成")  

每轮训练前,先进行梯度清零,确保清除之前计算的梯度,避免累加导致错误地更新参数。

前向传播则是将输入数据通过神经网络计算输出,得到模型的预测结果。

经过前向传播得到结果后,结合预期结果使用损失函数计算误差,并进行反向传播。反向传播会根据损失函数计算梯度,通过链式法则将误差从输出层传播回输入层,以更新模型参数。

最后,每10次输出损失,以便我们观察并作出调整。

至此,代码输出:

Epoch [10/100], Loss: 0.9358  
Epoch [20/100], Loss: 0.7051  
Epoch [30/100], Loss: 0.5493  
Epoch [40/100], Loss: 0.4671  
Epoch [50/100], Loss: 0.4176  
Epoch [60/100], Loss: 0.3820  
Epoch [70/100], Loss: 0.3542  
Epoch [80/100], Loss: 0.3313  
Epoch [90/100], Loss: 0.3113  
Epoch [100/100], Loss: 0.2934  
训练完成  

模型训练完成后,在测试集上进行评估:

# 8. 在测试集上评估模型  
with torch.no_grad():  # 测试时不需要计算梯度  
    outputs = model(X_test)  
    _, predicted = torch.max(outputs, 1)  
    accuracy = (predicted == y_test).sum().item() / len(y_test)  
  
print(f'测试集上的准确率: {accuracy * 100:.2f}%')  

输出结果:

测试集上的准确率: 93.33%  

如果准确率没达标,我们可以调整超参数,比如学习率、尝试使用其他优化器,也可以尝试增加隐藏层的神经元数量或使用更多隐藏层。

最后,我们使用模型对新数据进行预测:

# 9. 预测新样本数据  
def predict_sample(model, scaler, sample):  
    # 对新样本数据进行标准化  
    sample = scaler.transform([sample])  
    sample = torch.tensor(sample, dtype=torch.float32)  
  
    # 预测结果  
    model.eval()  # 设置模型为评估模式  
    with torch.no_grad():  
        output = model(sample)  
        # 返回张量output在指定维度(第1维度)上的最大值和对应的索引  
        _, predicted_class = torch.max(output, 1)  
        return predicted_class.item()  
  
  
# 预测  
new_sample = [5.1, 3.5, 1.4, 0.2]  
predicted_class = predict_sample(model, scaler, new_sample)  
print(f"预测新样本 {new_sample} 的分类结果是: {iris['target_names'][predicted_class]}")  

输出结果:

预测新样本 [5.1, 3.5, 1.4, 0.2] 的分类结果是: setosa  

需要注意两点:

第一,新样本需要进行标准化(使用之前的StandardScaler对象标准化),StandardScaler对象记录了训练数据的均值和标准差,新样本的标准化依赖于训练数据的均值和标准差。

第二,预测阶段需要将模型设置为评估模式(使用model.eval()),且预测阶段不需要反向传播以及梯度计算,需使用with torch.no_grad()禁用梯度计算。

至此,我们完成了一个完整的PyTorch神经网络训练与预测流程。

四、总结

本文介绍了深度学习框架PyTorch以及如何使用它构建和训练神经网络模型。PyTorch易用、灵活、强大的特点使它成为深度学习的首选框架。无论是处理复杂的AI任务,还是快速实验和模型搭建,PyTorch都能胜任。通过本文的介绍,相信大家都能够快速了解并上手PyTorch。


五、如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 2024行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费

Logo

更多推荐