本文转自头条号 不靠谱的猫
这篇文章主要讲解在图像相似度检测方面的尝试,并涵盖了我们遇到的挑战,我们如何处理其中的一些问题,以及需要注意的常见问题。这里涉及的原则是可重复使用的,可以扩展到广义的深度学习/人工智能问题。
每个部分将介绍过程的一两个步骤,从数据收集到测试各种方法,再到方法本身以及它们背后的一些推理。
数据收集:这无疑是该过程中最重要的步骤之一。不仅是收集到的数据的质量,还有它与真实世界数据的相似性,以及我们对这些数据进行归纳和预测的能力。
增强和增强:我们正在研究的问题领域没有我们希望拥有的那么多数据。因此,我们依靠一系列图像增强和增强技术来改进我们拥有的数据集。
选择正确的框架:今天,就深度学习框架而言,开发人员有很多选择可供选择,每个框架都有其自身的优缺点。因此,选择合适的框架会对我们开发原型和测试方法的速度产生重大影响。
解决问题:这是管道中经常被忽略但至关重要的部分。选择为深度学习问题的方法涉及大量的讨论,并且对解决方案本身具有深远的影响。
调整你的模型:该做的和不该做的。在这里,人们往往会从犯错误中吸取更多的教训,但稍微提前考虑一下,有助于更快地意识到这些错误。
数据收集和增强
通常,获取特定问题域所需的正确数据类型并非易事。
与图像域相关,让我们来谈谈一个示例问题,例如手机的分类。
搜索特定数据集将是一项浪费的工作,尤其是具有明确标记的iPhone和基于Android的手机图片的数据集。但是,使用网络抓取等技术检索此问题的较小数据集可能是一种更简单的练习。使用称为迁移学习的方法可以很好地利用这个“较小”的数据集。通常有预训练好的深度学习模型和可用于问题域的通用数据集。用于图像分类的这种数据集的示例是ImageNet。
有时数据不够,可能数据不够普遍。对于图像来说,数据的质量/分辨率可能是生产系统中无法实现的,或者图像的角度可能是相同的,等等。在这种情况下,我们使用数据增强技术来增强我们所拥有的数据,从而使我们的系统能够更好地概括。一些常见的方法是通过向图像添加噪声,诸如倾斜,翻转,旋转等。直观地说,你需要表达的数据越多,你应该能够更好地概括。
选择正确的框架
下面是我们选择这些框架的原因以及它们之间的比较:
Keras: Keras是一个高级,抽象的深度学习框架,适用于TensorFlow,Theano和其他一些“低级”深度学习框架。对于我们来说,Keras的一大胜利是它的简单性和易于使用它的方便性。我们觉得Keras会帮助我们花更多的时间来解决问题,而不是处理使用框架的方法。
Caffe2:虽然我们对Caffe2进行了一些探索,但我们几乎立即放弃了它,因为我们觉得它没有足够的文档,并且需要更多的时间来习惯。它内置了对图像分类问题和明确定义的神经网络层类型的支持。但是,Caffe2的实用程序在卷积网络之外显著下降。
Apache MXNet:Apache MXNet是Apache Software Foundation开发的一个功能强大、功能广泛的深度学习框架,它提供了多种语言的api,包括c++、Python和R.在保留了较低级框架的强大功能的同时,它还提供了高级抽象api,可以轻松地使用神经网络。此外,文档和教程非常优秀,该框架也得到了Amazon SageMaker的支持。
我们的目标之一是去寻找一个更容易开始的框架,但是我们也在寻找一个能在足够抽象和不让我们放弃深入研究之间找到平衡的框架。为此,我们使用Gluon API继续使用Apache MXNet。
解决问题
深度学习和机器学习领域的传统支持训练和测试数据集之间的80/20分割。虽然这种方法在处理数据的数量相对较小时起作用,但随着数据量的增长,我们需要在训练和测试数据之间进行更均匀的划分。建议将训练,验证和测试数据之间的98/1/1分开是比80/20分割更好的选择。与仅有一个测试集相比,使用单独的验证集背后有很强的推理,如下所示:
在更高的层次上,我们有一组与模型实际需要处理的生产数据类似的数据。这些数据是我们的目标,我们的目标是训练一个在这方面工作得最好的模型。测试集表示此数据。验证数据集代表了一组数据上一个特定模型的性能,我们不断地调整模型的超参数(如学习率、优化器等)。测试数据帮助我们区分不同的模型和方法。
因此,我们解决这个问题的方法涉及到许多步骤。一个大致的版本可能是:
确定贝叶斯错误率:贝叶斯错误率是分类器的最低可能错误率,通常类似于人为错误率。在此选择正确的值有助于我们确定在训练模型本身时如何进行。例如,用于区分瓶子和耳机的贝叶斯错误率可以是~0%。然而,区分over-the-ear耳机和on-ear耳机的情况可能相当高。
确保测试数据代表目标:在大多数情况下,如果测试集不代表您将在实时系统中处理的数据,则纯粹浪费时间和精力。如果确保您的模型的测试集性能指示它在现实世界中的表现,则系统变得更容易改进和测试。
验证/开发和测试集分布:认为验证和测试集应来自相同的数据分布,即使训练集本身是由拼凑在一起的不同数据分布创建的。其原因应该是调整超参数以提高验证数据性能的努力也应扩展到测试集。
直觉: 一个非常常见的错误就是简单地将数据扔到网络上,直到它开始有意义。重要的是要对问题如何发挥作用有一个现实的概念,以及它是否太复杂而无法由单一模型处理。有时,将其分解为更简单的问题并创建多个步骤来分别处理每个问题是更好的选择。以我们之前讨论过的相同手机为例,假设您想要找到类似于手机图像的手机。基于诸如形状因子或制造商之类的因素,首先将手机分类为类型并且然后进一步对我们具有的图像子集执行图像相似性检测可能是不那么艰巨的任务。因此,我们将一项任务(手机数据库中的图像相似性检测)分解为两项任务,
调整你的模型
通常,调整超参数最终会得到比人们想象的更好的结果。在我们深入研究之前,有两个应该熟悉的术语:
偏差:模型的偏差是衡量其在贝叶斯误差方面的训练数据的表现。例如,如果贝叶斯误差为1%(即,您可以达到99%的准确度)并且训练数据准确度为87%,则偏差为12%。
方差:模型的方差是它在训练集上与开发/验证集相比的性能差异。例如,如果训练集上的性能为87%,而开发/验证集上的性能为85%,则方差为2%。
偏差和方差之间存在明显的权衡。当偏差很高时,该模型被认为是不拟合的,即不能很好地拟合数据。当方差较高时,模型被认为是过度拟合,即,不能很好地推广,而是更适合各个数据点而不是我们正在寻找的广义函数。
让我们举一个深度学习问题的例子,贝叶斯误差为1%。对数据进行训练的3层神经网络使训练数据集的准确率达到91%,测试数据的准确率达到77%。在这种情况下的偏差是(99-91 =)8%,方差是(91-77 =)14%。由于方差远高于偏差,因此模型过度拟合。一些避免过度拟合的方法是训练更多数据,增加drop out等等。
如果稍微调整模型的偏差现在为8%,但方差为1%。由于模型不拟合,我们需要通过使用更复杂的网络架构/模型和更多训练来进行更多训练。
人们还可以使用各种超参数执行详尽的“grid”搜索,以查看效果最佳的搜索。
通常,问题不在于神经网络的超参数值,而在于神经网络本身的结构。在这种情况下,谨慎的做法是考虑其他体系结构,或者试着看一下你的神经网络的黑盒子背后的东西。其中一个帮助可视化卷积层检测的工具是:https://github.com/InFoCusp/tf_cnnvis。
在与图像相关的问题中,最明显的解决方案是分类模型,但是如果这个方法不拟合您的用例,那么可以使用相似度检测、特征编码和其他方法。为此,有大量的新研究涌现出来,详细介绍了人们可能用来支持结果的不同技术。图像领域的一些例子包括ResNets, Triplet网络,Mask-RCNN等。
综上所述,我们很容易迷失在提高网络性能的工作中,而完全忘记了最初的目标。与任何项目一样,在计划下一个迭代或步骤时,保持最初的目标定义良好并始终牢记是至关重要的。
该贴被huang.wang编辑于2018-10-4 0:47:37