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_ch3是d2l库中封装好的训练函数,用于训练神经网络模型。- 参数说明:
net:要训练的神经网络模型。train_iter:训练数据的迭代器。test_iter:测试数据的迭代器。loss:损失函数,用于计算模型输出与真实标签之间的损失值。num_epochs:训练的总轮数,即整个训练数据集会被完整遍历的次数。trainer:优化器,用于更新模型的参数。
这个函数会按照以下步骤进行训练:
- 在每个 epoch 中,从
train_iter中逐批次获取训练数据。 - 将数据输入模型
net,计算损失值loss。 - 使用优化器
trainer对模型参数进行更新。 - 在每个 epoch 结束时,使用
test_iter中的测试数据评估模型的性能(如准确率)。 - 输出每个 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)

本章主要使用高级API简洁地实现多层感知机
浙公网安备 33010602011771号