找回密码
 立即注册
首页 业界区 业界 多层感知机的从零开始实现

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

杼氖 2025-9-26 10:38:20
博客地址:https://www.cnblogs.com/zylyehuo/
基本设置
  1. import torch
  2. from torch import nn
  3. from d2l import torch as d2l
复制代码
  1. batch_size = 256
  2. train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
复制代码
初始化模型

为什么不直接使用 Tensor 而是用 nn.Parameter 函数将其转换为 parameter呢?


  • nn.Parameter 函数会向宿主模型注册参数,从而在参数优化的时候可以自动一起优化。
  • 此外,由于内存在硬件中的分配和寻址方式,选择2的若干次幂作为层宽度会使计算更高效。
  1. num_inputs, num_outputs, num_hiddens = 784, 10, 256
  2. # 输入层参数
  3. W1 = nn.Parameter(torch.randn(
  4.     num_inputs, num_hiddens, requires_grad=True) * 0.01)
  5. b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
  6. # 隐藏层参数
  7. W2 = nn.Parameter(torch.randn(
  8.     num_hiddens, num_outputs, requires_grad=True) * 0.01)
  9. b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
  10. params = [W1, b1, W2, b2]
复制代码
激活函数
  1. def relu(X):  # 自定义 ReLU 函数
  2.     a = torch.zeros_like(X)
  3.     return torch.max(X, a)
复制代码
模型

由于忽略了空间结构,我们调用 reshape 函数将每个二维图像转换成长度为 num_inputs 的向量
  1. def net(X):
  2.     X = X.reshape((-1, num_inputs))
  3.     H = relu(X @ W1 + b1)  # 输入层运算+激活 这里“@”代表矩阵乘法
  4.     return (H @ W2 + b2)  # 隐藏层运算
复制代码
损失函数
  1. loss = nn.CrossEntropyLoss(reduction='none')  # 使用交叉熵损失函数
复制代码
训练
  1. num_epochs, lr = 10, 0.1
  2. updater = torch.optim.SGD(params, lr=lr)  # 优化算法
  3. d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)
复制代码
1.png
  1. d2l.predict_ch3(net, test_iter)  # 在一些测试集上运行一下这个模型
复制代码
2.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

12 小时前

举报

感谢,下载保存了
您需要登录后才可以回帖 登录 | 立即注册