模型保存以及加载
保存模型有两种方式:
1、保存整个模型
def save_checkpoint(path, model, optimizer):
torch.save(model, path)
对应的加载代码为:
cnn_model=torch.load(path)
2、只保存网络以及优化器的参数等数据
def save_checkpoint(path, model, optimizer):
state = {
'model': model.state_dict(),
'optimizer': optimizer.state_dict()
}
torch.save(state, path)
对应的加载代码为:
def load_checkpoint(path,model,optimizer):
model_CKPT = torch.load('model.pth')
model.load_state_dict(model_CKPT['model'])
optimizer.load_state_dict(model_CKPT['optimizer'])
model.eval()
第二种方法只保存的网络的参数,所以在加载模型之前还需要先定义一个model再load.
一般来说大家都更喜欢用第二种方法,因为第二种方法我们可以保存除了网络参数外的其他数据比如优化器的参数、loss等数据。如果我们修改了部分的网络,那么我们就无法通过第一种方式来实现加载模型,不过我们可以在使用第二种方法加载模型时可以实现对参数的过滤,所以第二种方法比第一种方法要更好一些。
model.train()与model.eval()用法区别
在看代码写代码的过程中往往会发现在训练前会出现
model.train()
在测试前会出现
model.eval()
这两行代码的功能是什么呢?
model.train()保证在训练过程中BN层使用每一批的均值和方差,Dropout层正常工作即训练过程中冻结部分神经元防止过拟合。
model.eval()保证测试过程中BN层使用所有的数据的均值和方法。Dropout层不会冻结部分神经元,所有的神经元都参与工作。个人理解就是为了使训练和测试时的BN层和Dropout层正常发挥作用。(不知道如果网络模型中没有BN层和Dropout层的话需不需要使用这两条代码,个人推测是不需要,有懂的大佬可以评论区回复一下)
torch和numpy类型互相转换
需要注意的是numpy转化为torch或者torch转换为numpy后二者共享内存但不共享地址。也就是一个变化另一个跟着变化但二者的地址不同。
import torch
a_torch=torch.ones(5)
a_numpy=a_torch.numpy()
a_torch=torch.from_numpy(a_numpy)
(本文主要是记录一位研0菜鸡选手在学习pytorch过程中遇到的一些有价值的问题,如果有问题希望各位大佬指正)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)