构建深度学习模型的话,用autograd太抽象、底层、代码量大实现麻烦,提供了nn.Module比较方便。nn.Module代表某一次或者某几层的nn。一般是基础nn.Module,写自己的nn/nn的某层
一、Module基本知识介绍
1、在实现自己的某层的时候基础了nn.Module,在构造函数中要调用Module的构造函数
super(Linear,self).init()
2、可学习参数放在构造函数中,并且通过nn.Parameter()使参数以parameters(一种tensor,默认是自动求导)的形式存在Module中,并且通过parameters()或者named_parameters()以迭代器的方式返回可学习参数的值
3、因为parameters是自动求导,所以调用forward()后,不用自己写和调用backward()函数。而且一般不是显式的调用forward(layer.farword),而是layer(input),会自执行forward()。
4、forward函数实现前向传播过程,其输入可以是一个或多个tensor。
5、module对象可以包含子module,Module能够自动检测到自己的Parameter并将其作为学习参数。除了parameter之外,Module还包含子Module,主Module能够递归查找子Modul中parameters。构造函数中,可利用前面自定义的Linear层(module),作为当前module对象的一个子module,它的可学习参数,也会成为当前module的可学习参数。
关于可学习参数命名规范
module的parameters的话,一般就是self.para_name (例如self.w)
module的子module命名是self子module名字para_name,例如self_submodule_w
阅读module相关文档时的注意点
1、构造函数的参数 ,如nn.Linear(in_features,out_features)
2、属性、可学习参数、子module。如nn.Linear包括w,b两个可学习参数,无子module。
3、输入、输出形状(batch_size,in_features) (batch_size,out_features)
这些自定义layer对输入形状都有假设:输入的不是单个数据,而是一个batch。输入只有一个数据,则必须调用tensor.unsqueeze(0)
或 tensor[None]
将数据伪装成batch_size=1的batch
二、常用的神经网络层
####1、图像层
Image.open() 打开显示一张图
Image->To_Tensor(如果是单个图片要unsqueeze())->进行各种处理->ToPILImage(如果是一张图转化为Image之前要squeeze())->Image
2、卷积层(有些有反卷积层)
conv=nn.Conv2d(3,3,5,1) // 输入通道,输出通道,卷积核,步长
conv.weight.data //权重的值,可以自己赋值
to_pil(out.data.squeeze()) //显示图片 经过每个层,都会有该层的layer.data
3、池化
pool=nn.MaxPool2d(2,2) //卷积核,步长
4、全连接层
nn.Linear(in_features,out_features)
5、BatchNorm层
BatchNorm1d(in_features) //参数是希望输入的特征数
他的参数是w是标准差,b是平均值
bn = nn.BatchNorm1d(4)
bn.weight.data = t.ones(4) * 4
bn.bias.data = t.zeros(4)
输出的是均值和方差(方差是标准差平方)
6、dropout层
Dropout(0.5) //每个元素以0.5的概率被舍弃,即有一半的数变为0
7、激活函数
nn.ReLU()
三、将nn的层连接起来
我们发现每一层的输出作为下一层的输入,这种前馈nn可以不用每一层都重复的写forward()函数,通过Sequential()和ModuleList(),可以自动实现forward。这两个函数都是特殊module,包含子module。ModuleList可以当成list用,但是不能直接传入输入。
Sequential构造方法
(a)
net1=nn.Sequential();
net1.add("conv",nn.Conv2d(3,3,5))
net1.add("batchnorm",nn.BatchNorm2d(3))
访问方式:net1.conv(input)
(b)
net2=nn.Sequential(nn.Conv2d(3,3,5),nn.BatchNorm(3))
访问方式:net2[0]
(c)
net3=nn.Sequential(OrderedDict([ ("conv",nn.Conv2d(3,3,5)),("batchnorm",nn.BatchNorm(3)),() ]))
访问方式:net3.conv(input)
ModuleList构造方法
modulelist=nn.ModuleList([ nn.Conv2d(3,3,6),nn.BatchNorm(3) ])
访问方式
for model in modulelist:
input=modullist(input)