概述
深度学习是一个广阔的领域,但我们大多数人在构建模型时都面临着一些共同的挑战
在这里,我们讨论4个这样的挑战和技巧,以提高您的深度学习模型的性能
这是一篇以代码为中心的实践文章,因此准备好 Python IDE 并改进您的深度学习模型!
介绍
在过去的两年里,我大部分时间都只在深度学习领域工作。这是一个相当的经验 - 工作在多个项目,包括图像和视频数据相关的项目。
在那之前,我一直徘徊在深度学习概念的边缘,如物体检测和人脸识别一直到2017年末才深入探讨。在这段时间里,我遇到了各种各样的挑战。我想谈谈最深入的学习实践者和爱好者在旅途中面对的四个非常常见的一个。
如果你以前在一个深度学习项目中工作过,你将会与我们后面所提到的困难产生共鸣。好消息是,克服这些困难并不像你想象的那么困难!
在本文中,我们将采取非常实际的方法。首先,我们将确定我上面提到的四个共同挑战。然后,我们将直接深入到Python代码中,学习关键的技巧和技巧来应对和克服这些挑战。这里有很多东西要拆,让我们开始吧!
目录
- 深度学习模式的共同挑战
- 车辆分类案例研究概述
- 了解每一个挑战以及如何克服这些挑战以提高深度学习模型的性能
- 案例研究:改进我们的车辆分类模型的性能
深度学习模式的共同挑战
深度学习模型通常在大多数类型的数据上都有很好的表现。尤其是在图像数据方面,深度学习模型,特别是卷积神经网络(CNNs)的性能几乎优于所有其他模型。
这种方法很有效,但也有CNN或其他深度学习模型无法执行的情况。我遇到过好几次,数据很好,模型的架构也没有问题,损失函数和优化器也设置好了,但是模型一直没有达到我的预期。
这是我们大多数人在使用深度学习模式时面临的共同挑战:
- 可用于培训的数据不足(Paucity of Data available for training)
- 过度拟合(Overfitting)
- 欠拟合(Underfitting)
- 高训练时间(High training time)
深度学习挑战1:可用于培训我们模型的数据不足
深度学习模型通常需要大量的数据进行训练。一般来说,数据越多,模型的性能就越好。缺乏数据的问题是,我们的深度学习模型可能无法从数据中学习模式或函数,因此它可能无法在看不见的数据上提供良好的性能。
如果你看看车辆分类的案例研究,我们只有大约1650幅图像,因此模型无法在验证集上很好地执行。在使用计算机视觉和深度学习模型时,数据较少的挑战非常普遍。
正如您所想象的,手动收集数据是一项繁琐且耗时的任务。因此,我们可以使用数据增强技术,而不是花费数天时间来收集数据。
对于图像数据有多种数据增强技术,您可以参考这篇文章。 常用的增强技术有旋转、剪切、翻转等。
这是一个非常广泛的话题,这篇文章中介绍了这些技术及其在PyTorch中的实现。
深度学习挑战2:模型过度拟合
我相信你以前听说过过拟合。这是有抱负的数据科学家在刚接触机器学习时所面临的最常见的挑战(和错误)之一。但这个问题实际上超越了领域——它也适用于深度学习。
例如,假设我们有一个培训和一个验证集。我们利用训练数据对模型进行训练,并在训练集和验证集上检查其性能(评估指标是准确性)。训练准确率为95%,验证准确率为62%。听起来很熟悉?
由于验证精度远低于训练精度,我们可以推断该模型是过度拟合的。下图将使您更好地了解什么是过度拟合:
由于训练误差很小,测试误差很大,所以上图中蓝色部分为过拟合模型。过度拟合的原因是该模型从训练数据中学习不必要的信息,因此在训练集上表现得非常好。
但当引入新数据时,它就无法执行。我们可以在模型的体系结构中引入dropout来解决这个过拟合的问题。
使用dropout,我们需要关闭神经网络中的一些神经元。假设我们在一个原本有20个神经元的层上加上一个0.5的脱落。因此,这20个神经元中的10个将被移除,我们最终得到一个不那么复杂的结构。
因此,模型不会学习复杂的模式,我们可以避免过度拟合。如果你想了解更多关于辍学的信息,请阅读本文。
深度学习挑战3:模型拟合不足
深度学习模式也可能会欠拟合,尽管听起来不太可能。
欠拟合是指模型不能从训练数据中学习模式,因而训练集的性能较低。
这可能是由于多个原因造成的,例如没有足够的数据进行训练,架构过于简单,模型的训练周期较少等。
为了克服欠拟合,您可以尝试以下解决方案:
- 增加训练数据
- 做一个复杂的模型
- 增加训练时间
因此对于我们来说欠拟合并不是一个大问题,因此我们将前进到下一个方法来改善一个深度学习模型的性能。
深度学习挑战4:训练时间太长
有时你可能会发现你的神经网络需要很长时间才能收敛。这背后的主要原因是神经网络各层输入分布的变化。
在训练过程中,神经网络各层的权重都发生了变化,从而激活函数也发生了变化。现在,这些激活函数是下一层的输入,因此分布随每个连续迭代而变化。由于分布的这种变化,每一层都必须适应变化的输入——这就是为什么训练时间增加的原因。
为了解决这个问题,我们可以应用批标准化(batch normalization),其中我们规范化隐藏层的激活函数,并尝试使其分布相同。您可以在参考这篇文中有关批处理规范化的更多信息。
尾注
在本文中,我们研究了使用CNNs等深度学习模型时可能面临的不同挑战。我们还学习了所有这些挑战的解决方案。以下是一些你可以尝试的东西:
- 调整 dropout 率
- 增加或减少卷积层数
- 增加或减少密集层的数量
- 调整隐藏层中的神经元数量等。
欢迎关注【数据小盐罐儿】一个很“咸”的数据科学公众号,不定期分享有趣好玩的项目以及大量的学习资源