对于前面的线性回归模型、 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