分享

怎么参加Kaggle比赛?

 霍振丽 2018-03-12

有个很好的例子是 Kaggle Dogs vs. Cats challenge:

目标很简单:对输入图像分类为狗或猫。这对我们来说非常容易——人脑可以轻松分辨出这两种家庭宠物的差异。

但是,对于一台电脑来说呢?这就没那么简单了。电脑能看到的只是一个巨大的充满 0 和 1 的矩阵。我们如何在这些图像中学习相应的模式,从而分辨猫和狗?2014 年发布这个挑战时,它受到了大家的欢迎。这对于研究人员和工程师来说是个挑战。它获得了大量的关注,因为这个问题看似非常容易。此外,谁不喜欢看这些可爱的小动物呢?超过 200 支队伍参与了这场挑战,他们尝试了数百种算法及其变型,耗费了数千小时的计算时间。

那么今天呢?如果使用从预训练的卷积神经网络中提取的特征,我们可以在这个挑战中获得第二名的好成绩。而且,最棒的事情是,如果使用微软的 DSVM(预下载了所有必备的计算机视觉和深度学习库),我们可以在 22 分钟的时间内获得第二名!代码地址是:http:///5jhwg让我们启动 Ubuntu DSVM 实例,计时开始!

通过特征提取进行迁移学习

通常而言,我们将卷积神经网络视为端到端的图像分类器:

  1. 我们向网络输入图像
  2. 图像经正向传播通过网络
  3. 在网络的末尾获得最终的分类概率

但是,并没有「规则」表明我们必须让图像在整个网络中正向传播。相反,我们可以终止任何一层网络(例如激活层或池化层)的传播过程,在这一位置提取网络的值,然后使用提取的值作为特征向量。让我们用 Simonyan 和 Zisserman 提出的 VGG16 架构举个例子:

上图左侧是原始的 VGG16 的架构,它可以输出 1000 个 ImageNet 类别标签的概率。

为了将网络编程一个特征提取器,我们可以在概念上「移除」网络的全连接层,相反,返回最终池化层(上图右侧)的输出——这个输出将作为我们的特征向量。

由于在 ImageNet 数据集上训练的 CNN 倾向于学习大量的判别过滤器,我们通常可以在未经训练的数据集上使用这些预训练的网络——我们把这个过程成为迁移学习。

我们可以将在 ImageNet 数据集中训练的 CNN 的知识进行迁移,将所学的知识编码为特征向量,然后在这些特征向量的基础上训练一个简单的机器学习模型(例如 Logistic 回归分类器、线性 SVM 等)。

下载 Kaggle:Dogs vs. Cat 数据集

为了了解整个过程的工作流程,请确保已下载:

  1. Jupyter Notebook,它包含了本文的封面
  2. Kaggle Dogs vs. Cats 数据集

为了简单起见,我们不会将测试集提交给评价服务器。相反,只需下载「train.zip」文件即可。注意:如果你尝试使用「test1.zip」,我们将无法从文件路径中提取类别标签。请不要下载「test1.zip」。在你下载「train.zip」之后,将其解压,然后你就会得到一个名为「train」的目录,其中有 25000 张关于猫和狗的、JPG 格式的图片。从这里开始,我们就可以应用迁移学习了。

DSVM上的迁移学习

为保证你能跟上进度,请确保你已下载与本文相关的 Jupyter Notebook。第一个步骤是抓取 Kaggle Dogs. vs. Cats 数据集中所有 25000 张图像的路径(见 cell 3):

Dogs vs. Cats 数据集中文件的名称都诸如「cat.153.jpg」或「dog.4375.jpg」——因为类别标签已经写在了文件名中,所以我们可以很容易地提取它们(见 cell 4)

为了执行特征提取,我们需要一个预训练的网络——ResNet50 是一个不错的选择(见 cell 5)。请注意,我们利用 忽略了所有的全连接层,这让我们能够轻松执行特征提取。

在我们拥有所有的图像路径后,我们需要对它们逐一进行循环,并建立批量,让它们通过网络进行特征提取。

在本节中,介绍整个的循环太过复杂(请参阅我们的 Jupyter Notebook,其中有完整的文件代码),不过其中最重要的代码片段节选如下:

对于每个批量的图像,我们将其传递给神经网络,然后将最大池化层的输出作为我们的特征。我们将最大池化层的输出压缩成 2048-d 的特征向量。这些特征以数据矩阵的形式堆叠在一起,因此我们可以在这些特征上训练模型。

对于 25000 张图像,整个数据矩阵占用大约 204MB 的 RAM,即使是最小规模的机器也可以轻松管理。

整个特征提取过程使用了 Ubuntu DSVM(同样我们不需要手动配置或构建,这节省了大量的时间),共耗时 22 分 48 秒。

考虑到我们提取的特征,我们使用 75% 的数据作为训练集,使用 25%作为测试集,训练了一个 Logistic 回归分类器(网格搜索适当的参数):

训练模型仅用时 36s

所以,我们是如何做到的?

通过评估我们的 Logistic 回归分类器,我们发现我们的模型在测试集上达到了98.8896%的准确率:


这个准确率足以在 Kaggle Dogs vs. Cat 竞赛中获得第二名:

不过,这种比较并不是完全公平,因为我们没有在 Kaggle 竞赛提供的测试集中评估(取而代之,我们生成了我们自己的测试集)并将结果提交给评估服务器(因为这不在本入门教程的范围之内) ,但我认为你应该理解了我要表达的意思。 在不到 25 分钟的计算时间内,我们可以使用:

  1. 微软的 Ubuntu DSVM
  2. 迁移学习/特征提取

建立一个模型,从而在这个挑战中提供具有强大竞争力的准确率。

请自如地使用本文的代码,将其作为你自己深度学习项目的起点。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多