pytorch保存和加载模型权重以及CUDA在pytorch中的使用

1.保存加载自定义模型

1.1 保存加载整个模型

device = ['cuda:0' if torch.cuda.is_available() else 'cpu'][0]
'''模型保存'''
torch.save(model, 'model.pkl')
'''模型加载'''
model = torch.load('model.pkl', map_location=device)

这种方式直接保存加载整个网络结构,比较死板,不能调整网络结构。

1.2 保存加载模型参数

device = ['cuda:0' if torch.cuda.is_available() else 'cpu'][0]
# 定义网络
model = nn.RNN() # 举例,一个RNN类,定义了RNN模型的结构
'''模型参数保存'''
torch.save(model.state_dict(), 'model_param.pkl')

# 加载模型参数到模型结构
model.load_state_dict(torch.load('model_param.pkl', map_location=device))

这种方式需要自己先定义网络模型的结构才能加载模型的参数,并且定义的网络模型的参数名称和结构要与加载的模型一致(可以是部分网络,比如只使用神经网络的前几层),相对灵活,便于对网络进行修改。

2.加载预训练模型

由于加载保存整个网络模型比较死板,所以一般都只保存或者加载预训练模型的参数.

2.1 预训练模型网络结构 == 自定义模型网络结构

结构相同就不需要修改,可以直接套用

device = ['cuda:0' if torch.cuda.is_available() else 'cpu'][0]
path="预训练模型地址"
model = CJK_MODEL()
# 加载参数
model = model.load_state_dict(torch.load(path,mao_location=device))

2.2 预训练模型网络结构与自定义模型网络结构不一致

  1. 首先打印出两个网络模型的各层网络名称
	device = ['cuda:0' if torch.cuda.is_available() else 'cpu'][0]
	'''输出自定义模型的各层网络结构名称'''
	model_dict = model.state_dict()
	print(model_dict.keys())
	'''输出自定义模型的各层网络结构名称'''
	checkpoint = torch.load('./model_param.pkl')
	for k, v in checkpoint.items():
		print("keys:",k)
  1. 对比两者网络结构参数,如果差距太大就没有借用的必要了
  • 如果许多参数层的名称完全一致:
	model.load_state_dict(checkpoint, strict=True)
	'''
	load_state_dict 函数添加参数 strict=True,
	它直接忽略那些没有的dict,有相同的就复制,没有就直接放弃赋值. 
	他要求预训练模型的关键字必须确切地严格地和
	自定义网络的state_dict()函数返回的关键字相匹配才能赋值。
	'''
  • 如果许多参数层的名称大部分一致:
    比如自定义网络模型中参数层名称为backbone.stage0.rbr_dense.conv.weight,
    预训练模型中参数层名称为stage0.rbr_dense.conv.weight,可以看到二者大部分是一致的.这种情况下,可以把 预训练模型的stage0.rbr_dense.conv.weight读入网络的backbone.stage0.rbr_dense.conv.weight 中。

3.cuda

把在cpu上运算的张量转变为在GPU上运行的cuda张量可以显著提升训练速度

  • 在加载模型时转变为cuda张量
# 选择设备
device = ['cuda' if torch.cuda.is_available() else 'cpu']  
# 法一:加载整个模型
model = torch.load('model.pkl', map_location='cuda:0')
# 法二:只加载模型参数
model = model.load_state_dict(torch.load(path), map_location='cuda:0')
  • 单独转变为cuda张量
# 选择设备
device = ['cuda' if torch.cuda.is_available() else 'cpu']  
# 法一:加载整个模型
model = torch.load('model.pkl')
# 法二:只加载模型参数
model = model.load_state_dict(torch.load(path))
'''单独转变为cuda张量'''
model.to(device)

注意, 必须把所有的张量都转为cuda型, 否则会报错

PyTorch保存加载深度学习模型权重更新是一个相对简单的过程。以下是一种基本的方法: **保存模型** 在PyTorch,你可以使用`torch.save()`函数来保存模型权重。以下是一个简单的例子: ```python import torch import torch.nn as nn # 假设你有一个模型 model model = nn.Linear(10, 2) # 假设你有一个优化器 optimizer optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 假设你有一些训练数据和对应的标签 data_loader data_loader = ... # 定义一个训练循环 for epoch in range(num_epochs): for i, (inputs, labels) in enumerate(data_loader): # 前向传播 outputs = model(inputs) # 计算损失 loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 在每个epoch结束后,保存模型权重 torch.save(model.state_dict(), f'model_weights_{epoch}.pth') ``` 在这个例子,我们使用`model.state_dict()`来获取模型权重,并将其保存到文件。`state_dict`包含了模型的所有权重参数和缓冲区。 **加载模型** 加载模型权重的过程相对简单。你可以使用`torch.load()`函数来加载保存权重。以下是一个例子: ```python # 加载模型权重 model_weights = torch.load('model_weights_latest.pth') # 创建一个新的模型实例,并设置正确的设备(如果必要的话) model = nn.Linear(10, 2).to(device) # 根据实际情况设置设备,例如 'cuda' 或 'cpu' model.load_state_dict(model_weights) # 使用加载权重更新模型 ``` 这样,你就可以将之前保存模型权重应用到新的模型实例上,从而更新模型权重。请注意,你需要确保在加载权重之前已经创建了新的模型实例,并且已经设置了正确的设备(例如GPU)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值