深度学习入门:PyTorch构建简单神经网络(Day33教程笔记)

今天继续学习深度学习相关知识,本篇笔记主要记录了如何使用 PyTorch 框架构建一个简单的神经网络,并通过鸢尾花数据集进行训练和测试的完整过程。内容涵盖从环境配置到模型训练的各个环节,适合刚接触深度学习的初学者。以下是详细笔记内容。

一、理论基础回顾

在开始实践之前,先回顾几个关键概念:

  • 梯度下降 :一种优化算法,用于最小化损失函数,通过迭代调整模型参数,逐步找到损失函数的最小值。
  • 激活函数 :为神经网络引入非线性因素,使模型能够学习复杂的非线性关系,常见的激活函数有 ReLU、Sigmoid 等。
  • 损失函数 :衡量模型预测结果与真实标签之间的差异,用于指导模型的训练过程,分类问题常用交叉熵损失函数。
  • 优化器 :负责更新模型参数,实现梯度下降过程,常见的优化器有 SGD(随机梯度下降)、Adam 等。
  • 神经网络 :一种模拟人脑神经元结构的计算模型,由输入层、隐藏层和输出层组成,具有强大的函数拟合能力。

二、环境配置

我们使用 PyTorch 框架来构建和训练神经网络,首先需要安装相关环境:

  1. 创建一个新的 Conda 环境,命名为 DL,指定 Python 版本为 3.8:

    • conda create -n DL python=3.8
    • 激活环境:conda activate DL
  2. 在环境中安装必要的包:

    • conda install jupyter (若 Conda 安装失败,可参考环境配置文档的 pip 安装方法)
    • pip install scikit-learn
  3. 安装 PyTorch:

    • 如果使用 GPU 加速(需要英伟达显卡支持 CUDA),需根据显卡的 CUDA 版本安装对应版本的 PyTorch。可在终端输入 nvidia - smi 查看显卡支持的 CUDA 版本和显存大小。
    • 通过以下代码检查 CUDA 是否可用及获取相关版本信息:
import torch

# 检查CUDA是否可用
if torch.cuda.is_available():
    print("CUDA可用!")
    # 获取可用的CUDA设备数量
    device_count = torch.cuda.device_count()
    print(f"可用的CUDA设备数量: {device_count}")
    # 获取当前使用的CUDA设备索引
    current_device = torch.cuda.current_device()
    print(f"当前使用的CUDA设备索引: {current_device}")
    # 获取当前CUDA设备的名称
    device_name = torch.cuda.get_device_name(current_device)
    print(f"当前CUDA设备的名称: {device_name}")
    # 获取CUDA版本
    cuda_version = torch.version.cuda
    print(f"CUDA版本: {cuda_version}")
else:
    print("CUDA不可用。")
 * 本教程先使用 CPU 训练,后续可根据实际需求安装 GPU 版本的 PyTorch。

三、数据准备

以鸢尾花数据集为例,该数据集具有 4 个特征和 3 个分类。

  1. 加载数据集并划分训练集和测试集:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征数据
y = iris.target  # 标签数据
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  1. 对数据进行归一化处理:
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test) #确保训练集和测试集是相同的缩放
  1. 将数据转换为 PyTorch 张量:
X_train = torch.FloatTensor(X_train)
y_train = torch.LongTensor(y_train)
X_test = torch.FloatTensor(X_test)
y_test = torch.LongTensor(y_test)

四、模型定义

定义一个简单的全连接神经网络模型,包含一个输入层(4 个神经元,对应 4 个特征)、一个隐藏层(10 个神经元)和一个输出层(3 个神经元,对应 3 个分类)。

import torch
import torch.nn as nn
import torch.optim as optim

class MLP(nn.Module): # 定义一个多层感知机(MLP)模型,继承父类nn.Module
    def __init__(self): # 初始化函数
        super(MLP, self).__init__() # 调用父类的初始化函数

        self.fc1 = nn.Linear(4, 10)  # 输入层到隐藏层
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(10, 3)  # 隐藏层到输出层

    def forward(self, x):
        out = self.fc1(x)
        out = self.relu(out)
        out = self.fc2(out)
        return out

# 实例化模型
model = MLP()

其他写法

也可以在前向传播时直接调用激活函数,而不单独定义一个激活函数层:

class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.fc1 = nn.Linear(4, 10)
        self.fc2 = nn.Linear(10, 3)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

五、模型训练(CPU 版本)

  1. 定义损失函数和优化器:
# 分类问题使用交叉熵损失函数
criterion = nn.CrossEntropyLoss()

# 使用随机梯度下降优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)

# # 使用自适应学习率的优化器 Adam
# optimizer = optim.Adam(model.parameters(), lr=0.001)
  1. 循环训练模型:
# 训练模型
num_epochs = 20000 # 训练的轮数

# 用于存储每个 epoch 的损失值
losses = []

for epoch in range(num_epochs): # range 是从 0 开始,所以 epoch 是从 0 开始
    # 前向传播
    outputs = model.forward(X_train)   # 显式调用 forward 函数
    # outputs = model(X_train)  # 常见写法隐式调用 forward 函数,其实是用了 model 类的 __call__ 方法
    loss = criterion(outputs, y_train) # output 是模型预测值,y_train 是真实标签

    # 反向传播和优化
    optimizer.zero_grad() # 梯度清零,因为 PyTorch 会累积梯度,所以每次迭代需要清零
    loss.backward() # 反向传播计算梯度
    optimizer.step() # 更新参数

    # 记录损失值
    losses.append(loss.item())

    # 打印训练信息
    if (epoch + 1) % 100 == 0: # range 是从 0 开始,所以 epoch + 1 是从当前 epoch 开始,每 100 个 epoch 打印一次
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

注意事项

如果你重新运行上面这段训练循环,模型参数、优化器状态和梯度会继续保留,导致训练结果叠加,模型参数和优化器状态(如动量、学习率等)不会被重置。这会导致训练从之前的状态继续,而不是从头开始。

六、结果可视化

训练完成后,可视化损失曲线,观察训练过程中的损失变化情况:

import matplotlib.pyplot as plt
# 可视化损失曲线
plt.plot(range(num_epochs), losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss over Epochs')
plt.show()

通过上述步骤,我们使用 PyTorch 框架成功构建并训练了一个简单的神经网络模型来解决鸢尾花分类问题。这个过程展示了深度学习模型训练的基本流程,包括环境配置、数据准备、模型定义、训练和结果可视化等环节。在实际应用中,可以根据具体问题调整模型结构、超参数以及数据预处理方式,以提高模型性能和泛化能力。
浙大疏锦行

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