线性回归笔记
requires_grad和backward
参见https://www.cnblogs.com/kevin-red-heart/p/11340944.html
- 所有tensor都有的属性.意为自动求导
注意点:x为浮点类型;求导的时候只能是标量对标量,或者标量对向量/矩阵;不是标量也可以用backward()函数求导 - 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
- 源自 class torch.utils.data.Dataset,表示Dataset的抽象类,子类可以通过覆盖len,getitem进行继承,前者表示数据集大小和后者支持整数索引,如
class torch.utils.data.TensorDataset(data_tensor, target_tensor)
,TensorDateset包含数据和目标张量的数据集 - DataLoader 数据加载器,组合数据集和采样器,并在数据集上提供单进程或多进程迭代器。
class torch.utils.data.DataLoader(
dataset, batch_size=1, shuffle=False, #是否乱序
sampler=None,
num_workers=0, #num_workers代表用几个线程读取数据
collate_fn=<function default_collate>, 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指的是经过这么多次迭代,学习率改变一次。