<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
# 方式一:儲存載入整個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()
# 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)
# 列印模型的 state_dict print("Model's state_dict:") for param_tensor in model.state_dict(): print(param_tensor, "t", model.state_dict()[param_tensor].size())
多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儲存和載入檔案的方法''' 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()
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45