CNN调优都在这了,选择“星标”快速获得最新干货

Computer Vision life”,选择“Star”

快速获取最新干货

作者 |夏洛特

来源 | [深度学习爱好者]

简介

炼金术技巧总结,CNN调优都在这里。

CNN 优化总结 ImageNet 上 CNN 进展的系统评估

使用不带batchnorm的ELU非线性或带batchnorm的ReLU。

用类似1*1的网络结构预训练RGB数据可以得到更好的结果。

使用线性学习率衰减策略。

使用平均池化层和最大池化层的总和。

使用大约 128(0.005) 到 256(0.01)) 的 mini-batch 大小。如果这对于您的 GPU 来说太大,请添加学习率可以缩小到这个大小。

在之前的 MLP 中使用卷积层而不是线性层,并使用平均池化层进行预测。

在研究增加训练集大小时,需要确定数据集的权衡点以提高性能。

数据质量比数据大小更重要。

如果你不能增加输入图像的大小,减少后续层的步幅具有相同的效果。

如果您的网络具有复杂且高度优化的架构,例如 GoogLeNet,请谨慎修改。

其他人可以详细查看论文。作者煞费苦心地对比了各种超参数对CNN模型性能的影响,非常值得一看。

以下转载自:

充分利用 DNN 的提示

提高算法性能的想法

这个列表中提到的想法并不完整,但是一个好的开始。

我的目的是提供很多想法来尝试,希望其中的一两个是你以前没有想到的。您通常只需要一个好主意即可获得性能提升。

如果您可以从其中一个想法中获得结果,请在评论中告诉我。我很高兴听到这个好消息。

如果您有更多想法,或者列出的想法的扩展,也请告诉我,我和其他读者都会受益!有时,一个想法就能为其他人带来突破。

我将这篇博文分为四个部分:

通过数据提高性能

通过算法提高性能

通过算法调优提高性能

使用嵌套模型提高性能

一般来说,随着列表的下降,性能增益会越来越小。例如,与调整最优算法的参数相比,重新设计问题或获取更多数据通常会产生更好的结果。并非总是如此,但通常是这样。

我已经添加了博客教程、相应网站问题和经典神经网络常见问题解答的相应链接。

其中一些想法仅适用于人工神经网络,但大多数都是通用的。足够通用神经网络损失函数种类,您可以将其与其他技术结合使用,从而与提高模型性能的方法发生冲突。

好的,我们现在开始吧。

1. 利用数据提高性能

对您的训练数据和问题定义进行适当的更改,您可以获得巨大的性能提升。也许是最大的性能提升。

以下是我将要介绍的想法:

获取更多数据

创建更多数据

重新调整您的数据

转换您的数据

功能选择

重新整理你的问题

1)获取更多数据

你能得到更多的训练数据吗?

模型的质量通常受到训练数据质量的限制。要想得到最好的模型,首先应该想办法得到最好的数据。您还希望获得尽可能多的最佳数据。

随着数据的增多,深度学习等现代非线性机器学习技术拥有更完整的学习来源,可以更好地学习,尤其是深度学习。这是机器学习对所有人如此有吸引力的一个重要原因(世界上到处都是数据)。

更多数据并不总是有帮助,但确实有帮助。就我而言,如果可以的话,我会选择获取更多数据。

参见以下相关阅读:Datasets Over Algorithms()

2) 创建更多数据

上一小节说过,随着数据的增多,深度学习算法通常会变得更好。有时你可能无法合理地获取更多数据,那么你可以尝试创建更多数据。

这通常称为数据扩充或数据生成。

您可以利用生成模型。您还可以使用一些简单的技巧。例如,对于图像数据,您可以通过随机平移或旋转现有图像来获得性能提升。如果将这种变换包含在新数据中,将提高模型的泛化能力。

这也与增加的噪声有关,我们习惯于将其称为增加的扰动。它与正则化方法的作用相似,即抑制训练数据的过度拟合。

以下是相关读物:

3)重新调整你的数据

