在Pytorch中构建好一个模型后,一般需要进行预训练权重中加载。torch.load_state_dict()函数就是用于将预训练的参数权重加载到新的模型之中,操作方式如下所示:
sd_net = torchvision.models.resnte50(pretrained=False)
sd_net.load_state_dict(torch.load('*.pth'), strict=True)
在本博文中重点关注的是 属性 strict; 当strict=True,要求预训练权重层数的键值与新构建的模型中的权重层数名称完全吻合;如果新构建的模型在层数上进行了部分微调,则上述代码就会报错:说key对应不上。
此时,如果我们采用strict=False 就能够完美的解决这个问题。也即,
与训练权重中与新构建网络中匹配层的键值就进行使用,没有的就默认初始化
。
在Pytorch中构建好一个模型后,一般需要进行预训练权重中加载。torch.load_state_dict()函数就是用于将预训练的参数权重加载到新的模型之中,操作方式如下所示:sd_net = torchvision.models.resnte50(pretrained=False)sd_net.load_state_dict(torch.load('*.pth'), strict=True)在本博文中重点关注的是 属性 strict; 当strict=True,要求预训练权重层数的键值与新
简而言之,py
torch
保存模型时用的映射关系。
py
torch
中的
state
_
dict
是一个简单的
python
字典对象,将每一层与之对应的参数建立映射关系。只有参数可训练的layer才会保存到模型 的
state
_
dict
中,如卷积层、线性层。
优化器optimizer也有一个
state
_
dict
,包含了优化器的状态以及被使用的超参数(lr、momentum、weight_decay)
state
_
dict
是定义了model或optimizer之后py
torch
自动生成的,可直接调用。常用的保存sta
ERROR:Py
Torch
加载模型model.
load
_
state
_
dict
()问题,Unexpected key(s) in
state
_
dict
: "module.features…,Expected .
希望将训练好的模型加载到新的网络上。如上面题目所描述的,Py
Torch
在加载之前保存的模型参数的时候,遇到了问题。
Unexpected key(s) in
state
_
dict
: "mod...
在 Py
torch
中一种模型保存和加载的方式如下:# save
model.
state
_
dict
()其实返回的是一个Order
Dict
,存储了网络结构的名字和对应的参数,下面看看源代码如何实现的。
state
_
dict
#
torch
.nn.modules.module.py
可以看到
state
_
dict
函数
中遍历了4中元素,分别是_paramters,_buffers,_modules和_stat...
一、
load
_
state
_
dict
(strict)中参数 strict的使用
load
_
state
_
dict
(strict)中的参数strict默认是True,这时候就需要严格按照模型中参数的Key值来加载参数,如果增删了模型的结构层,或者改变了原始层中的参数,加载就会报错。
相反地,如果设置strict为Flase,就可以只加载具有相同名称的参数层,对于修改的模型结构层进行随机赋值。这里需要注意的是,如果只是改变了原来层的参数,但是没有换名称,依然还是会报错。因为根据key值找到对应...
其实Py
torch
模型保存还是挺简单的,但是不同方式也有好坏之分吧。有时候,我们不仅仅需要保存模型参数,实际上有时需要保存训练的所有现场,包括优化器的内容。即有时候是只保存参数,但有时候需要保存模型训练的全过程。
如果直接保存模型,其实很直接了当;如果model是py
torch
的nn.module继承而来的,那么如下:
model_path = os.path.join(output, 'model.pth')
torch
.save(model.
state
_
dict
(), model_path)
在训练比较大、耗时较久的网络时,如果突然停电、断网或者一些意外情况发生导致训练中断,那么已经训练好的内容可能全部丢失,这时我们就需要在训练过程中把一些时间点的checkpoint保存下来,及时训练意外中断,那么我们也可以在之后把这些checkpoint下载下来,重新开始训练。
(谁能想到我刚刚码好这段话就停电了呢?...
Py
torch
目前成为学术界最流行的DL框架,没有之一。很大程度上,简洁直观地操作有关。模型的保存和加载,于py
torch
而言,也是很简单的。本文做了一个比较实验,方便大家理解。
首先,要清楚几个
函数
:
torch
.save,
torch
.
load
,
state
_
dict
(),
load
_
state
_
dict
()。
先举最简单的例子:
import
torch
model =
torch
.
load
('my_model.pth')
torch
.save(model, 'new_model.pth')
上面的代码非
假设 trained.pth 是一个训练好的网络的模型参数存储
model = Net()是我们刚刚生成的一个新模型,我们希望model将trained.pth中的参数加载加载进来,但是model中多了一些trained.pth中不存在的参数,如果使用下面的命令:
model.
load
_
state
_
dict
(
state
_
dict
)
会报错,说key对应不上,因为model你强人所难,我堂堂trained.pth没有你的那些个.