深度学习基础--模型构造
深度学习基础–模型构造
最近在阅读一本书籍–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类的好处是可以极大地拓展模型构造的灵活性。
上一篇:
JS实现多线程数据分片下载