本文中,我们看一看如何构建模型。
创造一个模型分两步:构建模型和权值初始化。而构建模型又有“定义单独的网络层”和“把它们拼在一起”两步。
1. torch.nn.Module
torch.nn.Module
是所有 torch.nn
中的类的父类。我们来看一个非常简单的神经网络:
1 | class SimpleNet(nn.Module): |
我们随便喂给它一个张量,打印它的网络:
1 | 10, 2))) simpleNet = SimpleNet(torch.tensor(( |
所有自定义的神经网络都要继承 torch.nn.Module
。定义单独的网络层在 __init__
函数中实现,把定义好的网络层拼接在一起在 forward
函数中实现。网络类有两个重要的函数:parameters
存储了模型的权重;modules
存储了模型的结构。
1 | list(simpleNet.modules()) |
2. torch.nn.Sequential
这是一个序列容器,既可以放在模型外面单独构建一个模型,也可以放在模型里面成为模型的一部分。
1 | # 单独成为一个模型 |
放在模型里面的话,模型还是需要 __init__
和 forward
函数。
这样构建出来的模型的层没有名字:
1 | model2 = nn.Sequential( |
为了方便区分不同的层,我们可以使用 collections
里的 OrderedDict
函数:
1 | from collections import OrderedDict |
3. torch.nn.ModuleList
将网络层存储进一个列表,可以使用列表生成式快速生成网络,生成的网络层可以被索引,也拥有列表的方法 append
,extend
或 insert
。
1 | class MyModule(nn.Module): |
4. torch.nn.ModuleDict
这个函数与上面的 torch.nn.Sequential(OrderedDict(...))
的行为非常类似,并且拥有 keys
,values
,items
,pop
,update
等词典的方法:
1 | class MyDictDense(nn.Module): |
欢迎关注我的微信公众号“花解语 NLP”: