目标:使用pytorch实现数据预处理,模型构建,模型训练,完成NLP,CV子任务等。
Pytorch框架可以自动计算导数,首先需要将梯度添加到想要计算偏导数的变量上,然后记录目标值计算,通过反向传播函数得到梯度值
.requires_grad()需要梯度信息
.backward() 使用反向传播函数自动计算y关于x的梯度
.grad.zero_()梯度清零
对非标量反向传播计算需要指定变量元素
x.grad.zero_()
y.sum().backward()
x.grad == 2*x
tensor([True, True, True, True])
.detach()
y = xx
u = y.detach()
z = ux
z.sum().backward()
x.grad == u
tensor([True, True, True, True])
z原本是z关于x,y的函数,在某些需求下可以使用.detach()函数单独将y分离出来
对于python构建的条件、循环、函数调用等控制流,仍能通过.backward()计算其梯度
例如:
d = f(a)
d.backward()
抽样函数:.sample()
多项分布函数(离散数据的概率分布):.Multinomial()
例如:
骰子模拟:
fair_probs = torch.ones([6])/6
multiomial.Mutinomial(1,fair_probs).sample()
实现随机抽样,输出input张量对应行的下标
函数第一个参数为需要随机抽样的次数,fair_probs为抽样的权重分配
对于权重为0的元素行下标,不放回抽取下(replacement = False),在非0元素被抽取完前不会被抽到
进行500次抽样,每次抽样10个样本
counts = multinomial.Multinomial(10,fair_probs).sample((500,))
cum_counts = counts.cumsum(dim=0)
estimate = cum_counts / cum_counts.sum(dim=1, keepdims=True)
还有条件概率,联合概率,联合分布等
Batch_size与学习率n并不在训练中更新,而是手动指定称为超参数,调参就是调超参数的过程,根据迭代结果进行调整。
计算进行矢量化,利用线性代数库相比于在python中编写for循环来的快。
例如:向量的+调用和for循环对比
读取数据使用迭代器方式更为节省消耗,
dataset = data.TensorDateset(*data_arrays)
data.DataLoader(dataset, batch_size, shuffle=is_trian)
data_iter = load_array((features, labels), batch_size)
Net = nn.Sequential(nn.Linear(2,1))
有两个参数,第一个为输入特征形状,第二个为输出特征形状
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)
权值初始化为均值为0,标准差为0.01的正态分布随机采样
偏置初始化为0
Loss = nn.MSEloss() 线性回归采用平方L2范数
小批量随机梯度下降是优化神经网络的标准工具,net.parameters()可以获得模型所有的参数,也可以指定优化其中某些参数
trainer = torch.optim.SGD(net.parameters(), lr=0.03)
前向传播计算损失,反向传播计算梯度,之后由优化器来更新参数,每迭代一个周期,打印一次信息
epochs = 3
for epoch in range(epochs):
for x,y in data_iter:
l = loss(net(x),y)
trainer.zero_grad()
l.backward()
trainer.step()
l = loss(net(features),labels)
学习了一下线性回归模型,构建简易的线性模型进行训练