对于前面的线性回归模型、 Logistic回归模型和神经网络,我们在构建的时候定义了需要的参数。这对于比较小的模型是可行的,
但是对于大的模型,比如100 层的神经网络,这个时候再去手动定义参数就显得非常麻烦,所以 PyTorch
提供了两个模块来帮助我们构建模型,一个是Sequential,一个是 Module。

nn.Module

      nn.Module类是所有网络结构层次的父类。

      当你要实现一个自己的层的时候,必须要继承这个类。

      但是注意BN等norm层不是继承的nn.Module, 它继承的_BatchNorm,但是_BatchNorm的底层还是继承的nn.Module

      而当我们使用一些现有的层,比如说线性层、卷积层的时候,它其实也是继承自nn.Module,只不过这个类因为使用的非常广泛
,所以pytorch官方已经写好了

      当我们自己实现类的话,必须继承自nn.Module,并且在init中完成初始化的步骤和forward中完成计算图的前向构建的过程

 

every layer is nn.Module

pytorch实现了大部分的layer,这些layer都继承于nn.Module

* nn.conv2d卷积层
* AvgPool,Maxpool,AdaptiveAvgPool
* TransposeConv逆卷积
* nn.Linear全连接层
* nn.BatchNorm1d(1d,2d,3d)
* nn.dropout
* nn.ReLU
* nn.Sequential
      使用这些层非常方便,我们只需要调用一些初始化函数,然后再调用.call方法来调用其forward函数就可以使用它的一些功能

nn.sequential()用作容器Container

      Sequential 允许我们构建序列化的模块。就把Sequential当作list来看

      nn.sequential(), 一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行

      keras中也有类似的类,tensorflow中没有

nn.sequential()本身也是一个nn.Module类

      Sequential
允许我们构建序列化的模块,也就是说用了Sequential的好处是我们可以通过数字访问第几层,可以通过parameters、weights等参数显示网络的参数和权重

使用和不使用nn.Sequential()的对比

不使用
class Net(nn.Module): def __init__(self): super(Net, self).__init__() # xw+b
self.fc1 = nn.Linear(28*28, 256) self.fc2 = nn.Linear(256, 64) self.fc3 =
nn.Linear(64, 10) def forward(self, x): # x: [b, 1, 28, 28] # h1 = relu(xw1+b1)
x = F.relu(self.fc1(x)) # h2 = relu(h1w2+b2) x = F.relu(self.fc2(x)) # h3 =
h2w3+b3 x = self.fc3(x) return x
使用
class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc
= nn.Sequential( nn.Linear(28*28, 256) nn.Relu() nn.Linear(256, 64) nn.Relu()
nn.Linear(64, 10) ) def forward(self, x): # x: [b, 1, 28, 28] # h1 =
relu(xw1+b1) x = self.fc(x) return x

Sequential的三种写法
net1 = nn.Sequential() net1.add_module('conv', nn.Conv2d(3, 3, 3))
net1.add_module('batchnorm', nn.BatchNorm2d(3))
net1.add_module('activation_layer', nn.ReLU()) net2 = nn.Sequential(
nn.Conv2d(3, 3, 3), nn.BatchNorm2d(3), nn.ReLU() ) from collections import
OrderedDict net3= nn.Sequential(OrderedDict([ ('conv1', nn.Conv2d(3, 3, 3)),
('bn1', nn.BatchNorm2d(3)), ('relu1', nn.ReLU()) ]))

3、parameter管理

使用nn.Module的话,它就会对你神经网络的内部参数进行一个有效的管理

4、modules管理

直系子节点叫children

所有的节点加载一个叫modules

技术
今日推荐
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信