这是一种快速提高性能的方法。应用神经网络时,传统的经验法则是将数据重新缩放到激活函数的范围内。

如果您使用的是 sigmoid 激活函数,请将数据重新缩放到区间 0 和 1。如果您使用的是双曲正切 (tanh) 激活函数,请将数据重新缩放到 -1 和 1 之间的区间。

此方法可应用于输入数据 (x) 和输出数据 (y)。例如,如果你在输出层使用 sigmoid 函数来预测二元分类的结果,你应该对 y 值进行归一化以使其二元化。如果您使用的是 softmax 函数,您仍然可以从归一化 y 值中受益。

这仍然是一个很好的经验法则,但我想更深入一点。我建议你可以参考以下方法创建一些训练数据的不同版本:

然后,针对每种方法,评估模型的性能并选择最适合使用的方法。如果您更改激活函数,请重复此过程。

在神经网络中,大的数值累积效应(堆叠和乘法)并不是一件好事,除了上述方法之外,还有其他方法可以控制神经网络中数据的数值大小,例如归一化激活函数和权重,我们稍后会讨论这些技术。

以下是相关读物:

4)数据转换

这里的数据变换和上面介绍的rescaling方法类似,但是需要做更多的工作。您必须非常熟悉您的数据。通过可视化检查异常值。

猜测每列数据的单变量分布。

依靠你的直觉,尝试以下方法。

神经网络层擅长特征工程。它可以做到(自己)。但是如果你能更好地发现问题的结构到网络中,神经网络层就会学得更快。您可以对数据进行采样以进行不同的转换,或者对特定属性进行试验,看看哪些有效,哪些无效。

以下是相关读物:

5) 特征选择

一般来说,神经网络对不相关的特征具有鲁棒性(校对注:即不相关的特征不会对神经网络的训练和性能产生很大影响)。它们会减弱没有预测能力且权重接近 0 的特征的贡献。

尽管如此,这些不相关的数据特征在训练周期中仍然消耗大量资源。那么你能从数据中删除一些特征吗?

特征选择和特征重要性的方法有很多,这些方法可以让您了解哪些特征要保留,哪些要删除。最简单的方法是比较所有特征和部分特征的效果。同样,如果您有时间,我建议您在同一个网络中尝试从不同的角度来处理您的问题,评估它们,然后看看它们的表现如何。

以下是相关读物:

6) 重新定义你的问题

有时试图跳出您当前正在定义的问题,并考虑将您收集的观察结果作为定义您的问题的唯一方法?可能还有其他方法。也许其他构建问题的方法可以更好地揭示要学习的问题的结构。

我真的很喜欢这个实验,因为它迫使你敞开心扉。这真的很难,尤其是当您在当前方法上投入了大量时间和金钱时。

但是让我们这样想,即使你列出了 3-5 个备选的建造方案并最终放弃它们,这至少表明你对当前的选择更有信心。

仔细考虑您的问题,最好在选择工具之前考虑以不同的方式构建您的问题,因为此时您并没有在解决方案上投入太多。除此之外,如果你在某个问题上卡住了,这样一个简单的尝试就能开启更多的新想法。

另外,这并不意味着您之前的工作是白费的,您可以在此查看后续的模型嵌套部分。

以下是相关读物:

通过算法提高性能

机器学习当然是用算法解决问题。

所有理论和数学都描述了应用不同的方法从数据中学习决策过程(如果我们在这里只讨论预测模型)。

您选择了深度学习来解释您的问题。但这真的是最好的选择吗?在本节中,我们将介绍一些算法选择的想法,然后再深入探讨如何充分利用您选择的深度学习方法。

以下是简要列表:

对算法进行抽样

从现有文献中学习

重采样方法

让我解释一下上面提到的一些方法。

1)算法抽样

实际上,您无法提前知道哪种算法最适合您的问题。如果你知道,你可能不需要机器学习。有没有数据(方法)可以证明你选择的方法是正确的?

