【Abstract】本文对该书的第三章第一节进行概括,本章主要描述PyTorch的基础知识。首先是PyTorch的存储结构Tensor;其次描述了三个重要部分:数据读取与处理、网络模型构建、优化策略;最后介绍模型的存储和读取。
文章目录
1. Tensor(张量)
Tensor与numpy
Tensor表示多维矩阵,与numpy对应。
PyTorch可以在GPU上运行,numpy只能在CPU上运行。
类型:
类型 | 含义 |
---|---|
torch.FloatTensor | 32位浮点型 |
torch.DoubleTensor | 64位浮点型 |
torch.ShortTensor | 16位整型 |
torch.IntTensor | 32位整型 |
torchLongTensor | 64位整型 |
torch.Tensor默认为torch.FloatTensor
Tensor初始化与访问
# 初始化
a = torch.Tensor([[2,3],[4,8],[7,9]])
b = torch.LongTensor([[2,3],[4,8],[7,9]])
# 设置初始化大小进行0初始化、随机初始化
c = torch.zeros((3,2))
d = torch.randn((3,2))
# 从numpy初始化Tensor
e = np.array([[2,3],[4,5]])
torch_e = torch.fron_numpy(e)
# 通过索引访问元素,类似numpy
a[0,1] = 100
类型转换
Tensor与numpy.ndarray之间转换 && Tensor间的类型转换
# 从Tensor转换为numpy
numpy_b = b.numpy()
# 从numpy转换为Tensor
e = np.array([[2,3],[4,5]])
torch_e = torch.fron_numpy(e)
# Tensor的类型转换
float_torch_e = torch_e.float()
判断电脑是否支持GPU加速
torch.cuda.is_available()
将tensor在CPU与GPU之间互转
a_cuda = a.cuda()
c_cpu = a_cuda.cpu()
2. Variable(变量)
Variable和Tensor没有本质区别。Variable会被放入一个计算图中,前向传播、反向传播、自动求导。
在Pytorch 0.4.0中,Tensor与Variable合并
3. Dataset(数据集)
机器学习问题都需要先进行数据读取和预处理;PyTorch提供了很多工具来进行数据读取和预处理。
继承定义数据集类
torch.utils.data.Dataset 是代表数据的抽象类,需要定义自己的数据类继承和重写这个抽象类,只需要定义 len和getitem。(定义后即可迭代地读取每个数据)
对数据集的乱序批量迭代
为了批量读取(batch)、打乱数据顺序(shuffle)、多线程,torch.utils.data.DataLoader定义了一个新的迭代器:
dataiter = DataLoader(myDataset, batch_size=32, shuffle=True, collate_fn=default_collate )
对图片类数据
对于计算机视觉方面需要处理的图片数据,torchvision中的ImageFloder。只要求图片存储在对应文件夹下。提供图片增强功能(transform)
dset = ImageFolder(root=‘root_path’, transform=None, loader=default_loader)
4. nn.Module(模组)
PyTorch中写的神经网络:torch.nn 提供所有的层结构和损失函数。
层结构
所有的模型构建都是从基类nn.Module继承而来。
class net_name(nn.Module):
def __init__(self, other_arguments):
super(net_name, self):__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size)
def forward(self, x):
x = self.conv1(x)
return x
Pytorch计算图自动求导,不需要编程人员写反向传播。
损失函数
criterion = nn.CrossEntropyLoss()
loss = criterion(output, target) #output为模型计算输出,target为label
5. torch.optim(优化)
优化算法:一种调整模型参数更新的策略
一阶优化算法
最常用的一阶优化算法是梯度下降:
θ
=
θ
−
η
×
δ
J
(
θ
)
θ
\theta = \theta - \eta \times\frac{\delta J(\theta)}{\theta}
θ=θ−η×θδJ(θ)
二阶优化算法
二阶优化算法使用了二阶导数(Hessian方法)来最小化或最大化损失函数,主要基于牛顿法,由于计算成本高而未能广泛使用。
torch.optim是实现了很多优化算法的包,大多数常见算法可以调用。
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
在优化之前需要先将梯度归零;再反向传播,自动求导各个参数的梯度;最后进行参数更新
optimizer.zeros() #避免更新过的梯度不断累积
# optimizer.zero_grad()
loss.backward()
optimizer.step()
6. 模型的保存和加载
如何保存
使用torch.save()来保存
保存方式
- 保存整个模型的结构信息和参数信息,保存对象是模型model
- 保存模型的参数,保存的对象是模型的状态model.state_dict()
# 方式1
torch.save(model, './model.pth')
# 方式2
torch.save(model.state_dict(), './model_state.pth')
加载方式
对应于两种不同的保存方式
# 方式1
load_model = torch.load('model.pth')
# 方式2
# 加载模型参数信息, 需要先导入模型的结构加载模型参数信息, 需要先导入模型的结构
model.load_state_dic(torch.load('model_state.pth'))
state_dict是一个从参数名称映射到参数Tesnor的字典对象。
2020-12-15
中大 203实验室