作者 | 蒂尔塔约蒂·萨卡尔
来源 | 中等的
编辑 | 代码医生团队
介绍
在本文中,我将展示在 PyTorch 中构建 2 层神经网络分类器(密集连接)的简单分步过程,阐明一些关键特性和样式。
PyTorch 为程序员提供了极大的灵活性来创建、组合和处理流经网络的张量……
核心成分
PyTorch 用于构建神经分类器的核心组件是
使用这些组件,分类器将通过五个简单的步骤构建
这五个步骤的过程构成了一个完整的培训期。只重复一次,以减少损失并获得较高的分类精度。
包含五个核心组件的五步流程
在 PyTorch 中神经网络 损失函数种类,将神经网络定义为自定义类可以让您获得面向对象编程 (OOP) 范式的全部好处。
张量
torch.Tensor 是一个包含单一数据类型元素的多维矩阵。它是框架的中心数据结构。张量可以从 Numpy 数组或列表创建并执行各种操作,例如索引、数学、线性代数。
张量支持其他一些使它们独一无二的增强功能。除了 CPU 之外,它们还可以加载到 GPU 中(通过极其简单的代码更改)以加快计算速度。它们支持形成一个反向图,使用动态计算图 (DCG) 来跟踪应用到它们的每个操作以计算梯度。
自动毕业
两者都不擅长复杂神经网络的微积分。高维空间使人感到困惑。幸运的是有 Autograd。
要处理 14 维空间中的超平面,可视化 3D 空间并大声对自己说“十四”。每个人都可以做到——杰弗里·辛顿
张量对象支持神奇的 Autograd 功能,即自动微分,这是通过跟踪和存储张量在流经网络时执行的所有操作来实现的。
nn.Module 类
在 PyTorch 中,通过将其定义为自定义类来构建神经网络。但是,不是从这个类继承 nn.Module 类的原始 Python 派生对象。这为神经网络类注入了有用的属性和强大的方法。本文将展示此类定义的完整示例。
损失函数
损失函数定义了神经网络的预测与基本事实之间的距离,而损失的定量测量有助于推动网络更接近对给定数据集进行最佳分类的配置。
PyTorch 为分类和回归任务提供了所有常见的损失函数
优化器
优化权重以实现最低损失是用于训练神经网络的反向传播算法的核心。PyTorch 提供了许多优化器来完成这项工作,这些优化器通过 torch.optim 模块公开
“五个步骤的过程构成了一个完整的培训课程。它只重复一次。”
神经网络课程和训练
数据
对于这个示例任务,首先使用 Scikit-learn 函数创建一些具有二进制类的合成数据。在下表中,数据类别按颜色区分。显然,数据集无法通过简单的线性分类器进行分离,而神经网络是解决此问题的合适机器学习工具。
分类示例的综合数据集
建筑学
选择了一个简单的全连接 2 隐藏层架构。如下所示
类定义
n_input = X.shape[1] # 必须匹配输入特征的形状n_hidden1 = 8 # 第一个隐藏层的神经元个数n_hidden2 = 4 # 第二个隐藏层的神经元个数n_output = 1 # 输出单元的个数(例如1用于二进制分类)
定义schema对应的变量,然后定义主类。神经网络类定义如下所示。如前所述,它继承自 nn.Module 基类。
该代码几乎没有解释,并添加了注释。在方法的定义上,forward 与 Keras 对模型的定义有很强的相似性。
此外,请注意使用内置线性代数运算 nn.Linear(如层间)和激活函数(如每层输出的 nn.ReLU 和 nn.Sigmoid)。
如果您实例化一个模型对象并打印它,您将看到结构(与 Keras 的 model.summary() 方法平行)。
模型=网络()打印(模型)
网络((隐藏1):线性(in_features=5,out_features=8,bias=True)(隐藏2):线性(in_features=8,out_features=4,bias=True)(relu): ReLU()(输出): 线性(in_features=4, out_features=1, bias=True)(sigmoid): Sigmoid())
损失函数、优化器和训练
为此任务选择一个二元交叉熵损失,并将其定义如下(按照惯例,损失函数通常在 PyTorch 中按标准调用)
标准 = nn.BCELoss() # 二元交叉熵损失
此时,输入数据集通过定义的神经网络模型运行,即一次前向传递并计算输出概率。由于权重被初始化为随机,您将看到随机输出概率(大多接近 0.5)。网络尚未经过训练。
logits = model.forward(X) # 前向传播的输出(logits 即概率)
如果你打印出前 10 个概率,你会得到类似的结果,
张量([[0.5926],[0.5854],[0.5369],[0.5802],[0.5905],[< @0.6010],[0.5723],[0.5842],[0.5971],[0.5883]], grad_fn=)
所有输出概率似乎都接近 0.5,
平均损失的计算方法很简单,
损失=标准(logits,y)
对于优化器,选择简单随机梯度下降 (SGD) 并将学习率指定为 0.1,
from torch 导入优化器 = optim.SGD(model.parameters(),lr=0.1)
现在训练。再次按照五个步骤
令人惊讶的是,如果您阅读了上述五个步骤,这正是您在所有关于神经网络的理论讨论(以及所有教科书)中看到的内容。而使用 PyTorch,这个过程可以通过看似简单的代码逐步实现。
没有什么是隐藏的或抽象的。感受用五行 Python 代码实现神经网络训练过程的原始力量和兴奋!
# 重置梯度即不累积超过 passoptimizer.zero_grad()# Forward passoutput = model.forward(X)# Calculate lossloss = criteria(output,y)# Backward pass (AutoGrad)loss.backward()# 一步优化器优化器.step()
多时期训练
那只是一个时期。现在很明显,一段时间不会减少它,是吗?要运行多个 epoch,只需使用循环。
epochs = 10for i,e in enumerate(range(epochs)):optimizer.zero_grad() # 重置 gradsoutput = model.forward(X) # Forward passloss = criteria(output.view(output.shape[0]),y ) # 计算 lossprint(f”Epoch – {i+1}, Loss – {round(loss.item(),3)}”) # 打印 lossloss.backward() # Backpropagationoptimizer.step() # 优化器一步
在运行 1000 个 epoch 时,可以轻松生成所有熟悉的损失曲线。
想看看概率如何随时间变化?
PyTorch 能够试验、探测、破坏和摇晃物体。
只是为了好玩,如果你想检查输出层的概率是如何在多个时期演变的,对前面的代码做一个简单的修改就可以了,
显然未经训练的网络输出都接近于1,即正负类之间没有区别。随着训练的继续,概率彼此分离,逐渐尝试通过调整网络的权重来匹配ground truth的分布。
PyTorch 使您能够实验、探测、粉碎和摇晃事物。
还有其他流行的想法吗?尝试
PyTorch 从早期版本开始就非常受欢迎,尤其是在学术研究人员和初创公司中。这背后的原因很简单——它可以通过简单的代码重构来尝试疯狂的想法。实验是任何科学领域新思想发展的核心,当然,深度学习也不例外。
混合了两个激活函数?
只是为了(有点)疯狂,想象一下想要将它与两种不同的激活函数混合 – ReLU 和双曲正切(tanh)。想要将张量分成两个平行的部分,分别对它们应用这些激活神经网络 损失函数种类,添加生成的张量,然后正常传播。
看起来很复杂吗?实现所需的代码。通过第一个隐藏层传递一个输入张量(比如 X),然后通过将生成的张量传递给单独的激活函数来创建两个张量 X1 和 X2。只需将结果张量相加并通过第二个隐藏层。
使用 PyTorch 可以执行此类实验工作并轻松更改网络架构。
实验是任何科学领域新思想发展的核心,当然,深度学习也不例外。
试试你自己的自定义损失函数?
可能想尝试自己的自定义损失函数。从高中时代就开始使用均方误差。尝试将回归问题推向四次方怎么样?
只需定义函数…
然后在你的代码中使用它(注意 reg_model,可以通过关闭 Network 类输出中的 sigmoid 激活来构造一个新模型。
现在,你有这种感觉吗?
综上所述
此演示的所有代码都可以在 Github 存储库中找到。
在本文中,总结了一些关键步骤,可以按照这些步骤快速构建用于分类或回归任务的神经网络。它还展示了如何使用此框架轻松尝试聪明的想法。
过去的
推
推荐
1
2.
3.
5.
6.
7.
扫描个人微信账号,
将您拉入机器学习的大军。
福利很全,地方不多……
记得给公众号加星,我们会第一时间通知你。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 欧资源网