0
点赞
收藏
分享

微信扫一扫

Pytorch近期学习笔记

文章目录

# 导入模块: 
import torch

torch.randperm(n)

将0~n-1(包括0和n-1)随机打乱后获得的数字序列,函数名是random permutation缩写

torch.randperm(10)
===> tensor([2, 3, 6, 7, 8, 9, 1, 5, 0, 4])

torch.from_numpy()

把数组转换成张量,且二者共享内存,对张量进行修改比如重新赋值,那么原始数组也会相应发生改变。

>>> a = numpy.array([1, 2, 3])
>>> t = torch.from_numpy(a)
>>> t
tensor([ 1, 2, 3])
>>> t[0] = -1
>>> a
array([-1, 2, 3])

torch.Tensor()

是一个类,创建的为float32位的数据类型

torch.tensor()

是一个函数,是对张量数据的拷贝,根据传入data的类型来创建Tensor;

a=torch.Tensor([1,2])
type(a)#<class 'torch.Tensor'>
a.type()#'torch.FloatTensor'

a = torch.tensor([1, 2])
type(a)#<class 'torch.Tensor'>
a.type()#'torch.LongTensor'

a=torch.Tensor([1,2])
a.dtype#torch.float32

a = torch.tensor([1, 2])
a.dtype#torch.int64
a = torch.tensor([1., 2.])
a.dtype#torch.float32


torch.cuda.is_available()

torch能否在GPU上运行,能的话会返回True

torch.optim 优化器

from torch.optim import Adam, SGD
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)

params (iterable):需要优化的网络参数。一般给赋值为net.parameters()。net.parameters()函数返回的parameter groups实际上是一个变成了generator的字典;
也可以同时优化多个网络:
1、将多个网络的参数合并到一起,当成一个网络的参数来优化(一般赋值为[*net_1.parameters(), *net_2.parameters(), …, *net_n.parameters()]或itertools.chain(net_1.parameters(), net_2.parameters(), …, net_n.parameters()));
2、当成多个网络优化,这样可以很容易的让多个网络的学习率各不相同(一般赋值为[{‘params’: net_1.parameters()}, {‘params’: net_2.parameters()}, …, {‘params’: net_n.parameters()})。

实例,假设已经定义好了一个ResNet网络:

model=ResNet()
optimizer = Adam(model.parameters(), lr=0.005)

torch.optim.lr_scheduler调整学习率

torch.optim.lr_scheduler模块提供了一些根据epoch训练次数来调整学习率(learning rate)的方法。一般情况下我们会设置随着epoch的增大而逐渐减小学习率从而达到更好的训练效果。
而torch.optim.lr_scheduler.ReduceLROnPlateau则提供了基于训练中某些测量值使学习率动态下降的方法。

学习率的调整应该放在optimizer更新之后:

>>> scheduler = ...
>>> for epoch in range(100):
>>>     train(...)
>>>     validate(...)
>>>     scheduler.step()

torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer)

不依赖epoch更新lr的只有torch.optim.lr_scheduler.ReduceLROnPlateau。请添加图片描述

torch.optim.lr_scheduler.ExponentialLR(optimizer,gamma=0.999)

请添加图片描述

optimizer.zero_grad(),loss.backward(),optimizer.step(),schedular.step()

# 梯度初始化为零,也就是把loss关于weight的导数变成0:
optimizer.zero_grad()
# 前向传播求出预测的值:
outputs = model(batch_x)
# 求loss:
loss = cost(outputs, batch_y)
# 反向传播求梯度,计算得到每个参数的梯度值:
loss.backward()
# 通过梯度下降执行一步参数更新:
optimizer.step()
# 更新学学习率
scheduler.step()

optimizer.step()通常用在每个mini-batch之中,而scheduler.step()通常用在epoch里面,但是不绝对,可以根据具体的需求来做。只有用了optimizer.step(),模型才会更新,而scheduler.step()是对lr进行调整。

.detach().cpu().numpy()

detach(): 返回一个新的Tensor,但返回的结果是没有梯度的。

cpu():把gpu上的数据转到cpu上。

numpy():将tensor格式转为numpy。

原因:如果想把CUDA tensor格式的数据改成numpy时,需要先将其转换成cpu float-tensor随后再转到numpy格式。 numpy不能读取CUDA tensor 需要将它转化为 CPU tensor

from torch import nn
import torch.nn.functional as F
from torch.nn import CrossEntropyLoss

参考

optimizer&lr_scheduler详见:https://blog.csdn.net/qyhaill/article/details/103043637

举报

相关推荐

0 条评论