模型构造
继承MODULE类来构造模型
Module 类是 nn 模块⾥提供的⼀个模型构造类,是所有神经⽹络模块的基类,我们可以继承它来定义我们想要的模型。下⾯继承 Module 类构造本节开头提到的多层感知机。这⾥定义的 MLP 类加载了Module 类的 init 函数和 forward 函数。它们分别⽤于创建模型参数和定义前向计算。前向计算也即正向传播。
import torch
from torch import nn
class MLP(nn.Module):
# '''声明了两个全连接层
def __int__(self,**kwargs):
# 调⽤MLP⽗类Block的构造函数来进⾏必要的初始化。这样在构造实例时还可
#以指定其他函数
super(MLP,self).__init__(**kwargs)
self.hidden=nn.Linear(784,256)#隐藏层
self.act=nn.ReLU()
self.output=nn.Linear(256,10)#输出层
# 定义模型的前向计算,即如何根据输⼊x计算返回所需要的模型输出
def forward(self,x):
a=self.act(self.hidden(x))
return self.output(a)
以上的 MLP 类中⽆须定义反向传播函数。系统将通过⾃动求梯度⽽⾃动⽣成反向传播所需的
backward 函数。
我们可以实例化 MLP 类得到模型变量 net 。下⾯的代码初始化 net 并传⼊输⼊数据 X 做⼀次前向计
算。其中, net(X) 会调⽤ MLP 继承⾃ Module 类的 call 函数,这个函数将调⽤ MLP 类定义的
forward 函数来完成前向计算。
MODULE的子类
事实上,PyTorch还实现了继承⾃ Module 的可以⽅便
构建模型的类: 如 Sequential 、 ModuleList 和 ModuleDict 等等
Sequential类
当模型的前向计算为简单串联各个层的计算时, Sequential 类可以通过更加简单的⽅式定义模型。这
正是 Sequential 类的⽬的:它可以接收⼀个⼦模块的有序字典(OrderedDict)或者⼀系列⼦模块作为参数来逐⼀添加 Module 的实例,⽽模型的前向计算就是将这些实例按添加的顺序逐⼀计算。
下⾯我们实现⼀个与 Sequential 类有相同功能的 MySequential 类。
模型参数的访问,初始化和共享
我们通过 init 模块来初始化模型的参数。我们也介绍了访问模型参数的简单⽅法。本节将深⼊讲解如何访问和初始化模型参数,以及如何在多个层之间共享同⼀份模型参数。
import torch
from torch import nn
from torch.nn import init
net = nn.Sequential(nn.Linear(4, 3), nn.ReLU(), nn.Linear(3, 1)) #
pytorch已进⾏默认初始化
print(net)
X = torch.rand(2, 4)
Y = net(X).sum()
访问模型参数
print(type(net.named_parameters()))
for name, param in net.named_parameters():
print(name, param.size())
初始化模型参数
读取和存储
到⽬前为⽌,我们介绍了如何处理数据以及如何构建、训练和测试深度学习模型。然⽽在实际中,我们
有时需要把训练好的模型部署到很多不同的设备。在这种情况下,我们可以把内存中训练好的模型参数存储在硬盘上供后续读取使⽤。
读写 TENSOR
我们可以直接使⽤ save 函数和 load 函数分别存储和读取 Tensor 。 save 使⽤Python的pickle实⽤程序将对象进⾏序列化,然后将序列化的对象保存到disk,使⽤ save 可以保存各种对象,包括模型、张量和字典等。⽽ laod 使⽤pickle unpickle⼯具将pickle的对象⽂件反序列化为内存。
下⾯的例⼦创建了 Tensor 变量 x ,并将其存在⽂件名同为 x.pt 的⽂件⾥。
import torch
from torch import nn
x=torch.ones(3)
torch.save(x,'x.pt')
#然后将数据从存储的文件读回内存
x2=torch.load('x.pt')
我们还可以存储⼀个 Tensor 列表并读回内存。
y=torch.zeros(4)
torch.save([x,y],'xy.pt')
xy_list=torch.load('xy.pt')
xy_list
读写 模型
在 PyTorch 中 , Module 的 可 学 习 参 数 ( 即权᯿和偏差 ) ,模块模型包含在参数中 ( 通 过
model.parameters() 访问)。 state_dict 是⼀个从参数名称隐射到参数 Tesnor 的字典对象。
保存和加载模型
PyTorch中保存和加载训练模型有两种常⻅的⽅法:
- 仅保存和加载模型参数( state_dict );
- 保存和加载整个模型。
GPU计算
到⽬前为⽌,我们⼀直在使⽤CPU计算。对复杂的神经⽹络和⼤规模的数据来说,使⽤CPU来计算可能
不够⾼效。在本节中,我们将介绍如何使⽤单块NVIDIA GPU来计算。所以需要确保已经安装好了
PyTorch GPU版本。准备⼯作都完成后,下⾯就可以通过 nvidia-smi 命令来查看显卡信息了。
PyTorch可以指定⽤来存储和计算的设备,如使⽤内存的CPU或者使⽤显存的GPU。默认情况下,
PyTorch会将数据创建在内存,然后利⽤CPU来计算。
#查看GPU是否可用
import torch
from torch import nn
torch.cuda.available()
#查看数量
torch.cuda.device_count()
#查看名字
torch.cuda.get_device_name(0)
device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')
x=torch.tensor([1,2,3],device=device)
#或着
x=torch.tensor([1,2,3]).to(device)
二维卷积层
填充和步幅
卷积神经网络
LENET模型
深度卷积神经⽹络(ALEXNET)
VGG网络
参考文献:[
动手学深度学习(李沐)的pytorch版本(包含代码和pdf链接:https://pan.baidu.com/s/17uEh4x_GbO0F67bzgQkhuQ
提取码:cgbq