網站首頁 編程語言 正文
1.保存加載checkpoint文件
# 方式一:保存加載整個state_dict(推薦)
# 保存
torch.save(model.state_dict(), PATH)
# 加載
model.load_state_dict(torch.load(PATH))
# 測試時不啟用 BatchNormalization 和 Dropout
model.eval()
# 方式二:保存加載整個模型
# 保存
torch.save(model, PATH)
# 加載
model = torch.load(PATH)
model.eval()
# 方式三:保存用于繼續訓練的checkpoint或者多個模型
# 保存
torch.save({
? ? ? ? ? ? 'epoch': epoch,
? ? ? ? ? ? 'model_state_dict': model.state_dict(),
? ? ? ? ? ? ...
? ? ? ? ? ? }, PATH)
# 加載
checkpoint = torch.load(PATH)
start_epoch=checkpoint['epoch']
model.load_state_dict(checkpoint['model_state_dict'])
# 測試時
model.eval()
# 或者訓練時
model.train()
2.跨gpu和cpu
# GPU上保存,CPU上加載
# 保存
torch.save(model.state_dict(), PATH)
# 加載
device = torch.device('cpu')
model.load_state_dict(torch.load(PATH, map_location=device))
# 如果是多gpu保存,需要去除關鍵字中的module,見第4部分
# GPU上保存,GPU上加載
# 保存
torch.save(model.state_dict(), PATH)
# 加載
device = torch.device("cuda")
model.load_state_dict(torch.load(PATH))
model.to(device)
# CPU上保存,GPU上加載
# 保存
torch.save(model.state_dict(), PATH)
# 加載
device = torch.device("cuda")
# 選擇希望使用的GPU
model.load_state_dict(torch.load(PATH, map_location="cuda:0")) ?
model.to(device)
3.查看checkpoint文件內容
# 打印模型的 state_dict
print("Model's state_dict:")
for param_tensor in model.state_dict():
? ? print(param_tensor, "\t", model.state_dict()[param_tensor].size())
4.常見問題
多gpu
報錯為KeyError: ‘unexpected key “module.conv1.weight” in state_dict’
原因:當使用多gpu時,會使用torch.nn.DataParallel,所以checkpoint中有module字樣
#解決1:加載時將module去掉
# 創建一個不包含`module.`的新OrderedDict
from collections import OrderedDict
new_state_dict = OrderedDict()
for k, v in state_dict.items():
? ? name = k[7:] # 去掉 `module.`
? ? new_state_dict[name] = v
# 加載參數
model.load_state_dict(new_state_dict)
# 解決2:保存checkpoint時不保存module
torch.save(model.module.state_dict(), PATH)
pytorch保存和加載文件的方法,從斷點處繼續訓練
'''本文件用于舉例說明pytorch保存和加載文件的方法'''
import torch as torch
import torchvision as tv
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import torchvision.transforms as transforms
import os
# 參數聲明
batch_size = 32
epochs = 10
WORKERS = 0 # dataloder線程數
test_flag = False # 測試標志,True時加載保存好的模型進行測試
ROOT = '/home/pxt/pytorch/cifar' # MNIST數據集保存路徑
log_dir = '/home/pxt/pytorch/logs/cifar_model.pth' # 模型保存路徑
# 加載MNIST數據集
transform = tv.transforms.Compose([
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])
train_data = tv.datasets.CIFAR10(root=ROOT, train=True, download=True, transform=transform)
test_data = tv.datasets.CIFAR10(root=ROOT, train=False, download=False, transform=transform)
train_load = torch.utils.data.DataLoader(train_data, batch_size=batch_size, shuffle=True, num_workers=WORKERS)
test_load = torch.utils.data.DataLoader(test_data, batch_size=batch_size, shuffle=False, num_workers=WORKERS)
# 構造模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 64, 3, padding=1)
self.conv2 = nn.Conv2d(64, 128, 3, padding=1)
self.conv3 = nn.Conv2d(128, 256, 3, padding=1)
self.conv4 = nn.Conv2d(256, 256, 3, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(256 * 8 * 8, 1024)
self.fc2 = nn.Linear(1024, 256)
self.fc3 = nn.Linear(256, 10)
def forward(self, x):
x = F.relu(self.conv1(x))
x = self.pool(F.relu(self.conv2(x)))
x = F.relu(self.conv3(x))
x = self.pool(F.relu(self.conv4(x)))
x = x.view(-1, x.size()[1] * x.size()[2] * x.size()[3])
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
model = Net().cpu()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 模型訓練
def train(model, train_loader, epoch):
model.train()
train_loss = 0
for i, data in enumerate(train_loader, 0):
x, y = data
x = x.cpu()
y = y.cpu()
optimizer.zero_grad()
y_hat = model(x)
loss = criterion(y_hat, y)
loss.backward()
optimizer.step()
train_loss += loss
print('正在進行第{}個epoch中的第{}次循環'.format(epoch,i))
loss_mean = train_loss / (i + 1)
print('Train Epoch: {}\t Loss: {:.6f}'.format(epoch, loss_mean.item()))
# 模型測試
def test(model, test_loader):
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for i, data in enumerate(test_loader, 0):
x, y = data
x = x.cpu()
y = y.cpu()
optimizer.zero_grad()
y_hat = model(x)
test_loss += criterion(y_hat, y).item()
pred = y_hat.max(1, keepdim=True)[1]
correct += pred.eq(y.view_as(pred)).sum().item()
test_loss /= (i + 1)
print('Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_data), 100. * correct / len(test_data)))
def main():
# 如果test_flag=True,則加載已保存的模型并進行測試,測試以后不進行此模塊以后的步驟
if test_flag:
# 加載保存的模型直接進行測試機驗證
checkpoint = torch.load(log_dir)
model.load_state_dict(checkpoint['model'])
optimizer.load_state_dict(checkpoint['optimizer'])
start_epoch = checkpoint['epoch']
test(model, test_load)
return
# 如果有保存的模型,則加載模型,并在其基礎上繼續訓練
if os.path.exists(log_dir):
checkpoint = torch.load(log_dir)
model.load_state_dict(checkpoint['model'])
optimizer.load_state_dict(checkpoint['optimizer'])
start_epoch = checkpoint['epoch']
print('加載 epoch {} 成功!'.format(start_epoch))
else:
start_epoch = 0
print('無保存了的模型,將從頭開始訓練!')
for epoch in range(start_epoch+1, epochs):
train(model, train_load, epoch)
test(model, test_load)
# 保存模型
state = {'model':model.state_dict(), 'optimizer':optimizer.state_dict(), 'epoch':epoch}
torch.save(state, log_dir)
if __name__ == '__main__':
main()
原文鏈接:https://blog.csdn.net/joyce_peng/article/details/104133594
相關推薦
- 2022-09-15 Go語言操作redis數據庫的方法_Golang
- 2022-09-29 go日志庫logrus的安裝及快速使用_Golang
- 2022-04-11 C++實現簡單的計算器小功能_C 語言
- 2022-09-13 python開發sdk模塊的方法_python
- 2024-03-22 【IDEA】@RequestMapping與@GetMapping、@PostMapping的區別
- 2022-10-18 解決VMware?VCSA?5480?后臺登錄提示失敗的問題_VMware
- 2022-12-30 antd之RangePicker設置默認值方式_React
- 2023-04-02 使用C#連接SQL?Server的詳細圖文教程_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支