nn.Module 函数详解

nn.Module是所有网络模型结构的基类,无论是pytorch自带的模型,还是要自定义模型,都需要继承这个类。这个模块包含了很多子模块,如下所示,_parameters存放的是模型的参数,_buffers也存放的是模型的参数,但是是那些不需要更新的参数。带hook的都是钩子函数,详见钩子函数部分。

self._parameters = OrderedDict()
self._buffers = OrderedDict()
self._non_persistent_buffers_set = set()
self._backward_hooks = OrderedDict()
self._is_full_backward_hook = None
self._forward_hooks = OrderedDict()
self._forward_pre_hooks = OrderedDict()
self._state_dict_hooks = OrderedDict()
self._load_state_dict_pre_hooks = OrderedDict()
self._modules = OrderedDict()

此外,每一个模块还内置了一些常用的方法来帮助访问和操作网络。

load_state_dict() #加载模型权重参数 

parameters() #读取所有参数

named_parameters() #读取参数名称和参数

buffers() #读取self.named_buffers中的参数

named_buffers() #读取self.named_buffers中的参数名称和参数

children() #读取模型中,所有的子模型

named_children() #读取子模型名称和子模型

requires_grad_() #设置模型是否开启梯度反向传播

Parameter类

Parameter是Tensor子类,所以继承了Tensor类的属性。例如data和grad属性,可以根据data来访问参数数值,用grad来访问参数梯度。

weight_0 = nn.Parameters(torch.randn(10,10))

print(weight_0.data)
print(weight_0.grad)

定义变量的时候,nn.Parameter会被自动加入到参数列表中去

class MyModel(nn.Module):
def __init__(self):
super(MyModel,self).__init__()
self.weight1 = nn.Parameter(torch.randn(10,10))
self.weight2 = torch.randn(10,10)
def forward(self,x):
pass model = MyModel()
for name,param in model.named_parameters():
print(name) output: weight1

ParameterList

接定义成Parameter类外,还可以使用ParameterList和ParameterDict分别定义参数的列表和字典。ParameterList接收一个Parameter实例的列表作为输入然后得到一个参数列表,使用的时候可以用索引来访问某个参数,另外也可以使用append和extend在列表后面新增参数。

params = nn.ParameterList(
[nn.Parameter(torch.randn(10,10)) for i in range(5)]
) params.append(nn.Parameter(torch.randn(3,3)))

ParameterDict

可以像添加字典数据那样添加参数

params = nn.ParameterDict({
'linear1':nn.Parameter(torch.randn(10,5)),
'linear2':nn.Parameter(torch.randn(5,2))
})

模型构建

使用Sequential构建模型

# 写法一
net = nn.Sequential(
nn.Linear(num_inputs, 1)
# 此处还可以传入其他层
) # 写法二
net = nn.Sequential()
net.add_module('linear', nn.Linear(num_inputs, 1))
# net.add_module ...... # 写法三
from collections import OrderedDict
net = nn.Sequential(OrderedDict([
('linear', nn.Linear(num_inputs, 1))
# ......
])) print(net)

自定义模型

  1. 无参数模型

下面是一个展开操作,比如将2维图像展开成一维

class Flatten(nn.Module):
def __init__(self):
super(Flatten,self).__init__() def forward(self,input):
return input.view(input.size(0),-1)
  1. 有参数模型

自定义一个Linear层

class MLinear(nn.Module):
def __init__(self,input,output):
super(MyLinear,self).__init__() self.w = nn.Parameter(torch.randn(input,output))
self.b = nn.Parameter(torch.randn(output)) def foward(self,x):
x = self.w @ x + self.b
return x
  1. 组合模型
class Model(nn.Module):
def __init__(self):
super(Model,self).__init__()
self.l1 = nn.Linear(10,20)
self.l2 = nn.Linear(20,5) def forward(self,x):
x = self.l1(x)
x = self.l2(x) return x

ModuleList & ModuleDict

ModuleList 和 ModuleDict都是继承与nn.Module, 与Seuqential不同的是,ModuleList 和 ModuleDict没有自带forward方法,所以只能作为一个模块和其他自定义方法进行组合。下面是使用示例:

class MyModuleList(nn.Module):
def __init__(self):
super(MyModuleList, self).__init__()
self.linears = nn.ModuleList(
[nn.Linear(10, 10) for i in range(3)]
)
def forward(self, x):
for linear in self.linears:
x = linear(x)
return x class MyModuleDict(nn.Module):
def __init__(self):
super(MyModuleDict, self).__init__()
self.linears = nn.ModuleDict({
"linear1":nn.Linear(10,10),
"linear2":nn.Linear(10,10)
})
def forward(self, x):
x = self.linears["linear1"](x)
x = self.linears["linear2"](x)
return x

最新文章

  1. Linux安装jdk
  2. C# basic
  3. 如何hash一条有向边
  4. 《BI那点儿事》数据流转换——聚合
  5. UVA题目分类
  6. ueditor集成自己的ImageServer时出现错误的原因分析
  7. Toll-Free Bridge
  8. Docker仓库管理
  9. putty 连接ubuntu
  10. __sync_fetch_and_add
  11. 编写 capture filters
  12. S3C6410嵌入式应用平台构建(三)
  13. shell学习之字符串处理
  14. 设计模式(三)建造者模式Builder(创建型)
  15. 关于sizeof的笔试面试题具体解释
  16. MAC Mysql 重置密码
  17. Vue CLI 3.0脚手架如何在本地配置mock数据
  18. POJ2455 Secret Milking Machine
  19. [z]表空间对应文件的AUTOEXTEND ON NEXT指定的值对性能的影响
  20. Huffman 编码压缩算法

热门文章

  1. 搭载华为麒麟9000的Mate X2:秒售罄,一机难求
  2. lombok插件@Slf4j注解不生效问题解决办法
  3. Docker daemon socket权限不足
  4. Win10下ctrl与alt键互换
  5. POJ-2349(kruskal算法+最小生成树中最大边的长度)
  6. Flask-SQLAlchemy使用
  7. SEO 在 SPA 站点中的实践
  8. Python3读取网页HTML代码,并保存在本地文件中
  9. [UWP] 模仿哔哩哔哩的一键三连
  10. 001-HashMap源码分析