| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> Make Your First GAN With PyTorch:3.针对手写数字识别网络改进的讨论 -> 正文阅读 |
|
[人工智能]Make Your First GAN With PyTorch:3.针对手写数字识别网络改进的讨论 |
本书的上一章开发了一个神经网络来对手写数字的图像进行分类,虽然网络设计简单,但效果不错,使用 MNIST 测试数据集获得了 87% 的准确性。 这章主要是探索针对网络不同方面的改进方式,用于改进网络的性能,同时加深对网络的理解。
1. 损失函数一些神经网络,是为了产生连续范围的输出值,比如温度预测网络要求能输出 0 到 100 摄氏度的任意数值;还有一些网络是为了产生 True/False 或 1/0 的输出,比如某个用于辨别图像是否是猫的网络,需要输出值接近 0.0 或 1.0, 而非其他值。 如果对不同场景下的损失函数进行分析,可以发现第一种任务,也就是所谓的 回归(regression) 任务,可以使用 均方误差(Mean Squared Error, MSE) 损失; 对于第二种分类任务,则更适用其他损失函数,一个常用的损失函数为 二元交叉熵(Binary Cross Entropy),该函数的初衷是惩罚 “错误但确信” 的输出,以及 “正确但不太确信” 的输出。PyTorch 提供了该损失函数为 本文讨论的网络,用于 MNIST 图像分类的网络,属于第二种类型,输出节点的值理想状态,除了一个确信的结果输出接近 1.0 之外,其他的应接近 0.0 。 将前面网络的 notebook 文件并将损失函数从
对该网络仍然使用 3 个 epochs 进行训练,性能分数变为 91%,相比之前 87% 进步不小。 有趣的是观察损失图表:
下面的图像再次反映了训练数据集第 19 个记录的输出值:
2. 激活函数早期的神经网络使用的是 s-型 Logistic 函数,因为它的形状与动物真实神经元传递信号的方式更加类似,而且在计算梯度时数学上更方便。 但是,该函数也有一些弱点。最主要的是对较大的数(上图右端),梯度(导数)会很小, 甚至可能事实上消失。由于神经网络的训练依赖梯度来修正连接权重,可能在这种 饱和(saturation) 发生时而失效。 为了避免上述问题,还有很多可供选择的激活函数,其中一个简单的直线就可以解决这个问题,直线修正后的梯度并不会消失。
但是观察上图,由于小于 0 的值的斜率为 0,这可能导致小于 0 的信号会产生梯度消失的问题。一个简单的方法是在函数左侧增加一个小梯度,称为 Leaky ReLU。 将之前的网络 的损失函数重置为
再次训练 3 epochs。本书的例子,性能分数为 97%,相比之前 87% 进步非常大,接近了使用更复杂网络的行业领先水平。 对应的损失值图表见下图: 可以看到损失值很快下降到接近 0,而且在训练的初期,平均的损失值也很小, 而且噪声值也较低。 对训练数据集第 19 个记录的输出值而言,该网络非常确信图像是 4,而且所有 其他节点的值非常接近 0。
3. 优化方法我们也可以通过改进反向传播梯度技术来更新网络的权重。 但是随机梯度下降法的一个缺点是可能陷在随机函数的局部极小值,另一个缺点则是对所有的可学习参数使用了相同的学习率。 除了随机梯度下降法外,有一些其他常用的优化方法,比如 Adam 方法,该方法直接解决了这两个挑战。它利用动量的概念来减少陷入局部极小值的机会,这有点像一个重球如何通过一个小坑,因为它的动量能使它顺利通过这些小坑;该方法还为每个可学习参数使用了单独的学习速率,以适应每个参数在训练过程中的变化。
将原代码返回为使用
再次训练 3 epochs。对我而言,性能分数也是大约 97%,相比之前 87% 进步很 大,而且与使用 LeakyReLU 激活函数的改进类似。检查一下损失图表如下图。
同样的,下图显示,对训练数据集第 19 个记录的输出值显示出该网络有很高的信心水平认为图像是一个数字 4。
4. 规范化(Normalisation)神经网络中的权重,和穿过网络的信号,可能具有潜在很大的值。前面提到,这些很大的值可能导致饱和。 现在已经有大量研究,用以减少神经网络中参数和信号值的范围,并且还对值进行搬移以使平均值为 0,这称之为 规范化 (Normalisation)。 将代码复原到使用 MSELoss,sigmoid 激活函数和 SGD 优化器的版本,然后使用
再次训练该网络 3 epochs,使用测试数据的性能分数也是 91%,与原始网络的 87% 相比,改进也不错。观察损失图表: 可以看到损失的下降速度比原始网络更快,而且那么则损失的噪声也不那么多。 关注下图:
5. 综合改进对本文使用过的改进进行综合,综合使用 BCE 损失,LeakyReLU 激活函数,Adam 优化器和网络规范化。
训练该网络 3 epochs,性能分数大约为 97%。 看起来将所有的技巧合并使用,并不能给出超过 97% 的准确率。为了获得世界级的分数,这个简单的网络已经不足以使用了,需要更复杂的网络结构,后面会进行介绍。 6. 要点总结结合本文和构建网络的文章,总结如下要点: ? 实践证明,使用新数据或构建新的工作流程时,最好对数据预览(pre-view)来保证数据正确载入和变换; ? PyTorch 可以完成机器学习任务中很多工作。为了利用这个优势,我们需要和 PyTorch 的机制合作,比如,神经网络需要从 PyTorch 的 ? 均方误差(Mean Squared Error) 损失值适合于回归任务,这类任务的输出是连续值;而二元交叉熵(Binary Cross Entropy) 损失值对输出可能为 1 或 0,True 或 False 的分类任务更为适合; ? 传统的 sigmoid 激活函数对大的输出值可能出现 梯度消失(vanishing gradients),导致训练网络时反馈信号不佳;ReLU 激活函数通过对正的输入有良好的梯度值,解决了这个问题;LeakyReLU 对负值提供了一个小的非消失梯度值来进行进一步改进; ? Adam 优化器使用了动量来改进局部极小值,并保证每个可学习参数的学习率不同。对很多任务而言,它的效果比简单的 SGD 优化器更好; ? 规范化(Normalisation) 可以稳定神经网络的训练。对网络的初始权重进行规范化很常见,当信号值通过具有 LayerNorm 的神经网络时,将其规范化可以提高性能。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 10:38:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |