PyTorch保存、加载模型,PyTorch中已封装的网络模型

state_dict()函数可以返回所有的状态数据。load_state_dict()函数可以加载这些状态数据。

推荐使用:

#保存
t.save(net.state_dict(),"net.pth")
#加载
net2=Net()
net2.load_state_dict(t.load("net.pth"))

不推荐直接save与load,因为这种方式严重依赖模型定义方法以及文件路径结构等,容易出问题。

t.save(net,"net.pth")
net2=t.load("net.pth")

 【PyTorch中已封装的网络模型】https://pytorch.org/docs/stable/torchvision/index.html

 从上图看出,有针对分类问题、语义分割、目标识别、视频分类的模型。

以分类模型为例,PyTorch中已封装的模型如下:

 使用方式,参考标黄部分

######################################## 1、使用torchvision加载并预处理数据集

#### datasets的ImageFolder读图
from torchvision.datasets import ImageFolder
dataset=ImageFolder("E:/data/dogcat_2/train/") #获取路径,返回的是所有图的data、label
from torchvision import transforms as T #设置格式化条件
transform=T.Compose([T.Resize((64,64)), 
                     T.ToTensor(), #PIL Image转Tensor,[0,255]自动归一化为[0,1]
                     T.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5]) #标准化,减均值除标准差
                    ])
dataset=ImageFolder("E:/data/dogcat_2/train/",transform=transform)
testset=ImageFolder("E:/data/dogcat_2/test/",transform=transform)

#### DataLoader
from torch.utils.data import DataLoader
dataloader=DataLoader( dataset,batch_size=4,shuffle=True,num_workers=2 )
testloader=DataLoader(testset,batch_size=4,shuffle=True,num_workers=2)

#### 显示第1个batch的4幅图(随机)
from torchvision.transforms import ToPILImage
from torchvision.utils import make_grid
dataiter = iter(dataloader)
(images, labels) = dataiter.next()
print(labels) #打印标签
show=ToPILImage() 
show(make_grid(images*0.5+0.5)).resize((4*64,64)) 

######################################## 2、定义网络
from torchvision import models
net=models.alexnet()

######################################## 3、定义损失函数和优化器
import torch.nn as nn
from torch import optim
criterion=nn.CrossEntropyLoss() #交叉熵损失函数
optimizer=optim.SGD(net.parameters(),lr=0.001,momentum=0.9) #随机梯度下降法,指定要调整的参数和学习率,动量算法加速更新权重

######################################## 4、训练网络并更新网络参数
for epoch in range(2):  # 在整个数据集上轮番训练多次,轮训一次叫一个回合(epoch)

    running_loss = 0.0
    for i, data in enumerate(dataloader, 0):
        
        # 输入数据
        inputs, labels = data
        
        # 梯度清零
        optimizer.zero_grad()

        # forward + backward
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        
        #更新参数
        optimizer.step()

        # 打印一些关于训练的统计信息
        running_loss += loss.item()
        if i % 200 == 199:    # 每 200 个batch打印一次
            print('[%d, %5d] loss: %.3f' %(epoch + 1, i + 1, running_loss / 200))
            running_loss = 0.0

print('Finished Training')

######################################## 5、测试网络
import torchvision as tv
import torch as t
#datasets测试集中前4幅图,并输出标签
dataiter = iter(testloader)
(images, labels) = dataiter.next() #返回1个batch(4张图)

# 输出图像和正确的类标签
#print('实际的label:', ' '.join('%5s' % classes[labels[j]] for j in range(4)))
show(tv.utils.make_grid((images+1)/2)).resize((400,100))

#测试
outputs = net(images) #预测上边得到的batch(4张图),返回得分(每一类都打分)
_, predicted = t.max(outputs, 1) #每1张图得分最高的那个类的下标

print(outputs)
print(predicted)
#print('预测结果:', ' '.join('%5s' % classes[predicted[j]] for j in range(4)))
show(tv.utils.make_grid((images+1)/2)).resize((400,100))

#测试整个测试集
correct = 0 #预测正确的图片数
total = 0 #总共的图片数
with t.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = t.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('10000张测试集中的准确率: %d %%' % (100 * correct / total))

 

posted @ 2020-04-27 14:01  夕西行  阅读(2064)  评论(0编辑  收藏  举报