2020-02-15

线性回归笔记

requires_grad和backward

参见https://www.cnblogs.com/kevin-red-heart/p/11340944.html

  1. 所有tensor都有的属性.意为自动求导
    注意点:x为浮点类型;求导的时候只能是标量对标量,或者标量对向量/矩阵;不是标量也可以用backward()函数求导
  2. eg: x=tensor.ones(2,4)
    x.requires_grad_(requires_grad=True)
    3.backward: 一般来说在神经网络里面,loss会是一个标量,那么我们让loss对神经网络的参数w求导,直接通过loss.backward()即可。
    但是,有时候我们可能会有多个输出值,比如loss=[loss1,loss2,loss3],那么我们可以让loss的各个分量分别对x求导,这个时候就采用:       loss.backward(torch.tensor([[1.0,1.0,1.0,1.0]]))
    如果你想让不同的分量有不同的权重,那么就赋予gradients不一样的值即可,比如:         loss.backward(torch.tensor([[0.1,1.0,10.0,0.001]]))
    这样,我们使用起来就更加灵活了,虽然也许多数时候,我们都是直接使用.backward()就完事儿了。一个计算图只能backward一次,改善方法:retain_graph=True但是这样会吃内存!尤其是,你在大量迭代进行参数更新的时候,很快就会内存不足,memory out了。

TensorDataset/Dataset

  1. 源自 class torch.utils.data.Dataset,表示Dataset的抽象类,子类可以通过覆盖len,getitem进行继承,前者表示数据集大小和后者支持整数索引,如
    class torch.utils.data.TensorDataset(data_tensor, target_tensor),TensorDateset包含数据和目标张量的数据集
  2. DataLoader 数据加载器,组合数据集和采样器,并在数据集上提供单进程或多进程迭代器。
class torch.utils.data.DataLoader(
dataset, batch_size=1, shuffle=False,  #是否乱序
sampler=None, 
num_workers=0,   #num_workers代表用几个线程读取数据
collate_fn=, pin_memory=False, drop_last=False) 

Pytoch参数初始化

PyTorch提供了多种参数初始化函数:

torch.nn.init.constant(tensor, val)
torch.nn.init.normal(tensor, mean=0, std=1)
torch.nn.init.xavier_uniform(tensor, gain=1)

这里的参数可以是tensor类型,也可是Variable类型,而神经网络的参数类型Parameter是Variable类的子类,所以初始化函数可以直接作用于神经网络参数

Pytorch中的optimizer.step()和scheduler.step()

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

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum = 0.9)
scheduler = lr_scheduler.StepLR(optimizer, step_size = 100, gamma = 0.1)
model = net.train(model, loss_function, optimizer, scheduler, num_epochs = 100)

在scheduler的step_size表示scheduler.step()每调用step_size次,对应的学习率就会按照策略调整一次。所以如果scheduler.step()是放在mini-batch里面,那么step_size指的是经过这么多次迭代,学习率改变一次。

你可能感兴趣的:(2020-02-15)