Class5多层感知机的从零开始实现

发布于:2025-07-05 ⋅ 阅读:(15) ⋅ 点赞:(0)

Class5多层感知机的从零开始实现

import torch
from torch import nn
from d2l import torch as d2l
# 设置批量大小为256
batch_size = 256
# 初始化训练集和测试集迭代器,每次训练一个批量
train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size)
# 构建一个单隐藏层的前馈神经网络(MLP)
# num_inoputs:输入维度(28*28展平)
# num_outputs:输出维度(10分类)
# num_hiddens:隐藏层神经元数量
num_inputs,num_outputs,num_hiddens = 784,10,256

# 第1个全连接层(输入->隐藏层)
# 创建大小为[784,256]的权重矩阵
# nn.Parameter:参与反向传播和优化器更新
# torch.randn:标准正态分布,均值为0,标准差为1
# *0.01:控制初始值大小
W1 = nn.Parameter(torch.randn(
    num_inputs,num_hiddens,requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens,requires_grad=True))

# 第2个全连接层(隐藏层->输出层)
# randn适合初始化权重,zeros适合初始化偏置
W2 = nn.Parameter(torch.randn(
    num_hiddens,num_outputs,requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_outputs,requires_grad=True))

# 参数统一存放到列表中
params = [W1,b1,W2,b2]
# 手动定义relu函数
def relu(X):
    # 创建一个形状相同的全0张量
    a = torch.zeros_like(X)
    # 逐元素返回最大值
    return torch.max(X,a)
# 定义前馈神经网络(MLP)
def net(X):
    # X设置为[batch_size,784]的二维矩阵
    X = X.reshape((-1,num_inputs))
    # 隐藏层线性变换+ReLU激活函数[batch_size,256]
    H = relu(X @ W1 + b1)
    # 返回输出层[batch_size,10]
    return (H @ W2 + b2)

# 添加伪装接口,使其兼容 d2l.train_ch3
net.train = lambda: None
net.eval = lambda: None
# 定义前馈神经网络(MLP)
def net(X):
    # X设置为[batch_size,784]的二维矩阵
    X = X.reshape((-1,num_inputs))
    # 隐藏层线性变换+ReLU激活函数[batch_size,256]
    H = relu(X @ W1 + b1)
    # 返回输出层[batch_size,10]
    return (H @ W2 + b2)

# 添加伪装接口,使其兼容 d2l.train_ch3
net.train = lambda: None
net.eval = lambda: None
# 定义交叉熵损失函数
loss = nn.CrossEntropyLoss(reduction='none')
# 设置训练轮数和学习率
num_epochs,lr = 10,0.1
# 定义随机梯度下降优化器
updater = torch.optim.SGD(params,lr=lr)
# 调用d2l的训练函数
d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,updater)

网站公告

今日签到

点亮在社区的每一天
去签到