神经网络实现因模型定义部分而异,我们将在其中使用该nn.Sequential模块来构建具有多个堆叠的全连接层的模型。由于神经网络是解决非凸问题的有力候选者,因此我们将利用螺旋数据集进行此特定案例研究。让我们开始吧!
问题定义
螺旋数据集 [1] 通常由两类组成,每一类都由不同的螺旋定义。我们将把这个问题表述为一个分类问题,并尝试根据基本模式将两个螺旋分开。样本用分配有二进制标签的点x,y来描述。
数据加载
我们已经创建了一个自定义库,它实现了像数据点和标签一样的螺旋。让我们加载 10K 点并引入 50% 的噪声。训练集和开发集的数据点将按 70/30 的比例分配。
X, Y = datasets.data_spiral(10000, 50)
螺旋看起来像这样:
这次,将实现两个数据加载器,分别用于训练和推理。
那里存在一个特殊的技巧,涉及需要long从格式转换为float类型的标签转换。这背后的概念是因为nn.CrossEntropyLoss期望类索引直接索引 logits,否则在训练运行时 [2]、[3] 期间将弹出RuntimeError 。
模型定义
全连接神经网络由两个或多个隐藏层定义。隐藏层是一对线性/ReLU单元,一个转换和激活函数,为下一层提供数据。除了最后一层,输出单元是那些提供所需预测以完成分类任务的单元。
训练运行时
训练运行时的基本要素是损失函数和优化器定义以及迭代数据集和拟合模型的训练循环。以同样的方式,两个不同的操作发生在一个时代:
- 前向传播和反向传播
- 反向传播冻结的前向传播
如果您希望在训练运行时评估和监控模型拟合,则后者是必要的操作。
训练...第 10
轮- 训练损失:0.615 - 训练精度:60.10 %第20轮- 训练损失:0.169 - 训练精度:95.55 %第30轮- 训练损失:0.036 -训练精度:99.08 %第40轮- 训练损失:0.018 - 训练精度:99.48 % Epoch 50 - 训练损失:0.012 - 训练精度:99.68 % Epoch 60 - 训练损失:0.006 - 训练精度:
99.93 %
正在评估...
测试损失:0.006 - 测试精度:99.97 %
CPU 时间:用户58秒,系统:21.4毫秒,总计:58秒
墙时间:12.5秒
剧情训练状态
为了记录训练历史,我们在每个纪元结束时保留训练数据集迭代的历史列表。 出于直观目的,我们仅记录了有关训练拆分的性能。但是,始终建议跟踪训练和开发数据集,以监控拟合优度并防止出现过拟合或欠拟合等现象。
解决螺旋
现在训练前馈模型。让我们对笛卡尔地图上的每个可用数据点进行推理,看看如何将螺旋线分开。
我们只需要定义一个预测函数,它利用数据迭代器在数据样本中执行推理,省略标签。
期望的结果应该是这样的
概括
总之,虽然这篇博文展示了神经网络的 PyTorch 实现,但它也可以作为深度学习基本概念的初学者指南。尽管是介绍性教程,但在本系列背后的基本直觉以及配置软件框架以实现高效工作的实用技巧方面,你可以获得有价值的见解。