让我们解决这个难题。当每个算法的性能在所有可能的问题上进行平均时,没有一种算法可以总是优于其他算法。所有算法都是平等的,这里是没有免费午餐定理的总结。

也许您选择的算法不是最适合您的问题的算法

我们并不是试图解决所有问题,算法界有很多新的热门方法,但它们可能不是您数据集的最优算法。

我的建议是收集(证据)数据指标。接受可能存在更好的算法的事实,并让其他算法有机会“公平竞争”以解决您的问题。

对一系列可能的方法进行抽样,看看哪些有效,哪些无效。

选择性能最好的算法,然后通过进一步的参数调优和数据准备来改进它。特别是将深度学习与其他传统机器学习方法进行比较,对上述结果进行排序,比较它们的优缺点。

很多时候你会发现你可以使用一些更简单、更快的训练,甚至更容易理解的算法来代替深度学习来解决你的问题。

以下是相关读物:

2) 借鉴现有文献

方法选择的捷径是借鉴现有文献。可能有人已经研究过与你的问题相关的问题,你可以看看他们用了什么方法。

您可以阅读论文、书籍、博客、问答网站、教程以及任何可以通过 Google 搜索的内容。

写下你所有的想法,然后按照自己的方式完成它们。

这不是要复制别人的研究,而是要激发你想出新的想法,一些你从未想过但有潜力提高绩效的想法。

发表的研究通常非常好。世界上有很多聪明人写了很多有趣的东西。你应该翻遍这个“图书馆”来找到你想要的。

以下是相关读物:

3)重采样方法

您必须知道您的模型的性能如何。您对模型性能的估计是否可靠?

深度学习模型在训练阶段非常缓慢。这通常意味着我们不能使用一些常用的方法,例如 k 层交叉验证来估计模型的性能。

有时反过来,也许您可​​以使数据集更小并使用更强的重采样方法。

以下是相关读物:

通过算法调优提高性能

这通常是工作的关键。您通常可以通过采样快速发现一两个表现良好的算法。但获得最佳算法可能需要几天、几周甚至几个月的时间。

为了获得更好的模型,以下是神经网络算法参数调优的一些思路:

诊断

权重初始化

学习率

激活函数

网络拓扑

批次和时期

正则化

优化和损失

提前停止方法

您可能需要使用给定的“参数配置”多次(3-10 次或更多)训练神经网络模型,以获得估计良好性能的参数配置。这几乎适用于您可以在本节中调整的所有内容。

查看关于超参数优化的博文:

1)诊断

如果你能知道为什么你的模型没有表现得更好,你就能得到一个性能更好的模型。

您的模型是过拟合还是欠拟合?永远记住这个问题。永远。

模型总是会出现过拟合或欠拟合,只是程度不同。了解模型学习行为的一种快速方法是评估模型在每个 epoch 的训练和验证集上的性能并绘制图表。

经常绘制这些图表,研究它们以了解可以提高模型性能的不同方法。这些图表可能是您可以创建的最有价值的(模型状态)诊断信息。

另一个有用的诊断是观察网络模型决定对错。

以下是相关读物:

2)权重初始化

经验法则通常是:用一个小的随机数初始化。

实际上,这可能仍然有效,但它是否最适合您的网络?也有一些针对不同激活函数的启发式初始化方法,但在实践中并没有太大区别。

修复您的网络并尝试各种初始化。

请记住,权重是模型的真实参数,您需要找到它们。有许多权重组可以表现良好,但我们会尝试找到最好的。

需要提醒的是,改变权重初始化方式与激活函数甚至优化函数/损失函数息息相关。

以下是相关读物:

3)学习率

调整学习率往往是一个有效的时间段。

以下是一些值得探索的想法:

更大的网络需要更多的训练,反之亦然。如果你添加了太多的神经元和层,适当提高你的学习率。同时,学习率需要结合训练周期、batch size和优化方法综合考虑。

以下是相关读物:

4)激活函数

您可能应该使用整流器激活函数。它们可能会提供更好的性能。

