深度学习基础--模型构造

6 篇文章 0 订阅
6 篇文章 0 订阅

深度学习基础–模型构造

最近在阅读一本书籍–Dive-into-DL-Pytorch(动手学深度学习),链接:https://github.com/newmonkey/Dive-into-DL-PyTorch,自身觉得受益匪浅,在此记录下自己的学习历程。

本篇主要记录模型构造的几种方法:

我们以MLP多层感知机(含单隐藏层与两个全连接层)为例,构造模型。
首先导入需要的包

import torch
from torch import nn
Module类(基类)
Module 类是 nn 模块里提供的⼀个模型构造类,是所有神经网络模块的基类,我们可以通过继承Module 类来定义我们的模型。
class MLP(nn.Module):
    # 创建模型参数
    def __init__(self, **kwargs):
        super(MLP, self).__init__(**kwargs)
        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))
        b = self.output(a)
        return b

#实例化MLP类得到模型变量net
net = MLP()
print(net)

'''输出结果
MLP(
  (hidden): Linear(in_features=784, out_features=256, bias=True)
  (act): ReLU()
  (output): Linear(in_features=256, out_features=10, bias=True)
)
'''
Sequential类
Sequential类是Module类的子类。Sequential 类可以通过接收⼀个子模块的有序字典(OrderedDict)或者⼀系列⼦模块作为参数来逐⼀添加 Module 的实例,而模型的前向计算就是将这些实例按添加的顺序逐⼀计算。
net = nn.Sequential(
    nn.Linear(784, 256),
    nn.ReLU(),
    nn.Linear(256, 10),
)

print(net)

'''输出结果
Sequential(
  (0): Linear(in_features=784, out_features=256, bias=True)
  (1): ReLU()
  (2): Linear(in_features=256, out_features=10, bias=True)
)
'''
ModuleList类
ModuleList 类是Module类的子类。ModuleList 类接收⼀个子模块的列表作为输⼊,然后也可以类似List那样进行append和extend操作。
net = nn.ModuleList([
    nn.Linear(784, 256), 
    nn.ReLU()
])
net.append(nn.Linear(256, 10)) # # 类似List的append操作

print(net)

'''输出结果
ModuleList(
  (0): Linear(in_features=784, out_features=256, bias=True)
  (1): ReLU()
  (2): Linear(in_features=256, out_features=10, bias=True)
)
'''
ModuleDict类
ModuleDict 类是Module类的子类。ModuleDict 接收⼀个子模块的字典作为输⼊, 然后也可以类似字典那样进行添加访问操作。
net = nn.ModuleDict({
 'linear': nn.Linear(784, 256),
 'act': nn.ReLU(),
})
net['output'] = nn.Linear(256, 10) # 添加

print(net)

'''输出结果
ModuleDict(
  (act): ReLU()
  (linear): Linear(in_features=784, out_features=256, bias=True)
  (output): Linear(in_features=256, out_features=10, bias=True)
)
'''

优点总结:上面介绍的Sequential类、ModuleList类、ModuleDict类的好处是可以使模型构造更加简单,且不需要定义 forward 函数。而直接继承 Module类的好处是可以极大地拓展模型构造的灵活性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值