动手学深度学习(PyTorch实现)(一)--线性回归
线性回归
- 前言
- 1. 线性回归的基本要素
- 1.1 模型
- 1.2 数据集
- 1.3 损失函数
- 1.4 优化函数
- 2. 线性回归的PyTorch实现
- 2.1 导入相应的包
- 2.2 生成数据集并读取
- 2.3 定义线性回归模型并初始化模型参数
- 2.4 定义损失函数和优化函数
- 2.5 训练模型
前言
本系列博客是基于《动手学深度学习》的PyTorch实现,对PyTorch不熟悉的同学可以参考PyTorch入门专栏。感谢伯禹学习平台。
1. 线性回归的基本要素
1.1 模型
以房价预测为例,假设房价只取决于面积(平方米)和房龄(年)两个因素,b那么线性回归假设输出与各个输入之间是线性关系:
price=warea⋅area+wage⋅age+b\mathrm{price} = w_{\mathrm{area}} \cdot \mathrm{area} + w_{\mathrm{age}} \cdot \mathrm{age} + b price=warea⋅area+wage⋅age+b
1.2 数据集
我们通常收集一系列的真实数据,例如多栋房屋的真实售出价格和它们对应的面积和房龄。我们希望在这个数据上面寻找模型参数来使模型的预测价格与真实价格的误差最小。在机器学习术语里,该数据集被称为训练数据集(training data set)或训练集(training set),一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。特征用来表征样本的特点。
1.3 损失函数
在模型训练中,我们需要衡量价格预测值与真实值之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。 它在评估索引为 iii 的样本误差的表达式为
l(i)(w,b)=12(y^(i)−y(i))2,l^{(i)}(\mathbf{w}, b) = \frac{1}{2} \left(\hat{y}^{(i)} - y^{(i)}\right)^2, l(i)(w,b)=21(y^(i)−y(i))2,
L(w,b)=1n∑i=1nl(i)(w,b)=1n∑i=1n12(w⊤x(i)+b−y(i))2.L(\mathbf{w}, b) =\frac{1}{n}\sum_{i=1}^n l^{(i)}(\mathbf{w}, b) =\frac{1}{n} \sum_{i=1}^n \frac{1}{2}\left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)^2. L(w,b)=n1i=1∑nl(i)(w,b)=n1i=1∑n21(w⊤x(i)+b−y(i))2.
1.4 优化函数
当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。
在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch)B\mathcal{B}B,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。
(w,b)←(w,b)−η∣B∣∑i∈B∂(w,b)l(i)(w,b)(\mathbf{w},b) \leftarrow (\mathbf{w},b) - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{(\mathbf{w},b)} l^{(i)}(\mathbf{w},b) (w,b)←(w,b)−∣B∣ηi∈B∑∂(w,b)l(i)(w,b)
学习率: η\etaη代表在每次优化中,能够学习的步长的大小
批量大小: B\mathcal{B}B是小批量计算中的批量大小batch size
2. 线性回归的PyTorch实现
线性回归的PyTorch实现主要包括以下几个步骤:
- 导入相应的pkg
- 生成并读取随机数据集
- 定义线性回归模型并初始化模型参数
- 定义损失函数和优化函数
- 训练模型,比较训练得到的参数和真实参数的差别
2.1 导入相应的包
import torch
from torch import nn
import numpy as np
torch.manual_seed(1)torch.set_default_tensor_type('torch.FloatTensor')
备注:
- torch.manual_seed(1) :是用来设计随机初始化种子,便于PyTorch的结果可以复现
2.2 生成数据集并读取
生成随机数据集和数据集标签:
# 特征维度
num_inputs = 2
# 样本数
num_examples = 1000# 真实的线性回归模型参数w和b
true_w = [2, -3.4]
true_b = 4.2# 生成正态分布的数据集,并转为tensor变量
features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
# 根据回归模型参数w和b生成标签
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.float)
备注:
- 使用PyTorch构建学习模型时要将变量转化为tensor类型
- np.random.normal() 生成随机的符合正太分布的数据
读取数据集:
import torch.utils.data as Data# 设置每次训练的小批量样本数为10
batch_size = 10# 将特征与标签合并在dataset中
dataset = Data.TensorDataset(features, labels)# 定义数据加载的方式,并将dataset放入DataLoader中
data_iter = Data.DataLoader(dataset=dataset, # torch TensorDataset formatbatch_size=batch_size, # mini batch size# shuffle=True 为随机加载shuffle=True, # whether shuffle the data or not# 2个线程进行加载num_workers=2, # read data in multithreading
)
我们可以试着运行一下加载一个batch的数据:
for X, y in data_iter:print(X, '\n', y)break
输出为:
2.3 定义线性回归模型并初始化模型参数
利用torch中的nn.Module模块定义线性回归模型:
class LinearNet(nn.Module):def __init__(self, n_feature):# call father function to init super(LinearNet, self).__init__() # function prototype: `torch.nn.Linear(in_features, out_features, bias=True)`self.linear = nn.Linear(n_feature, 1) # 前向传播def forward(self, x):y = self.linear(x)return y
初始化模型参数:
from torch.nn import init
# 定义net为线性回归模型
net = LinearNet(num_inputs)
# 对模型的权重进行正态分布初始化,均值为0,标准差为0.01
init.normal_(net[0].weight, mean=0.0, std=0.01)
# 对偏差初始化为0
init.constant_(net[0].bias, val=0.0)
2.4 定义损失函数和优化函数
损失函数可以使用torch中的nn.Module模块进行快速定义
定义损失函数:
# 定义损失函数为绝方差函数
# 函数原型为:torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')`
loss = nn.MSELoss()
优化函数可以使用torch中的torch.optim模块进行快速定义
定义优化函数:
import torch.optim as optim
# 优化函数为随机梯度下降函数SGD,学习率lr=0.3
optimizer = optim.SGD(net.parameters(), lr=0.03)
2.5 训练模型
训练过程如下:
# 定义epoch即训练周期为3
num_epochs = 3
# 对每一个周期进行训练
for epoch in range(1, num_epochs + 1):# x 是训练集,y是标签for X, y in data_iter:# 将训练集输入到模型中output = net(X)# 计算损失l = loss(output, y.view(-1, 1))# 进行梯度清零optimizer.zero_grad() # 对损失进行反向传播l.backward()# 更新权重值optimizer.step()# 每一个epoch进行结果的打印print('epoch %d, loss: %f' % (epoch, l.item()))
训练结果为:
对训练的模型进行测试:
dense = net[0]
print(true_w, dense.weight.data)
print(true_b, dense.bias.data)
测试结果如下:
发现训练之后的模型的参数与真实参数接近,说明模型的训练效果是很好的。
动手学深度学习(PyTorch实现)(一)--线性回归相关推荐
- 动手学深度学习Pytorch Task01
深度学习目前以及未来都有良好的发展前景.正值疫情期间,报名参加了动手学深度学习pytorch版的公开课,希望在以后的学习生活中能够灵活运用学到的这些知识. 第一次课主要包含三个部分:线性回归.soft ...
- 伯禹公益AI《动手学深度学习PyTorch版》Task 03 学习笔记
伯禹公益AI<动手学深度学习PyTorch版>Task 03 学习笔记 Task 03:过拟合.欠拟合及其解决方案:梯度消失.梯度爆炸:循环神经网络进阶 微信昵称:WarmIce 过拟合. ...
- 【动手学深度学习PyTorch版】6 权重衰退
上一篇移步[动手学深度学习PyTorch版]5 模型选择 + 过拟合和欠拟合_水w的博客-CSDN博客 目录 一.权重衰退 1.1 权重衰退 weight decay:处理过拟合的最常见方法(L2_p ...
- 伯禹公益AI《动手学深度学习PyTorch版》Task 07 学习笔记
伯禹公益AI<动手学深度学习PyTorch版>Task 07 学习笔记 Task 07:优化算法进阶:word2vec:词嵌入进阶 微信昵称:WarmIce 优化算法进阶 emmmm,讲实 ...
- 伯禹公益AI《动手学深度学习PyTorch版》Task 05 学习笔记
伯禹公益AI<动手学深度学习PyTorch版>Task 05 学习笔记 Task 05:卷积神经网络基础:LeNet:卷积神经网络进阶 微信昵称:WarmIce 昨天打了一天的<大革 ...
- 伯禹公益AI《动手学深度学习PyTorch版》Task 06 学习笔记
伯禹公益AI<动手学深度学习PyTorch版>Task 06 学习笔记 Task 06:批量归一化和残差网络:凸优化:梯度下降 微信昵称:WarmIce 批量归一化和残差网络 BN和Res ...
- 【动手学深度学习PyTorch版】12 卷积层
上一篇移步[动手学深度学习PyTorch版]11 使用GPU_水w的博客-CSDN博客 目录 一.卷积层 1.1从全连接到卷积 ◼ 回顾单隐藏层MLP ◼ Waldo在哪里? ◼ 原则1-平移不变性 ...
- 李沐动手学深度学习(pytorch版本)d2lzh_pytorch包的缺少安装问题
学习深度学习时候,很多人参考的是李沐的动手学深度学习Pytorch版本(附上官方地址:https://tangshusen.me/Dive-into-DL-PyTorch/#/). 在学习3.5.1节 ...
- 【动手学深度学习PyTorch版】19 网络中的网络 NiN
上一篇请移步[动手学深度学习PyTorch版]18 使用块的网络 VGG_水w的博客-CSDN博客 目录 一.网络中的网络 NiN 1.1 NiN ◼ 全连接层的问题 ◼ 大量的参数会带来很多问题 ◼ ...
最新文章
- 2021-10-28 SAP Spartacus SSR 性能方面的一些学习笔记
- AI行业真实现状:做芯片没工作,做视觉、语音血赚
- css 涟漪,CSS3水波涟漪动画定位样式如何制作
- 如何发布.Net MVC 网站项目(攻略集锦)
- 作者:周园春(1975-),男,中国科学院计算机网络信息中心研究员、博士生导师...
- javaScript实现选中文字提示新浪微博分享的效果
- SpringBoot 注解 @Configuration @PropertySource @Value
- 解释stateless worker
- CCF202104-3 DHCP服务器(100分)【模拟】
- tcp协议报文和三次握手与四次挥手
- AbiWord 中Piece Table 数据结构的实现----AbiWord Documentation
- ARM汇编,MCR和MRC
- ViBe算法source code
- 三到五年Java简历模板
- 将数据库中的表结构导出到excel中(写数据库设计说明书)
- vue使用element 上传图片,修改图片
- 工欲善其事必先利其器-极客工具
- thinkpad e450c 键盘拆解
- 该怎么图片转文字?怎么高效提取图片文字呢?
- 在面试中如何回答面试官的问题