探秘深海:利用深度学习探测数百种不同的浮游生物物种
早在2014年,Booz Allen Hamilton和俄勒冈州立大学的哈特菲尔德海洋中心组织了一场精彩的数据科学Kaggle竞赛,作为当年国家数据科学碗的一部分。
比赛的目的是创建一种算法,自动将不同浮游生物图像分类为121种不同物种之一。比赛的主页:
传统的用于测量和监测浮游生物种群的方法是耗时的,并且不能扩展到大规模研究所需的粒度或范围。需要改进方法,其中一种方法是使用水下图像传感器。这种拖曳的水下摄像系统可在大型研究区域捕获显微镜下的高分辨率图像。然后可以分析图像以评估物种种群和分布。
国家数据科学碗挑战您构建一个算法来自动化图像识别过程。哈特菲尔德海洋科学中心及其他地区的科学家将使用您创建的算法来研究海洋食物网、渔业、海洋保护等。这是你有机会为世界海洋的健康做出贡献的机会,一次一个浮游生物。
作为阿姆斯特丹大学研究生机器学习课程的一部分,学生们面临着这一挑战。我的团队模型在其他30支球队中排名第三,准确度得分为77.6%,与获胜团队之间的差异约为0.005。
我决定分享一些我们使用的策略、模型、挑战和工具。我们将审议以下项目:
- 深度神经网络:回顾
- 卷积神经网络:回顾
- 激活功能
- 数据一览
- 数据增强技术
- 迁移学习
- 集成或Stacking
- 全部放在一起
深度神经网络
我会假设您已经熟悉人工神经网络(ANN)的概念。如果是这种情况,深度神经网络的概念相当简单。如果情况并非如此,则该视频会对其工作原理进行详尽的说明。
深度神经网络(DNN)是一组特定的人工神经网络,其特征在于具有大量隐藏层以及其他方面。
DNN具有许多层的事实允许它们在分类或回归任务中表现良好,涉及复杂的非结构化数据(例如图像、视频和音频识别)中的模式识别问题。
图像识别任务的示例
卷积神经网络
卷积神经网络(CNN)是DNN的特定架构类型,它增加了卷积层的概念。这些层对于从图像中提取相关特征以执行图像分类非常重要。
这是通过在每个图像的RGB通道上应用不同类型的变换来完成的。因此,在外行术语中,我们可以说Convolution操作在图像通道上执行转换,以便使神经网络更容易检测到某些特定模式。
虽然进入关于卷积层的理论和数学细节超出了本文的范围,但我可以从Goodfellow等人的一本有关深度学习的具有里程碑意义的书籍中的这一章,以便更好地理解卷积层,而且更好地理解与深度学习相关的所有方面。
下面的图片展示了CNN的结构:
卷积神经网络架构
激活功能
激活函数在这种情况下也很重要,对于DNN,一些常用的激活功能是ReLU、tanh、PReLU、LReLU、Softmax等。
这些函数代表了经典人工神经网络的巨大转变,而人工神经网络过去依赖于Sigmoid函数进行激活。已知这种类型的激活功能受到消失梯度问题的影响; ReLU等整流功能为此问题提供了一种可能的解决方案。
数据一览
现在回到我们的问题。数据由训练和测试集组成。在训练集中,有大约24K的浮游生物图像,在测试集中有大约6K的浮游生物图像。
首先看一下数据,显示我们有一个不平衡的数据集——下面的图表显示了我们在训练集中每个物种的图片数量。
不同浮游生物种类的数据集中的图像数量
这是一个问题,特别是对于代表性不足的物种。很可能我们的模型没有足够的训练数据来检测来自这些类的浮游生物图像。
我们用来解决这个问题的方法是为不平衡类设置类权重。基本上,如果我们有图像类A和B,其中A代表不足而B代表性过高,我们可能希望将A类的每个实例视为B类的50个实例。
这意味着在我们的损失函数中,我们为这些实例分配了更高的值。因此,损失变为加权平均值,其中每个样本的权重由class_weight及其对应的类指定。
数据扩充
深度学习的一个可能的警告是,它通常需要大量的训练样本才能获得良好的性能。处理小型训练集的常用方法是扩展它。
这可以通过旋转、缩放、镜像、模糊或剪切原始图像集来为数据集中的一个或多个类生成人工样本来完成。
在我们的例子中,我们使用Keras预处理库来执行在线图像增强——只要通过Keras Image DataGenerator类加载每个批处理,就会逐批进行转换。
迁移学习
解决图像识别问题时需要做出的首要决定之一是使用现有的CNN架构还是创建一个新架构。
我们解决这个问题的第一个方法涉及从头开始创建一个新的CNN架构,我们称之为SimpleCNN。使用这种架构获得的准确度很低--60%。
随着许多研究人员不断在世界各地的不同架构中工作,很快我们意识到,如果不花费大量时间和计算能力对其进行训练和测试,那么就不可能提出一种比现有架构更好的新架构。
考虑到这一点,我们决定利用迁移学习的力量。
迁移学习的基本思想是使用现有的预先训练的,已建立的CNN架构(以及权重,如果需要的话)用于完成特定预测任务。
大多数深度学习平台,如Keras和PyTorch都具有开箱即用的功能。通过使用迁移学习,我们获得了精度在71%和74%之间的模型。
集成学习
我们在迁移学习方面获得了相当好的准确性,但我们仍然不满意。所以我们决定使用我们训练过的所有模型。
大多数成功的Kaggle团队常用的一种方法是训练单独的模型,并使用性能最好的模型创建一个集成。
这是理想的,因为它允许团队成员并行工作。但这个想法背后的主要直觉是来自单个模型的预测,这可能是有偏见的;通过使用来自一个整体的多个预测,我们获得了一个大学意见,类似于做出决定的投票过程。在集成学习中,我们可以进行硬投票或软投票。
我们选择了硬投票。两者之间的主要区别在于,在第一个中,我们执行简单的多数投票,考虑预测类,在第二个中,我们采用每个模型为每个类预测的概率的平均值,最后选择最可能的一个。
把它们放在一起
将各部分综合起来,我们获得了一个具有约77.6%准确度分数的模型,用于预测121种不同类别的浮游生物种类。
下图不仅显示了经过单独训练并成为最终堆栈一部分的不同体系结构,而且还显示了我们为预测管道执行的所有步骤的高层透视图。
该图显示了我们管道的预处理、CNN架构、训练和集成方面
结论和结束语
- 迁移学习非常适合优化新数据产品和平台的上市时间,而且非常直观。
- 从准确性的角度来看,集成学习也很重要 - 但可能会在在线的,现实世界的生产环境场景中呈现出自己的挑战
- 与大多数数据科学问题一样,数据增强和特征工程是获得良好结果的关键
对于将来类似的问题,我们会尝试:
- 使用skimage和OpenCV等库来探索一些离线图像增强
- 将一些基本图像功能(如宽度、高度、像素强度等)提供给Keras的功能API
编译出品