| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 深度学习PyTorch笔记(11):线性神经网络 -> 正文阅读 |
|
[人工智能]深度学习PyTorch笔记(11):线性神经网络 |
深度学习PyTorch笔记(11):线性神经网络这是《动手学深度学习》(PyTorch版)(Dive-into-DL-PyTorch)的学习笔记,里面有一些代码是我自己拓展的。 其他笔记在专栏 深度学习 中。 这并不是简单的复制原文内容,而是加入了自己的理解,里面的代码几乎都有详细注释!!! 5 线性神经网络5.1 线性回归5.1.1 线性回归的基本元素(1)线性模型:特征与权重的点积加上偏置 将所有特征放到向量 x ∈ R d \mathbf{x} \in \mathbb{R}^d x∈Rd中,并将所有权重放到向量 w ∈ R d \mathbf{w} \in \mathbb{R}^d w∈Rd中,我们可以用点积形式来简洁地表达模型: y ^ = w ? x + b . \hat{y} = \mathbf{w}^\top \mathbf{x} + b. y^?=w?x+b. 线性模型可以看作是单层神经网络(输入层x,每个箭头代表一个权重,一个输出层y)。 (2)损失函数:衡量我们设计的模型的质量 (3)训练数据:收集一些数据点来决定参数值(权重和偏差),通常越多越好 假设我们有n个样本,记: 5.1.2 解析解当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。 最小化损失来学习参数: 目标是找到一个合适的
w
\mathbf{w}
w、
b
b
b,使得损失函数最小。
5.1.3 数值解然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。 梯度下降:
小批量随机梯度下降: 在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。 在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch),然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。
总结:
5.2 线性回归的从零开始实现只使用Tensor的计算来实现算法细节 5.2.1 生成数据集
首先简单构造一个训练数据集。样本数为1000,输入个数(特征数)为2,线性回归模型真实权重
w
=
[
2
,
?
3.4
]
?
\boldsymbol{w}=[2,-3.4]^{\top}
w=[2,?3.4]? 和偏差 $b=4.2 $, 以及一个随机噪声项
?
\epsilon
? 来生成标签 下面,让我们生成数据集。
可以通过生成第二个特征features[:, 1]和标签 labels 的散点图,更直观地观察两者间的线性关系。 前面PyTorch绘制函数图像及切线已经用过d2l了,这里直接用d2l导入。
5.2.2 读取数据在训练模型的时候,我们需要遍历数据集并不断读取小批量数据样本。这里我们定义一个函数data_iter():它每次返回batch_size(均匀采样得来的批量大小)个随机样本的特征和标签。
读取第一个小批量数据样本并打印。每个批量的特征形状为(10, 2),分别对应批量大小和输入个数;标签形状为批量大小。
5.2.3 建立模型(1)首先初始化模型参数
(2)接着,我们就需要更新这些参数,直到这些参数足够拟合我们的数据 每次更新都需要计算损失函数关于模型参数的梯度。有了这个梯度,我们就可以向减小损失的方向更新每个参数。因此,还要定义损失函数
(3)接下来,定义模型,将模型的输入和参数同模型的输出关联起来
(4)然后定义优化算法,实现小批量随机梯度下降更新 使用从数据集中随机抽取的一个小批量,然后根据参数计算损失的梯度。接下来,朝着减少损失的方向更新我们的参数。 下面的函数中:
(5)最后是主要的训练过程 在每次迭代中,我们读取一小批量训练样本,并通过我们的模型来获得一组预测。 计算完损失后,我们开始反向传播,存储每个参数的梯度。最后,我们调用优化算法sgd来更新模型参数。
因为我们使用的是自己合成的数据集,所以我们知道真正的参数是什么。 因此,我们可以通过比较真实参数和通过训练学到的参数来评估训练的成功程度。
5.3 线性回归的简洁实现5.2中,我们只依赖了:(1)通过张量来进行数据存储和线性代数;(2)通过自动微分来计算梯度。 其实上面的很多都有成熟的开源框架可以自动化实现基于梯度的学习算法中重复性的工作。接下来,我们通过使用深度学习框架来简洁地实现5.2节中的线性回归模型。 5.3.1 生成数据集
5.3.2 读取数据调用框架中现有的API来读取数据
5.3.3 建立模型(1)使用框架的预定义好的层 我们首先定义一个模型变量net,它是一个Sequential类的实例。Sequential类为串联在一起的多个层定义了一个容器。当给定输入数据,Sequential实例将数据传入到第一层,然后将第一层的输出作为第二层的输入,依此类推。 在下面的例子中,我们的模型只包含一个层,这一单层被称为全连接层(fully-connected layer)。因此实际上不需要Sequential。
(2)初始化模型参数 深度学习框架通常有预定义的方法来初始化参数。 直接访问参数以设定初始值:我们通过net[0]选择网络中的第一个图层,然后使用weight.data和bias.data方法访问参数。然后使用替换方法normal_和fill_来重写参数值。
(3)损失函数 计算均方误差使用的是MSELoss类,也称为平方 L 2 L_2 L2? 范数。默认情况下,它返回所有样本损失的平均值。
(4)优化算法 小批量随机梯度下降算法是一种优化神经网络的标准工具,PyTorch在optim模块中实现了该算法的许多变种。当我们实例化SGD实例时,我们要指定优化的参数(可通过net.parameters()从我们的模型中获得)以及优化算法所需的超参数字典。小批量随机梯度下降只需要设置lr值,这里设置为0.03。
(5)训练 训练过程代码与我们从零开始实现时所做的非常相似。 在每个迭代周期里,我们将完整遍历一次数据集(train_data),不停地从中获取一个小批量的输入和相应的标签。对于每一个小批量,我们会进行以下步骤:
从零开始和简洁实现是完全等价的。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 6:34:07- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |