Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【动手学深度学习笔记】之构造MLP模型的几种方法

【动手学深度学习笔记】之构造MLP模型的几种方法

作者头像
树枝990
发布于 2020-08-19 14:27:27
发布于 2020-08-19 14:27:27
2.4K00
代码可运行
举报
文章被收录于专栏:拇指笔记拇指笔记
运行总次数:0
代码可运行

构造一个MLP模型的几种方法

本篇文章以构造一个MLP模型为例,介绍几种构造模型的常见方法。

1. 直接继承Module类

Module类是nn模块里提供的一个模型构造类,通过继承Module实现MLP的程序如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MLP(nn.Module):
    def __init__(self):
        super(MLP,self).__init__()
        self.hidden = nn.Linear(784,256)
        self.act = nn.ReLU()
        self.output = nn.Linear(256,10)
        
    def forward(self,x):
        a = self.act(self.hidden(x))
        return self.output(a)

在构造这个模型的过程中,仅仅定义了正向传播。系统将通过自动求梯度而自动生成反向传播所需要的backward函数。下面将MLP类实例化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X = torch.rand(2,784)
#随即胜场两组样本
net = MLP()
print(net)
net(X)

神经网络结构和正向传播一次的结果:

2. 使用Module的子类

Module的子类包括:Sequential类、ModuleList类和ModuleDict类

2.1 Sequential类

当模型的正向传播为简单串联各个层的计算时,Sequential类可以通过更简单的方式定义模型。Sequential类可以接收一系列子模块作为参数来逐一添加Module的实例。模型的正向传播就是将这些实例按添加顺序逐一计算。

使用Sequential类实现MLP模型,并使用随机生成的样本做一次前向计算。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#构造
net = nn.Sequential(
	nn.Linear(784,256),
	nn.ReLU(),
	nn.Linear(256,10),
)

#输出结果和进行一次前向计算
X = torch.rand(2,784)
print(net)
net(X)

神经网络结构和正向传播一次的结果:

2.2 ModuleList类

ModuleList接收一个子模块的列表作为输入。并且可以像list那样进行索引、append和extend操作。但不同于一般List的地方是加入到ModuleList里面的所有模块的参数会被自动添加到整个网络。

下面以实例说明如何使用ModuleList类构造MLP模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#构造
net = nn.ModuleList([nn.Linear(784,256),nn.ReLU()])
net.append(nn.Linear(256,10))

print(net[-1])
#输出net中最后一个实例
print(net)

神经网络结构:

2.3 ModuleDict类

ModuleDict类接受一个子模块的字典作为输入,也可以类似字典那样进行添加访问操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
net = nn.ModuleDict({
	'linear':nn.Linear(784,256),
	'act':nn.ReLU(),
})
#类似字典的访问方法
net['output']=nn.Linear(256,10)
print(net['linear'])
print(net.output)
#输出结构
print(net)

神经网络结构:

3. 构造复杂模型

上述两种方法各有利弊。下面我们综合使用这两种方法,构造一个复杂的神经网络FancyMLP。在这个神经网络中,我们需要创建常数参数(训练中不被迭代的参数),在前向计算中,还需要使用Tensor的函数和Python控制流并多次调用相同的层。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class FancyMLP(nn.Module):
    def __init__(self):
        super(FancyMLP, self).__init__()

        self.rand_weight = torch.rand((20, 20), requires_grad=False) #常数参数
        self.linear = nn.Linear(20, 20)

    def forward(self, x):
        x = self.linear(x)
        # 使用创建的常数参数
        x = nn.functional.relu(torch.mm(x, self.rand_weight.data) + 1)

        # 复用全连接层。等价于两个全连接层共享参数
        x = self.linear(x)
        # 控制流,这里我们需要调用item函数来返回标量进行比较
        while x.norm().item() > 1:
            x /= 2
        if x.norm().item() < 0.8:
            x *= 10
        return x.sum()

class NestMLP(nn.Module):
    def __init__(self):
        super(NestMLP, self).__init__()
        self.net = nn.Sequential(nn.Linear(40, 30), nn.ReLU())

    def forward(self, x):
        return self.net(x)

net = nn.Sequential(NestMLP(), nn.Linear(30, 20), FancyMLP())
#嵌套调用FancyMLP和Sequential

