文章目录
- torch.randperm(n)
- torch.from_numpy()
- torch.Tensor()
- torch.tensor()
- torch.cuda.is_available()
- torch.optim 优化器
- torch.optim.lr_scheduler调整学习率
- optimizer.zero_grad(),loss.backward(),optimizer.step(),schedular.step()
- .detach().cpu().numpy()
- 参考
# 导入模块:
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