【深度学习底子】多层感知机 | 多层感知机的实现

打印 上一主题 下一主题

主题 972|帖子 972|积分 2916


   【作者主页】Francek Chen
【专栏介绍】                                             ⌈                                      ⌈                        ⌈PyTorch深度学习                                             ⌋                                      ⌋                        ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的呆板学习。它是在统计呆板学习、人工神经网络等算法模型底子上,联合当代大数据和大算力的发展而发展出来的。深度学习最告急的技能特性是具有自动提取特性的本领。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处置惩罚、多模态数据分析、科学探索等范畴都取得了许多成果。本专栏介绍基于PyTorch的深度学习算法实现。
【GitCode】专栏资源生存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
  
  

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

  我们已经在【深度学习底子】多层感知机 | 多层感知机概述 中描述了多层感知机(MLP),现在让我们尝试自己实现一个多层感知机。为了与之前softmax回归得到的结果进行比较,我们将继承使用Fashion-MNIST图像分类数据集。
  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)
复制代码
(一)初始化模型参数

  追念一下,Fashion-MNIST中的每个图像由                                   28                         ×                         28                         =                         784                              28 \times 28 = 784                  28×28=784个灰度像素值组成。所有图像共分为10个类别。忽略像素之间的空间结构,我们可以将每个图像视为具有784个输入特性和10个类的简朴分类数据集。起首,我们将实现一个具有单隐藏层的多层感知机,它包含256个隐藏单元。注意,我们可以将这两个变量都视为超参数。通常,我们选择2的若干次幂作为层的宽度。因为内存在硬件中的分配和寻址方式,这么做往往可以在计算上更高效。
  我们用几个张量来表示我们的参数。注意,对于每一层我们都要记载一个权重矩阵和一个偏置向量。跟以前一样,我们要为损失关于这些参数的梯度分配内存。
  1. num_inputs, num_outputs, num_hiddens = 784, 10, 256
  2. W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens, requires_grad=True) * 0.01)
  3. b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
  4. W2 = nn.Parameter(torch.randn(num_hiddens, num_outputs, requires_grad=True) * 0.01)
  5. b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
  6. params = [W1, b1, W2, b2]
复制代码
(二)激活函数

  为了确保我们对模型的细节了如指掌,我们将实现ReLU激活函数,而不是直接调用内置的relu函数。
  1. def relu(X):
  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)
复制代码
(四)损失函数

  由于我们已经从零实现过softmax函数,因此在这里我们直接使用高级API中的内置函数来计算softmax和交织熵损失。追念一下我们之前在softmax回归的简洁实现中对这些复杂题目的讨论。我们鼓励感兴趣的读者检察损失函数的源代码,以加深对实现细节的相识。
  1. loss = nn.CrossEntropyLoss(reduction='none')
复制代码
(五)练习

  幸运的是,多层感知机的练习过程与softmax回归的练习过程完全相同。可以直接调用d2l包的train_ch3函数(拜见【深度学习底子】线性神经网络 | softmax回归的从零开始实现),将迭代周期数设置为10,并将学习率设置为0.1。
  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. d2l.predict_ch3(net, test_iter)
复制代码

二、多层感知机的简洁实现

  本节将介绍通过高级API更简洁地实现多层感知机。
  1. import torch
  2. from torch import nn
  3. from d2l import torch as d2l
复制代码
模型

  与softmax回归的简洁实现相比,唯一的区别是我们添加了2个全毗连层(之前我们只添加了1个全毗连层)。第一层是隐藏层,它包含256个隐藏单元,并使用了ReLU激活函数。第二层是输出层。
  1. net = nn.Sequential(nn.Flatten(), nn.Linear(784, 256), nn.ReLU(), nn.Linear(256, 10))
  2. def init_weights(m):
  3.     if type(m) == nn.Linear:
  4.         nn.init.normal_(m.weight, std=0.01)
  5. net.apply(init_weights);
复制代码
  练习过程的实现与我们实现softmax回归时完全相同,这种模块化设计使我们能够将与模型架构有关的内容独立出来。
  1. batch_size, lr, num_epochs = 256, 0.1, 10loss = nn.CrossEntropyLoss(reduction='none')
  2. trainer = torch.optim.SGD(net.parameters(), lr=lr)
复制代码
  1. train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
  2. d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
复制代码

小结



  • 手动实现一个简朴的多层感知机是很容易的。然而如果有大量的层,从零开始实现多层感知机会变得很贫苦(例如,要定名和记载模型的参数)。
  • 我们可以使用高级API更简洁地实现多层感知机。
  • 对于相同的分类题目,多层感知机的实现与softmax回归的实现相同,只是多层感知机的实现里增长了带有激活函数的隐藏层。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表