X = torch.rand(2, 40)
print(net)
net(X)

神经网络结构:


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拇指笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【现代深度学习技术】深度学习计算 | 层和块
  之前首次介绍神经网络时,我们关注的是具有单一输出的线性模型。在这里,整个模型只有一个输出。注意,单个神经网络完成以下几项工作:(1)接受一些输入;(2)生成相应的标量输出;(3)具有一组相关 参数(parameters),更新这些参数可以优化某目标函数。
Francek Chen
2025/02/02
830
【现代深度学习技术】深度学习计算 | 层和块
PyTorch模型容器与AlexNet构建
除了上述的模块之外,还有一个重要的概念是模型容器 (Containers),常用的容器有 3 个,这些容器都是继承自nn.Module。
timerring
2023/07/20
2560
PyTorch模型容器与AlexNet构建
PyTorch 学习 -4- 模型构建
Module 类是 torch.nn 模块里提供的一个模型构造类,是所有神经网络模块的基类,我们可以继承它来定义我们想要的模型。
为为为什么
2023/07/20
4920
PyTorch 学习 -4- 模型构建
【动手学深度学习笔记】之自定义层
神经网络中存在着全连接层、卷积层、池化层和循环层等各种各样的层。虽然PyTorch提供了大量常用的层,但有时还是需要我们自定义层。本篇文章介绍如何使用Module类来自定义层。
树枝990
2020/08/19
4550
深度学习 | 《深度学习入门之PyTorch》阅读笔记
KDD(knowledge discovery in database),从数据中获取有意义的信息
Justlovesmile
2021/12/14
1.5K0
深度学习 | 《深度学习入门之PyTorch》阅读笔记
【动手学深度学习】卷积神经网络CNN的研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/06
1900
【动手学深度学习】卷积神经网络CNN的研究详情
构建模型的3种方法
Pytorch没有官方的高阶API。一般通过nn.Module来构建模型并编写自定义训练循环。
lyhue1991
2020/07/20
1.4K0
【动手学深度学习】多层感知机之暂退法研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/14
1420
【动手学深度学习】多层感知机之暂退法研究详情
PyTorch5:torch.nn总览&torch.nn.Module
PyTorch 把与深度学习模型搭建相关的全部类全部在 torch.nn 这个子模块中。
小胡胡说
2020/08/10
1.3K0
【Pytorch 】笔记四:Module 与 Containers 的源码解析
疫情在家的这段时间,想系统的学习一遍 Pytorch 基础知识,因为我发现虽然直接 Pytorch 实战上手比较快,但是关于一些内部的原理知识其实并不是太懂,这样学习起来感觉很不踏实, 对 Pytorch 的使用依然是模模糊糊, 跟着人家的代码用 Pytorch 玩神经网络还行,也能读懂,但自己亲手做的时候,直接无从下手,啥也想不起来, 我觉得我这种情况就不是对于某个程序练得不熟了,而是对 Pytorch 本身在自己的脑海根本没有形成一个概念框架,不知道它内部运行原理和逻辑,所以自己写的时候没法形成一个代码逻辑,就无从下手。这种情况即使背过人家这个程序,那也只是某个程序而已,不能说会 Pytorch, 并且这种背程序的思想本身就很可怕, 所以我还是习惯学习知识先有框架(至少先知道有啥东西)然后再通过实战(各个东西具体咋用)来填充这个框架。而「这个系列的目的就是在脑海中先建一个 Pytorch 的基本框架出来, 学习知识,知其然,知其所以然才更有意思 ;)」。
阿泽 Crz
2020/09/04
1.2K0
【动手学深度学习笔记】之对模型参数的访问、初始化和共享
在创建的过程中,并没有可见的进行参数初始化的过程,因为这里使用了默认的方式进行了初始化参数。
树枝990
2020/08/19
8830
【动手学深度学习笔记】之通过丢弃法缓解过拟合问题
除了上一篇文章介绍的权重衰减法,深度学习常用的缓解过拟合问题的方法还有丢弃法。本文介绍倒置丢弃法及其实现。
树枝990
2020/08/19
1K0
【深度学习】多目标融合算法(四):多门混合专家网络MMOE(Multi-gate Mixture-of-Experts)
上一篇我们讲了MoE混合专家网络,通过引入Gate门控,针对不同的Input分布,对多个专家网络赋予不同的权重,解决多场景或多目标任务task的底层信息共享及个性化问题。但MoE网络对于不同的Expert专家网络,采用同一个Gate门控网络,仅对不同的Input分布实现了个性化,对不同目标任务task的个性化刻画能力不足,今天在MoE的基础上,引入MMoE网络,为每一个task任务构建专属的Gate门控网络,这样的改进可以针对不同的task得到不同的Experts权重,从而实现对Experts专家的选择利用,不同的任务task对应的gate门控网络可以学习到不同的Experts网络组合模式,更容易捕捉到不容task间的相关性和差异性。
LDG_AGI
2025/02/11
2340
【深度学习】多目标融合算法(四):多门混合专家网络MMOE(Multi-gate Mixture-of-Experts)
从DeepSeek-V3的成功,看MoE混合专家网络对深度学习算法领域的影响(MoE代码级实战)
📷 一、引言 经历了大模型2024一整年度的兵荒马乱,从年初的Sora文生视频到MiniMax顿悟后的开源,要说年度最大赢家,当属deepseek莫属:年中
LDG_AGI
2025/01/21
1530
从DeepSeek-V3的成功,看MoE混合专家网络对深度学习算法领域的影响(MoE代码级实战)
动手学DL——MLP多层感知机【深度学习】【PyTorch】
加入一个或多个隐藏层+激活函数来克服线性模型的限制, 使其能处理更普遍的函数关系类型,这种架构通常称为多层感知机(multilayer perceptron)。
来杯Sherry
2023/08/10
1.7K0
动手学DL——MLP多层感知机【深度学习】【PyTorch】
【动手学深度学习】卷积神经网络(AlexNet)的研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/14
2940
【动手学深度学习】卷积神经网络(AlexNet)的研究详情
【深度学习】多目标融合算法(五):定制门控网络CGC(Customized Gate Control)
上一篇我们讲了MMoE多任务网络,通过对每一个任务塔建立Gate门控,对专家网络进行加权平均,Gate门控起到了对多个共享专家重要度筛选的作用。在每轮反向传播时,每个任务tower分别更新对应Gate的参数,以及共享专家的参数。模型主要起到了多目标任务平衡的作用。
LDG_AGI
2025/03/20
1311
【深度学习】多目标融合算法(五):定制门控网络CGC(Customized Gate Control)
卷积神经网络(CNN)与深度卷积神经网络(DCNN)
AlexNet是第一个现代深度卷积网络模型,首次使用了许多现代深度卷积网络的技术方法,比如,采用ReLu作为非线性激活函数,使用Dropout防止过拟合,是用数据增强提高模型准确率,使用GPU进行并行训练等。
全栈程序员站长
2022/08/18
2.7K0
卷积神经网络(CNN)与深度卷积神经网络(DCNN)
【专知国庆特刊-PyTorch手把手深度学习教程系列01】一文带你入门优雅的PyTorch
【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视觉等)、大数据、编程语言、系统架构。使用请访问专知 进行主题搜索查看 - 桌面电脑访问www.zhuanzhi.ai, 手机端访问www.zhuanzhi.ai 或关注微信公众号后台回复" 专知"进入专知,搜索主题查看。值国庆佳节,专知特别推出独家特刊-来自中科院自动化所专知小组博士生huaiwen和Jin创作的-PyTorch教程学习系列。 <
WZEARW
2018/04/08
2.2K0
【专知国庆特刊-PyTorch手把手深度学习教程系列01】一文带你入门优雅的PyTorch
【现代深度学习技术】深度学习计算 | 参数管理
  在选择了架构并设置了超参数后,我们就进入了训练阶段。此时,我们的目标是找到使损失函数最小化的模型参数值。经过训练后,我们将需要使用这些参数来做出未来的预测。此外,有时我们希望提取参数,以便在其他环境中复用它们,将模型保存下来,以便它可以在其他软件中执行,或者为了获得科学的理解而进行检查。
Francek Chen
2025/02/02
790
【现代深度学习技术】深度学习计算 | 参数管理
推荐阅读
相关推荐
【现代深度学习技术】深度学习计算 | 层和块
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验