1.pytorch模型加载的方法

  • pytorch有两种模型保存方法

1.1 保存整个神经网络的结构信息和模型的参数信息,save的对象是网络net

  • 该方法保存的模型通过torch.load(’.pth’) ,直接初始化新的神经网络对象;
#保存模型
torch.save(model_object,'resnet.pth')
#加载模型
model=torch.load('resnet.pth')

1.2. 只保存神经网络的训练模型参数,save的对象是net.state_dict()

  • 该方法保存的方式:首先是导入对应的网络,再通过net.load_state_dict(torch.load(’.pth’))完成模型参数的加载;
#将my_resnet模型存储为my_resnet.pth
torch.save(my_resnet.state_dict(),"my_resnet.pth")
#加载resnet,模型存放在my_resnet.pth
my_resnet.load_state_dict(torch.load("my_resnet.pth"))
#其中my_resnet是my_resnet.pth对应的网络结构;

1.3pytorch预训练模型

  1. 加载预训练模型
#pytorch中torchvision里面有很多常用的模型,可以直接调用;
#resnet101=models.resnet18()
#alexnet=models.alexnet()
#squeezenet=models.squeezenet1_0()
#densenet=models.densenet_161()
import torchvision.models as models
#加载预训练的模型和参数
resnet18=models.resnet18(pretrained=True)
#当pretrained参数设置为True时是加载预训练模型和参数;可能由于网络原因无法下载,请从github上的手动下载; 

1.4只加载模型,不加载预训练的参数

#导入模型结构
resnet18=models.resnet18(pretrained=False)
#加载预先下载好的预训练模型参数到resnet18中
resnet18.load_state_dict(torch.load('resnet18-5c106cde.pth'))

1.5加载部分预训练模型

  • 其实大多数时候,我们需要根据我们的任务调节我们的模型,所以很难保持模型和公开的模型完全一样,但是预训练模型的参数确是有助于提供训练的准确率,为了结合两者的优点,就需要我们加载部分的预训练模型;
resnet152=models.resnet152(pretrained=True)
pretrained_dict=resnet152.state_dict()
#加载torchvision中预训练的模型和参数后通过statie_dict()方法提取参数
#也可以直接从官网下载model_zoo
#pretrained_dict=model_zoo.load_url(model_urls['resnet152'])
model_dict=model.state_dict()
#将pretrained_dict里不属于model_dict的键去除掉
pretrained_dict={k:v for k,v in pretrained_dict.items() if k in model_dict}
#更新现有的model_dict
model_dict.update(pretrained_dict)
#加载真正需要的state_dict
model.load_state_dict(model_dict)

1.6微该基础模型

  • 对于一些任务而言,有些层并不是直接能用的,需要我们进行稍微改一下,比如,resnet最后的全连接层是分1000类,而我们此时只要21类;又比如,resnet第一层卷积层接收的通过是3,我们可以输入图片的通道是4,那么可以通过以下方法进行修改:
resnet.conv1=nn.Conv2d(4,64,kernel_size=7,stride=2,padding=3,bias=False)
resnet.fc=nn.Linear(2048,21)

  • 简单预训练
#首先从torchvision中调用基本模型,加载预训练的模型,然后,将其中的层直接替换为我们需要的层:
resnet=torchvision.models.resnet152(pretrained=True)
#上面预训练的参数会直接加载预训练的模型,
#原先为1000类,改为10类即替换
resnet.fc=torch.nn.Linear(2048,10)

2.pytorch使用总结(持续更新…)

  • torch.Tensor:是一个多维数组
  • autograd.Variable:改变Tensor并记录下操作的历史记录。和Tensor拥有相同的API,以及backward()的一些API,同时包含这和张量相关的梯度;
  • nn.Module :神经网络模块,便捷的数据封装,能够将运算移往GPU,还包括一些输入输出的东西;
  • nn.Parameter :一种变量,当将任何值赋予Module时自动注册为一个参数;
  • autograd.Function:实现了使用自动求导方法的前馈和后馈的定义,每个Variable的操作都会生最少一个独立的Function节点,与生成的Variable的函数相连后记录下的操作记录;

2.1Tensors与numpy之间的转换

#这里演示的是tensor和numpy数据结构的相互转换
import torch
a=torch.ones(5)  #生成5个float型的1
b=a.numpy()  #将a和b关联,torch的tensor转为numpy型的a
a.add_(1)  #数组a中所有元素加1
print(a)
print(b)   #相关联的数组b的值也都加了1;

#将numpy中的array转换为torch的Tensor
import numpy as np
a=np.ones(5)
b=torch.from_numpy(a)
np.add(a,1,out=a)  #所有元素加1
print(a)
print(b)  #数组b也改变了

2.2autograd.Variable类

  • autograd.Variable这个包是最核心的类;它包装了一个Tensor,并且几乎支持所以的定义在其上的操作。一旦完成了你的运算,你可以调用.backward()来自动计算出所以的梯度;
  • 可以通过属性.data来访问原始的tensor,而关于这一Variable的梯度则集中在.grad属性中;

2.3torch.nn只接受小批量的数据

  • 整个torch.nn包只接受那种小批量样本的数据,而不是单个样本,例如,nn.Conv2d的结构是一个四维的Tensor n Samples x n Channels x Height x Width.如果输入的是单个样本,但是input.unsqueeze(0)来加一个假维度就可以了;

2.4数据的读入

  • 通常来讲,当处理图像,声音,文本,视频时需要使用python中的其他独立的包将它们转换为numpy中的数组,之后再转换为torch.*Tensor
  1. 图像的话,可以使用Pillow,OpenCV
  2. 声音处理可以使用scipy和librosa
  3. 文本的处理使用原生的python或Cython以及NLTK和SpaCy都可以;
  • 特别,对于图像,我们有torchvision这个包可用,其中包含了一些现成的数据集如:imagenet,CIFAR10,MNIST等等,同时还有一些转换图像用的工具。这样非常的方便并且避免了写样版代码

参考:
pytorch中文官方文档
github下pytorch模型下载
pytorh加载模型和参数
pytorch预训练
pytorch使用总结

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