Module类是nn模块里提供的一个模型构造类,是所有神经网络模块的基类。可以继承基类并重构 __init()__函数和\(forward()\)函数的方式来构造模型。
以下是一个构造一个模型的例子:
实例化刚刚构建的MLP类得到模型变量net,net(X)会调用MLP继承自Module类的__call__函数,这个函数将调用MLP类定义的forward函数来完成前向计算。
如果定义的模型的前向计算就是简单的串联各层的计算时,可以通过Sequential类快速定义模型。它可以接收一个子模块的有序字典(OrderedDict)或者一系列子模块作为参数来逐一添加Module的实例,而模型的前向计算就是将这些实例按添加的顺序逐一计算。
定义一个与Sequential类有相同功能的类:ep_sequential来解读Sequential类的工作机制:
这里通过forward函数就可以看出Sequential类实现的是简单的串联各层
ModuleList接收一个子模块的列表作为输入,可以像List那样进行append和extend操作:
这是官网的例子:
但是,ModuleList并不是一般的list,加入到ModuleList里的所有模块的参数会被自动添加到网络中。下面的例子进行了对比:
输出:
从结果可以看出,使用ModuleList 初始化网络层,那么该层参数就会被自动加入调用ModuleList的网络的模型中。
ModuleDict接收一个子模块的字典作为输入, 类似ModuleList,可以像字典那样进行添加访问操作:
和ModuleList一样,ModuleDict实例仅仅是存放了一些模块的字典,并没有定义forward函数。同样,ModuleDict也与Python的普通的Dict不同,ModuleDict里的所有模块的参数会被自动添加到整个网络中。