这是小白哥,最近夜有所思,看一些模型的时候,产生了一个小疑问,就是模型在更新权重的时候,那些复杂的名字如何定义,以及其表示是如何的?,所以,也有所疑问的可以详细读一下下面我的总结。
前置
nn.Sequential([list]) 与 nn.Sequential(OrderDict) 的区别
nn.ModleList([])与 nn.Sequential([list]) 的区别
model.state_dict() 里究竟是什么
missing_key 与 unexpected_key 的区别
模型保存的方式
结尾
…
基于Pytorch的模块定义方式
对于Pytorch来说,基本目前看到过的定义模型方式有
import torch.nn
from collection import OrderDict
单层:nn.Linear 、nn.Conv 、nn.ReLU
多层: nn.ModleList([]) 、 nn.Sequential([list]) 、 nn.ModuleDict({
}) 、 、nn.Sequential(OrderDict)
对于单层 没什么好说的 self.name = nn.Linear() name就是该层的名字
对于多层来说,可以理解成多个单层模块叠加为树的结构 它的名字是嵌套的,比如 net1.0 、net2.conv 就是多一层就是多一个点 .
为了解答这些问题,我们首先定义一个模型,模型设置如下:
class SimpleNet(nn.Module):
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
self.net1 = nn.ModuleList(
[nn.Linear(10,10) for _ in range(10)]
)
self.net2 = nn.ModuleDict({
'conv':nn.Conv2d(10,10,3),
'relu': nn.ReLU()
})
self.net3 = nn