自学内容网 自学内容网

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

本节将介绍通过高级API更简洁地实现多层感知机。

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

模型

与softmax回归的简洁实现相比, 唯一的区别是我们添加了 2 2 2个全连接层(之前我们只添加了1个全连接层)。 第一层是隐藏层,它包含 256 256 256个隐藏单元,并使用了ReLU激活函数。 第二层是输出层。

net = nn.Sequential(nn.Flatten(),
                    nn.Linear(784, 256),
                    nn.ReLU(),
                    nn.Linear(256, 10))
# 定义一个顺序模型 net
# nn.Sequential 是 PyTorch 中的一个容器,用于按顺序包含多个模块
# 在这个容器中,第一个模块是 nn.Flatten(),它将输入的多维数据(通常是图片数据)展平为一维数组,这是传入全连接层前的必要步骤
# nn.Linear(784, 256)这是顺序模型的第二个模块。nn.Linear(784, 256) 创建一个全连接层(线性层),它的输入特征数为 784,输出特征数为 256。这里的 784 通常对应于 28x28 像素的展平图像数据。
# nn.ReLU()这是顺序模型中的第三个模块。nn.ReLU() 是一个激活函数,用于添加非线性,帮助网络学习复杂的模式。ReLU 函数的效果是将所有负值设为 0,而正值保持不变。
# nn.Linear(256, 10))这是顺序模型的最后一个模块。另一个全连接层,输入特征数为256,输出特征数为 10。这里的输出层通常用于多类分类任务中,其中每个节点代表一个类别的得分。

def init_weights(m): # 它接受一个参数 m,这个参数在后续将会是模型中的每个模块。
    if type(m) == nn.Linear: # 在 init_weights 函数内部,有一个条件判断,检查传入的模块 m 是否是 nn.Linear 类型(全连接层)
        nn.init.normal_(m.weight, std=0.01)
        # 如果 m 是一个线性层,这行代码将使用正态分布来初始化这个层的权重,其中标准差为 0.01。这种初始化方法有助于在训练初期保持激活和梯度的规模。

net.apply(init_weights);
# 最后,这行代码使用 apply 方法对 net 中的每个模块执行 init_weights 函数。这样,每个线性层的权重都会按照上述的正态分布进行初始化。

训练过程的实现与我们实现softmax回归时完全相同, 这种模块化设计使我们能够将与模型架构有关的内容独立出来。

batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=lr)
# 这行代码初始化一个优化器,这里使用的是随机梯度下降(SGD)算法。它将网络 net 的所有参数作为待优化参数,使用前面定义的学习率 lr。

train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

请添加图片描述

对于相同的分类问题,多层感知机的实现与softmax回归的实现相同,只是多层感知机的实现里增加了带有激活函数的隐藏层


原文地址:https://blog.csdn.net/weixin_45798993/article/details/140389489

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!