概述
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 = 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)
还有条件概率,联合概率,联合分布等
三、线性神经网络
线性回归
- 线性模型
例:Price = W1area + W2age + b
W1,W2为权重矩阵(weight),b为偏置(bias)、偏移量(offset)或截距(intercept)
偏置是对整个分布进行平移操作
可以用矩阵-向量乘法表示为:y = Wx + b
X的每一行是一个样本,每一列是一种特征 - 损失函数
拟合数据需要确定一个拟合程度的度量,其值越小表示损失越小
平方误差:l(w,b) = 1/2(y1 - y)^2 (添加1/2是为了简易形式,求导后常系数为1) - 随机梯度下降
梯度下降方法(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)
总结
学习了一下线性回归模型,构建简易的线性模型进行训练
最后
以上就是文静翅膀为你收集整理的Pytorch基础语法pytorch入门学习(第二周)一、反向传播梯度计算二、概率计算:三、线性神经网络四、线性回归模型实现总结的全部内容,希望文章能够帮你解决Pytorch基础语法pytorch入门学习(第二周)一、反向传播梯度计算二、概率计算:三、线性神经网络四、线性回归模型实现总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复