在此之前,最早的激活函数是sigmoid和tanh,其次是softmax、线性激活函数,或者输出层的sigmoid函数。除非您知道自己在做什么,否则我不建议您尝试更多的激活功能。

尝试所有三个激活函数并重新调整数据以满足激活函数的界限。

显然,您希望为输出的形式选择正确的传递函数,但要考虑探索不同的表示。例如,将用于二元分类问题的 sigmoid 函数转换为用于回归问题的线性函数并对输出进行后处理。这可能需要更改损失函数以使其更合适。有关详细信息,请参阅数据转换部分。

以下是相关读物:

5)网络拓扑

网络结构的改变可以带来好处。

你需要多少层和多少个神经元?抱歉没有人知道。不要问这种问题……

那么您如何找到适合您的问题的配置?去实验吧。

选择总是困难的。一般来说,网络越大,表示能力越强,也许你需要它。更多的层可以提供更强的能力来抽象从数据中学习到的特征。也许需要它。

深度神经网络需要更多的训练,训练周期和学习率都要相应调整。

这里有一些相关的阅读:这些链接会给你很多关于尝试什么的想法,至少对我来说是这样。

6)批次和周期

批量大小决定了最终的梯度以及权重的更新频率。一个时期是指神经网络查看所有训练数据的过程。

您是否尝试过不同的批量大小和周期?之前我们已经讨论过学习率、网络规模和epoch之间的关系。

您经常会在非常深的网络结构中看到这一点:小批量与大训练时期配对。

以下内容可能对您的问题有所帮助,也可能无济于事。您尝试观察自己的数据。

考虑一个近乎无限的 epoch 值(持续训练)来记录目前可用的最佳模型。

一些网络结构对批量大小更敏感。我知道多层感知器通常对批量大小具有鲁棒性,而 LSTM 和 CNN 更敏感,但这只是一个声明(仅供参考)。

以下是相关读物:

7) 正则化

正则化是避免模型在训练集上过度拟合的好方法。

神经网络中最新最火的正则化技术是dropout方法,你试过了吗? dropout 方法在训练阶段随机跳过一些神经元,驱动该层中的其他神经元捕捉松弛。简单有效。你可以从 dropout 方法开始。

您也可以尝试其他更传统的神经网络正则化方法,例如:

您还可以尝试不同方面的惩罚,或使用不同类型的惩罚/正则化(L1、L2 或两者兼有)

以下是相关读物:

8) 优化和损失

最常见的是应用随机梯度下降,但也有很多优化器。您是否尝试过不同的优化(方法)程序?随机梯度下降是默认选择。首先利用它,具有不同的学习率和动力。

许多更高级的优化方法具有更多参数、更复杂且收敛速度更快。好不好用神经网络损失函数种类,要不要用,就看你的问题了。

要充分利用给定(优化)的方法,您确实需要弄清楚每个参数的含义,然后在网格中搜索针对您的问题的不同值。困难且耗时,但值得。

我发现了一些更新和更流行的方法,它们收敛速度更快,并提供了一种快速了解给定网络容量的方法,例如:

您还可以探索其他优化算法,例如更传统的(Levenberg-Marquardt)和不那么传统的(遗传算法)。其他方法可以为随机梯度下降和其他类似方法的改进提供一个很好的起点。

要优化的损失函数与您要解决的问题高度相关。但是,你通常还是有一些余地(你可以做一些微调,比如回归问题中的均方误差(MSE)和平均绝对误差(MAE)等),有时还可以变换损失函数获得小的性能提升,这取决于你的输出数据的大小和你使用的激活函数。

以下是相关读物:

9)提前停止

一旦(验证集)性能在训练期间开始下降,您就可以停止训练和学习。这样可以节省大量时间,甚至可以让您使用更详尽的重采样方法来评估模型的性能。

早期停止方法是一种正则化方法,用于避免模型在训练数据上的过度拟合。它要求您监控模型对每一轮训练集和验证集的影响。一旦验证集上的模型性能开始下降,就可以停止训练。

