4-3多层感知机简洁实现

4-3多层感知机简洁实现

import torch
from torch import nn
from d2l import torch as d2l

1.初始化模型

定义网络模型

  • nn.Sequential 是 PyTorch 中用于构建顺序模型的容器,它会按照定义的顺序将多个层组合在一起。
  • nn.Flatten():将输入数据从多维张量展平为一维张量。例如,对于输入大小为 [batch_size, 28, 28](如 MNIST 数据集的图像),经过 nn.Flatten() 后,会变为 [batch_size, 784]
  • nn.Linear(784, 256):全连接层,将输入的 784 个特征映射到 256 个特征。其中,784 是输入特征数量,256 是输出特征数量。
  • nn.ReLU():ReLU 激活函数,用于引入非线性,使模型能够学习更复杂的特征。
  • nn.Linear(256, 10):第二个全连接层,将 256 个特征映射到 10 个输出类别(例如 MNIST 数据集的 10 个数字类别)。

权重初始化函数

  • 这是一个自定义的权重初始化函数,用于对模型中的权重进行初始化。
  • m 是传入的模块(如全连接层 nn.Linear)。
  • if type(m) == nn.Linear::判断当前模块是否是全连接层。如果是,则对其权重进行初始化。
  • nn.init.normal_(m.weight, std=0.01):使用正态分布初始化权重,均值为 0,标准差为 0.01。m.weight 是全连接层的权重参数。
# 定义一个简单的神经网络模型
net = nn.Sequential(nn.Flatten(),  # 将输入数据展平为一维张量
                    nn.Linear(784, 256),  # 第一个全连接层:输入特征数为784,输出特征数为256
                    nn.ReLU(), # ReLU激活函数,引入非线性
                    nn.Linear(256, 10)) # 第二个全连接层:输入特征数为256,输出特征数为10(分类任务的类别数)
# 定义权重初始化函数
def init_weights(m):
    if type(m) == nn.Linear:  # 判断当前模块是否是全连接层
        nn.init.normal_(m.weight, std=0.01)  # 使用正态分布初始化权重,标准差为0.01

# 应用权重初始化函数到整个网络
net.apply(init_weights);

2.定义中间层

超参数设置

  • batch_size = 256:定义了每次训练时使用的批量大小(batch size),即每次训练时输入模型的数据样本数量。批量大小为 256 意味着每次训练时会从数据集中抽取 256 个样本进行一次前向传播和反向传播。
  • lr = 0.1:定义了学习率(learning rate),即优化器在每次迭代时更新模型参数的步长。学习率为 0.1 表示在每次参数更新时,参数的变化量是梯度的 0.1 倍。
  • num_epochs = 10:定义了训练的总轮数(epochs),即整个数据集会被完整遍历 10 次进行训练。

损失函数

  • nn.CrossEntropyLoss 是 PyTorch 中用于分类任务的交叉熵损失函数。
  • reduction='none':指定损失函数的输出形式。'none' 表示不对损失值进行任何聚合,返回每个样本的损失值。这样可以方便地对每个样本的损失进行单独分析或处理(例如在自定义损失计算或权重调整时)。

优化器

  • torch.optim.SGD 是 PyTorch 中的随机梯度下降(Stochastic Gradient Descent, SGD)优化器。
  • net.parameters():获取神经网络模型 net 中的所有可训练参数。
  • lr=lr:将之前定义的学习率 lr=0.1 传递给优化器,用于控制参数更新的步长。
# 设置训练过程中的超参数
batch_size, lr, num_epochs = 256, 0.1, 10  # 批量大小、学习率、训练轮数

# 定义损失函数
loss = nn.CrossEntropyLoss(reduction='none')   #使用交叉熵损失函数,返回每个样本的损失值

# 定义优化器
trainer = torch.optim.SGD(net.parameters(), lr=lr) # 使用随机梯度下降优化器,学习率为lr

3.训练模型

数据加载

  • d2l.load_data_fashion_mnist(batch_size)d2l 库中用于加载 Fashion MNIST 数据集的函数。
  • batch_size 是之前定义的批量大小,表示每次从数据集中抽取的样本数量。
  • train_iter 是训练数据的迭代器,用于在训练过程中逐批次提供训练数据。
  • test_iter 是测试数据的迭代器,用于在训练过程中评估模型在测试集上的性能。

模型训练

  • d2l.train_ch3d2l 库中封装好的训练函数,用于训练神经网络模型。
  • 参数说明:
    • net:要训练的神经网络模型。
    • train_iter:训练数据的迭代器。
    • test_iter:测试数据的迭代器。
    • loss:损失函数,用于计算模型输出与真实标签之间的损失值。
    • num_epochs:训练的总轮数,即整个训练数据集会被完整遍历的次数。
    • trainer:优化器,用于更新模型的参数。

这个函数会按照以下步骤进行训练:

  1. 在每个 epoch 中,从 train_iter 中逐批次获取训练数据。
  2. 将数据输入模型 net,计算损失值 loss
  3. 使用优化器 trainer 对模型参数进行更新。
  4. 在每个 epoch 结束时,使用 test_iter 中的测试数据评估模型的性能(如准确率)。
  5. 输出每个 epoch 的训练损失和测试准确率等信息。
# 加载 Fashion MNIST 数据集
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

# 调用封装好的训练函数
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

image


posted @ 2025-06-20 13:08  小西贝の博客  阅读(48)  评论(0)    收藏  举报