对Pytorch中nn.ModuleList 和 nn.Sequential详解
简而言之就是,nn.Sequential类似于Keras中的贯序模型,它是Module的子类,在构建数个网络层之后会自动调用forward()方法,从而有网络模型生成。而nn.ModuleList仅仅类似于pytho中的list类型,只是将一系列层装入列表,并没有实现forward()方法,因此也不会有网络模型产生的副作用。
需要注意的是,nn.ModuleList接受的必须是subModule类型,例如:
nn.ModuleList(
[nn.ModuleList([Conv(inp_dim + j * increase, oup_dim, 1, relu=False, bn=False) for j in range(5)]) for i in
range(nstack)])
其中,二次嵌套的list内部也必须额外使用一个nn.ModuleList修饰实例化,否则会无法识别类型而报错!
nn.ModuleList is just like a Python list. It was designed to store any desired number of nn.Module's. It may be useful, for instance, if you want to design a neural network whose number of layers is passed as input:
class LinearNet(nn.Module): def __init__(self, input_size, num_layers, layers_size, output_size): super(LinearNet, self).__init__() self.linears = nn.ModuleList([nn.Linear(input_size, layers_size)]) self.linears.extend([nn.Linear(layers_size, layers_size) for i in range(1, self.num_layers-1)]) self.linears.append(nn.Linear(layers_size, output_size)
nn.Sequential allows you to build a neural net by specifying sequentially the building blocks (nn.Module's) of that net. Here's an example:
class Flatten(nn.Module):
def forward(self, x):
N, C, H, W = x.size() # read in N, C, H, W
return x.view(N, -1)
simple_cnn = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=7, stride=2),
nn.ReLU(inplace=True),
Flatten(),
nn.Linear(5408, 10),
)
In nn.Sequential, the nn.Module's stored inside are connected in a cascaded way. For instance, in the example that I gave, I define a neural network that receives as input an image with 3 channels and outputs 10 neurons. That network is composed by the following blocks, in the following order: Conv2D -> ReLU -> Linear layer. Moreover, an object of type nn.Sequential has a forward() method, so if I have an input image x I can directly call y = simple_cnn(x) to obtain the scores for x. When you define an nn.Sequential you must be careful to make sure that the output size of a block matches the input size of the following block. Basically, it behaves just like a nn.Module
On the other hand, nn.ModuleList does not have a forward() method, because it does not define any neural network, that is, there is no connection between each of the nn.Module's that it stores. You may use it to store nn.Module's, just like you use Python lists to store other types of objects (integers, strings, etc). The advantage of using nn.ModuleList's instead of using conventional Python lists to store nn.Module's is that Pytorch is “aware” of the existence of the nn.Module's inside an nn.ModuleList, which is not the case for Python lists. If you want to understand exactly what I mean, just try to redefine my class LinearNet using a Python list instead of a nn.ModuleList and train it. When defining the optimizer() for that net, you'll get an error saying that your model has no parameters, because PyTorch does not see the parameters of the layers stored in a Python list. If you use a nn.ModuleList instead, you'll get no error.
以上这篇对Pytorch中nn.ModuleList 和 nn.Sequential详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
python中通过selenium简单操作及元素定位知识点总结
在本篇文章里小编给大家整理的是关于python中通过selenium简单操作及元素定位的知识点,有需要的朋友们可以学习下。2019-09-09
Python使用openpyxl实现Excel超链接批量化设置
在Excel中,超链接是一种非常有用的功能,本文我们将介绍如何使用Python来处理Excel中的超链接,以及如何将超链接与对应的工作表链接起来,需要的可以参考一下2023-07-07
Python3+selenium实现cookie免密登录的示例代码
这篇文章主要介绍了Python3+selenium实现cookie免密登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-03-03
Python神经网络TensorFlow基于CNN卷积识别手写数字
这篇文章主要介绍了Python神经网络TensorFlow基于CNN卷积识别手写数字的实现示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助2021-10-10
Python使用Matplotlib绘制散点趋势线的代码详解
Matplotlib是一个用于数据可视化的强大Python库,其基本功能之一是创建带有趋势线的散点图,散点图对于可视化变量之间的关系非常有用,本文将指导您使用Matplotlib绘制散点趋势线的过程,涵盖线性和多项式趋势线,需要的朋友可以参考下2025-01-01
python中的__init__ 、__new__、__call__小结
这篇文章主要介绍了python中的__init__ 、__new__、__call__小结,需要的朋友可以参考下2014-04-04


最新评论