Pytorch从零开始#数据操作—自学笔记之图表对比展示

#创建Tensor
⾸先导⼊PyTorch:
import torch
创建Tensor、查看形状
#Tensor的索引、view()函数、处理形状不同数组的广播机制

#自动梯度求导
在深度学习中,我们经常需要对函数求梯度(gradient)。
举个例⼦,假设形状为 m xn 的矩阵 X 经过运算得到了 p x q 的矩阵 Y,Y ⼜经过运算得到了 s x t 的矩阵 Z。那么按照
规则,dZ/dY 应该是⼀个 s x t x p x q 四维张量,dY/dX 是⼀个 p x q x m x n的四维张量。问题来了,怎样反向传播?怎样将两个四维张量相乘???这要怎么乘???就算能解决两个四维张量怎么乘的问题,四维和三维的张量⼜怎么乘?导数的导数⼜怎么求,这⼀连串的问题,感觉要疯掉…… 为了避免这个问题,我们不允许张量对张量求导,只允许标量对张量求导,求导结果是和⾃变量同形的张量。
PyTorch提供的autograd 包能够根据输⼊
和前向传播过程⾃动构建计算图,并执⾏反向传播。本节将介绍如何使⽤autograd包来进⾏⾃动求梯
度的有关操作。
仔细观察下图Tensor的流动
在这里插入图片描述

在这里插入图片描述
⾃动求梯度涉及的关键函数如下表:
下图代码中涉及的参数
在这里插入图片描述
#线性回归
##模型
本次预测属于回归问题。有两个feature。线性回归假设输出与各个输入之间是线性关系:
在这里插入图片描述##数据集
在机器学习术语里,该数据集被称为训练数据集(training data set)或训练集(training set),一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。特征用来表征样本的特点。

# set input feature number 
num_inputs = 2
# set example number
num_examples = 1000

# set true weight and bias in order to generate corresponded label
true_w = [2, -3.4]
true_b = 4.2

features = torch.randn(num_examples, num_inputs,
                      dtype=torch.float32)
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()),
                       dtype=torch.float32)

##损失函数
在模型训练中,我们需要衡量价格预测值与真实值之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。 它在评估索引为 ii 的样本误差的表达式为

def squared_loss(y_hat, y): # 本函数已保存在d2lzh_pytorch包中⽅便以后使# 注意这⾥返回的是向量, 另外, pytorch⾥的MSELoss并没有除以 2
 return (y_hat - y.view(y_hat.size())) ** 2 / 2

优化函数 - 随机梯度下降
当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。

在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch) BB ,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。

学习率: η 代表在每次优化中,能够学习的步长的大小
批量大小: B是小批量计算中的批量大小batch size

def sgd(params, lr, batch_size): # 本函数已保存在d2lzh_pytorch包中⽅便
以后使⽤
 for param in params:
 param.data -= lr * param.grad / batch_size # 注意这⾥更改param
时⽤的param.data


模型训练:

在⼀个迭代周期(epoch)中,我们将完整遍历⼀遍 data_iter 函数,并对训练数据集中所有样本都
使⽤⼀次(假设样本数能够被批量⼤⼩整除)。这⾥的迭代周期个数 num_epochs 和学习率 lr 都是超
参数,分别设3和0.03。

lr = 0.03
num_epochs = 3
net = linreg
loss = squared_loss
for epoch in range(num_epochs): # 训练模型⼀共需要num_epochs个迭代周期

 # 在每⼀个迭代周期中,会使⽤训练数据集中所有样本⼀次(假设样本数能够被批量⼤
⼩整除)。X
 # 和y分别是⼩批量样本的特征和标签
 for X, y in data_iter(batch_size, features, labels):
 l = loss(net(X, w, b), y).sum() # l是有关⼩批量X和y的损失
 l.backward() # ⼩批量的损失对模型参数求梯度
 sgd([w, b], lr, batch_size) # 使⽤⼩批量随机梯度下降迭代模型参数
 
 # 不要忘了梯度清零
 w.grad.data.zero_()
 b.grad.data.zero_()
 train_l = loss(net(features, w, b), labels)
 print('epoch %d, loss %f' % (epoch + 1, train_l.mean().item()))

整理中!
未完待续,敬请期待。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值