如果满足某个条件(衡量准确性的损失),还可以设置检查点(Checkpointing)来存储模型,让模型可以继续学习。 Checkpointing 可以让您提前停止训练,而不是真正停止训练,因此最后,您将有一些模型可供选择。

以下是相关读物:

使用嵌套模型提高性能

您可以结合多个模型的预测能力。刚才提到算法调优可以提高最终的性能。调整后,这是下一个可以改进的大领域。

事实上,您通常可以通过组合多个“足够好”的模型而不是组合多个高度调整(脆弱)的模型来获得出色的预测能力。

可以考虑以下三种嵌套方式:

组合模型

组合视角

堆叠

1) 复合模型

有时我们根本不做模型选择,直接组合它们。

如果您有多个不同的深度学习模型,每个模型在您的研究问题上表现良好,您可以通过取它们的预测平均值来组合它们。

模型差异越大,最终结果越好。例如,您可以应用非常不同的网络拓扑或不同的技术。

如果每个模型运行良好但方式不同,则嵌套预测能力将更加稳健。

每次训练网络时,都会初始化不同的权重,然后它会收敛到不同的最终权重。你可以多次重复这个过程,得到很多网络,然后将这些网络的预测组合在一起。

他们的预测将高度相关,但在那些难以预测的特征上,它会给你带来意想不到的小幅提升。

以下是相关读物:

2)组合视图

与上述类似,但从不同的角度重新构建您的问题并训练您的模型。

同样,目标是获得良好但不同的模型(例如,不相关的预测)。要获得不同的模型,您可以依赖我们在数据小节中列出的非常不同的缩放和转换方法。

您用于训练模型的转换越不同,您对问题的框架就越不同,您的结果就会得到越多的改进。

仅使用预测均值将是一个好的开始。

3)堆叠/堆叠

您还可以了解如何最好地结合来自多个模型的预测。这称为堆叠泛化,或简称为堆叠。

通常,使用简单的线性回归方法可以获得比平均预测更好的结果,例如正则化回归,它学习如何加权不同的预测模型。基线模型是通过对子模型的预测取平均值得到的,但是应用具有学习权重的模型可以提高性能。

其他参考资源

其他地方有很多很好的资源,但很少能将所有想法结合在一起。如果你想深入挖掘,我在下面列出了资源和对应的博客,你可以发现很多有趣的东西。

独家重磅课程!

1、机器人导航运动规划:运动规划和SLAM有什么关系?

2、Detailed Cartographer:为什么 Google 的开源激光 SLAM 算法 Cartographer 如此牛逼?

3、深度学习3D重构详解深度学习3D重构网络:MVSNet、PatchMatchNet、JDACS-MS

4、3D Vision Basics 详细视觉深度估计算法(Single/Stereo/RGB-D + Feature Matching + Polar Line Correction + Code Practice)

5、Visual SLAM Essentials 第一次实践SLAM,哪个开源框架最适合学习?

6、 VINS:Mono+Fusion SLAM 面试官:看你简历上的VINS精通,请当场推预学分!

7、VIO进阶:ORB-SLAM3(单目/双目/RGBD+鱼眼+IMU紧耦合+多图+闭环)独家70+讲座全部上线!

8、图像3D重建课程:视觉几何3D重建课程(第二阶段):密集重建、表面重建、点云融合、纹理映射

9、大获成功!基于LiDAR的多传感器融合SLAM系列教程:LOAM、LeGO-LOAM、LIO-SAM

10、综合系统相机标定课程:单目/鱼眼/双目/阵列相机标定:原理与实践

国内最好的SLAM和3D视觉学习社区↓

技术交流微信群

投稿合作也欢迎联系:simiter@126.com

扫描关注视频号,看最新技术实现及开源解决方案视频展示↓

——版权声明——

本公众号原创内容版权归计算机视觉生活所有;从公共渠道收集、整理、转载的非原创文字、图片、音视频资料的版权归原作者所有。如有侵权,请联系我们,我们会及时删除。返回搜狐,查看更多

责任编辑:

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论