深度学习基础–模型构造
最近在阅读一本书籍–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类的好处是可以极大地拓展模型构造的灵活性。