继承Module类来构造模型,Module类是nn模块里提供的一个模型构造类,是所有神经网络模块的基类:

  • · __init__函数:创建模型参数
  • · forward函数:定义前向计算
  • · backward函数:反向传播

注意,这里并没有将Module类命名为Layer(层)或者Model(模型)之类的名字,这是因为该类是一个可供自由组建的部件。它的子类既可以是一个层(如PyTorch提供的Linear类),又可以是一个模型(如这里定义的MLP类),或者是模型的一个部分。

PyTorch还实现了继承自Module的可以方便构建模型的类:

Sequential

它可以接收一个子模块的有序字典(OrderedDict)或者一系列子模块作为参数来逐一添加Module的实例,而模型的前向计算就是将这些实例按添加的顺序逐一计算。

ModuleList

接收一个子模块的列表作为输入,然后也可以类似List那样进行append和extend操作

二者区别:

ModuleList仅仅是一个储存各种模块的列表,这些模块之间没有联系也没有顺序(所以不用保证相邻层的输入输出维度匹配),而且没有实现forward功能需要自己实现;而Sequential内的模块需要按照顺序排列,要保证相邻层的输入输出大小相匹配,内部forward功能已经实现。ModuleList的出现只是让网络定义前向传播时更加灵活

另外,ModuleList不同于一般的Python的list,加入到ModuleList里面的所有模块的参数会被自动添加到整个网络中

ModuleDict

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

和ModuleList一样,ModuleDict实例仅仅是存放了一些模块的字典,并没有定义forward函数需要自己定义。同样,ModuleDict也与Python的Dict有所不同,ModuleDict里的所有模块的参数会被自动添加到整个网络中。

虽然上面介绍的这些类可以使模型构造更加简单,且不需要定义forward函数,但直接继承Module类可以极大地拓展模型构造的灵活性

深度学习的一个魅力在于神经网络中各式各样的层,虽然PyTorch提供了大量常用的层,但有时候我们依然希望自定义层。——可以通过Module类自定义神经网络中的层,从而可以被重复调用

  1. 不含模型参数的自定义层
  2. 含模型参数的自定义层