pytorch——nn.Module

pytorch——nn.Module

构建深度学习模型的话,用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)