Pytorch基础语法

pytorch入门学习(第二周)

目标:使用pytorch实现数据预处理,模型构建,模型训练,完成NLP,CV子任务等。

文章目录

  • pytorch入门学习(第二周)
  • 一、反向传播梯度计算
    • 分离计算:
    • 控制流梯度计算
  • 二、概率计算:
  • 三、线性神经网络
    • 线性回归
    • 矢量化加速
  • 四、线性回归模型实现
    • 读取数据
    • 模型定义
    • 参数初始化
    • 损失函数定义
    • 优化器
    • 训练
  • 总结


一、反向传播梯度计算

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 = u
x
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)

还有条件概率,联合概率,联合分布等

三、线性神经网络

线性回归

  1. 线性模型
    例:Price = W1area + W2age + b
    W1,W2为权重矩阵(weight),b为偏置(bias)、偏移量(offset)或截距(intercept)
    偏置是对整个分布进行平移操作
    可以用矩阵-向量乘法表示为:y = Wx + b
    X的每一行是一个样本,每一列是一种特征
  2. 损失函数
    拟合数据需要确定一个拟合程度的度量,其值越小表示损失越小
    平方误差:l(w,b) = 1/2(y1 - y)^2 (添加1/2是为了简易形式,求导后常系数为1)
  3. 随机梯度下降
    梯度下降方法(gradient descent)通过不断在损失函数递减的方向上更新参数来降低误差
    计算损失函数关于模型的参数的导数,但也因此每次都要遍历整个数据集,执行过程很慢。通常每次会抽取一小部分样本,进行小批量随机梯度下降。
    抽取一个小批量Batch_size,计算其平均损失关于模型参数的梯度乘以n/B用以代表整个样本的梯度下降。

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)

总结

学习了一下线性回归模型,构建简易的线性模型进行训练

你可能感兴趣的:(深度学习,机器学习,python)