4-2多层感知机的从0开始实现

4-2多层感知机的从0开始实现

import torch
from torch import nn
from d2l import torch as d2l
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

1.初始化模型参数

  • w1:第一个全连接层的权重参数。

  • torch.randn(num_inputs, num_hiddens):生成一个形状为 (784, 256) 的随机张量,其元素从标准正态分布中抽取。

  • * 0.01:将随机张量的每个元素乘以 0.01,用于初始化权重。

  • nn.Parameter:将张量转换为参数,这样 PyTorch 就会自动跟踪其梯度

  • b1:第一个全连接层的偏置参数。

  • torch.zeros(num_hiddens):生成一个形状为 (256,) 的零张量。

  • nn.Parameter:将张量转换为参数,这样 PyTorch 就会自动跟踪其梯度

# 定义输入、输出和隐藏层的维度
num_inputs, num_outputs, num_hiddens = 784, 10, 256

# 初始化第一个全连接层的权重参数和偏置参数
w1 = nn.Parameter(torch.randn(num_inputs, num_hiddens, requires_grad = True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad = True))

# 初始化第二个全连接层的权重参数和偏置参数
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]

2.激活函数

def relu(x):
    a = torch.zeros_like(x)  #创建一个与张量 x 形状相同但所有元素值为 0 的张量
    return torch.max(x, a)

3.模型

代码解释

  • x:是一个张量,通常表示输入数据。
  • reshape:是 PyTorch 中用于改变张量形状的方法,不改变张量中的数据元素,只是重新排列它们的形状。
  • (-1, num_inputs):是一个元组,指定了重塑后的张量形状。
    • -1:表示该维度的大小由其他维度的大小自动推导。PyTorch 会根据张量的总元素数和其他维度的大小,自动计算出 -1 对应的维度大小。
    • num_inputs:表示重塑后的张量在第二个维度上的大小,通常对应于输入特征的数量。在这个上下文中,num_inputs 通常是 784,表示输入数据的特征维度(例如,28x28 的图像展平后的像素数量)。
def net(x):
    x = x.reshape((-1, num_inputs))
    H = relu(x@w1 + b1)  # 这里 “@” 代表矩阵乘法
    return (H@w2 + b2)

4.损失函数

loss = nn.CrossEntropyLoss(reduction = 'none')

5.训练

代码解释

  • torch.optim.SGD:是 PyTorch 中实现随机梯度下降(Stochastic Gradient Descent, SGD)优化算法的类。
  • params:是模型的参数列表,这些参数将被优化器更新。
  • lr:是学习率,用于控制参数更新的步长。
  • updater:是优化器的实例,它将负责在训练过程中更新模型的参数。

最后一句

  • d2l.train_ch3:是 D2L 库中提供的一个训练函数,用于训练神经网络。
  • net:是定义好的神经网络模型。
  • train_iter:是训练数据的迭代器,用于在训练过程中逐批次提供训练数据。
  • test_iter:是测试数据的迭代器,用于在训练过程中评估模型在测试集上的性能。
  • loss:是损失函数,用于计算模型的预测值与真实标签之间的差异。
  • num_epochs:是训练的总轮次。
  • updater:是优化器实例,用于更新模型的参数。
num_epochs, lr = 10, 0.1  #训练轮次,学习率
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

image

# 测试模型
d2l.predict_ch3(net, test_iter)

image

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