【深度学习笔记】3_10 多层感知机的PyTorch实现

注:本文为《动手学深度学习》开源内容,仅为个人学习记录,无抄袭搬运意图

3.10 多层感知机的简洁实现

下面我们使用PyTorch来实现上一节中的多层感知机。首先导入所需的包或模块。

python 复制代码
import torch
from torch import nn
from torch.nn import init
import numpy as np
import sys
sys.path.append("..") 
import d2lzh_pytorch as d2l

3.10.1 定义模型

和softmax回归唯一的不同在于,我们多加了一个全连接层作为隐藏层。它的隐藏单元个数为256,并使用ReLU函数作为激活函数。

python 复制代码
num_inputs, num_outputs, num_hiddens = 784, 10, 256

#定义了神经网络的结构    
net = nn.Sequential(
        d2l.FlattenLayer(), #即把多维的输入一维化,常用在从卷积层到全连接层的过渡
        nn.Linear(num_inputs, num_hiddens), #这是一个全连接层(也叫线性层或密集层),它接受 num_inputs 个输入,并输出 num_hiddens 个结果。
        nn.ReLU(),  #这是一个激活函数层,它使用 ReLU(Rectified Linear Unit)函数作为激活函数。ReLU 函数将所有负值置为 0,而正值则保持不变。这有助于网络学习非线性关系。
        nn.Linear(num_hiddens, num_outputs),  #这是另一个全连接层,它接受 num_hiddens 个输入(即上一个隐藏层的输出),并输出 num_outputs 个结果。这个输出层通常不包含激活函数,因为最后的输出将被解释为每个类别的概率(通过 softmax 函数)。
        )

#初始化网络中所有参数的值
for params in net.parameters():
    init.normal_(params, mean=0, std=0.01)

net.parameters() 返回一个包含网络中所有参数(权重和偏置)的迭代器。

init.normal_ 是一个就地(in-place)操作,它会直接修改传入的参数张量(params),而不是创建一个新的张量。

mean=0, std=0.01 指定了正态分布(高斯分布)的均值和标准差,用于生成初始化值。这里使用了较小的标准差(0.01),意味着初始化值将接近于 0,但会有一定的随机性。这种初始化方法有助于网络更快地收敛,但也可能导致训练过程中的一些不稳定性。

3.10.2 读取数据并训练模型

我们使用与3.7节中训练softmax回归几乎相同的步骤来读取数据并训练模型。

注:由于这里使用的是PyTorch的SGD而不是d2lzh_pytorch里面的sgd,所以就不存在3.9节那样学习率看起来很大的问题了。

python 复制代码
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
loss = torch.nn.CrossEntropyLoss()

optimizer = torch.optim.SGD(net.parameters(), lr=0.5)

num_epochs = 5
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)

输出:

复制代码
epoch 1, loss 0.0030, train acc 0.712, test acc 0.744
epoch 2, loss 0.0019, train acc 0.823, test acc 0.821
epoch 3, loss 0.0017, train acc 0.844, test acc 0.842
epoch 4, loss 0.0015, train acc 0.856, test acc 0.842
epoch 5, loss 0.0014, train acc 0.864, test acc 0.818

小结

  • 通过PyTorch可以更简洁地实现多层感知机。

注:本节除了代码之外与原书基本相同,原书传送门

相关推荐
天疆说14 小时前
Ubuntu 26.04 下 Intel Meteor Lake 核显 + NPU 驱动配置与 PyTorch NPU 推理实测
linux·pytorch·ubuntu
AI即插即用15 小时前
即插即用系列 | IEEE TMI PLG-HN:原型学习引导的 CNN-Transformer 混合网络,攻克乳腺肿瘤分割难题
人工智能·深度学习·神经网络·学习·目标检测·cnn·transformer
Lee_jerome15 小时前
python神经网络编程入门(三十三)——多头注意力(Multi-Head Attention)
深度学习·nlp·transformer·注意力机制·多头注意力·self-attention
Hotchip_MEMS16 小时前
TWS耳机微米级较量:超薄LGA封装如何助力MEMS麦克风小型化?
人工智能·笔记·物联网·电脑
Ztt66666666616 小时前
金泉方壶四面端正,月白釉却把棱角放柔了
经验分享·笔记·其他·百度·微信公众平台
学习和思考16 小时前
非自动化专业如何自学PLC?我的6个月学习路线图
笔记·学习·自动化·学习方法
张小殊.17 小时前
LoongForge TAOT 训练方案,解决MoE EP不均衡问题
人工智能·python·深度学习·机器学习·ai
爱知菜17 小时前
Transformer vs Diffusion:为什么扩散模型更擅长捕捉细节?
人工智能·深度学习·transformer·扩散模型
疯狂打码的少年17 小时前
【数据结构】栈的应用:表达式求值(后缀表达式)
java·数据结构·笔记·算法
HiDev_17 小时前
【非标自动化】plc执行顺序问题、扫描周期问题
深度学习·算法·机器学习