深度学习入门PyTorch-阅读笔记1-PyTorch基础

本文介绍了PyTorch的基础知识,包括Tensor与numpy的交互、Variable的概念、数据集的处理、nn.Module的层结构和损失函数,以及torch.optim的优化算法。还讲解了模型的保存和加载方法。
摘要由CSDN通过智能技术生成

【Abstract】本文对该书的第三章第一节进行概括,本章主要描述PyTorch的基础知识。首先是PyTorch的存储结构Tensor;其次描述了三个重要部分:数据读取与处理、网络模型构建、优化策略;最后介绍模型的存储和读取。

1. Tensor(张量)

Tensor与numpy

Tensor表示多维矩阵,与numpy对应。

PyTorch可以在GPU上运行,numpy只能在CPU上运行。

类型:
类型含义
torch.FloatTensor32位浮点型
torch.DoubleTensor64位浮点型
torch.ShortTensor16位整型
torch.IntTensor32位整型
torchLongTensor64位整型

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 是代表数据的抽象类,需要定义自己的数据类继承和重写这个抽象类,只需要定义 lengetitem。(定义后即可迭代地读取每个数据)

对数据集的乱序批量迭代

为了批量读取(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()来保存

保存方式
  1. 保存整个模型的结构信息和参数信息,保存对象是模型model
  2. 保存模型的参数,保存的对象是模型的状态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实验室

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值