来源:数据派THU

任何领域的成功都可以归结为一套小规则和基本原则,当它们结合在一起时会产生伟大的结果。

机器学习和图像分类也不例外,工程师们可以通过参加像Kaggle这样的竞赛来展示最佳实践。

在这篇文章中,我将给你很多资源来学习,聚焦于从13个Kaggle比赛中挑选出的最好的Kaggle kernel。这些比赛是:

Intel Image Classification:

https://www.kaggle.com/puneet6060/intel-image-classification

Recursion Cellular Image Classification:

https://www.kaggle.com/c/recursion-cellular-image-classification

SIIM-ISIC Melanoma Classification:

https://www.kaggle.com/c/siim-isic-melanoma-classification

APTOS 2019 Blindness Detection:

https://www.kaggle.com/c/aptos2019-blindness-detection/notebooks

Diabetic Retinopathy Detection:

https://www.kaggle.com/c/diabetic-retinopathy-detection

ML Project — Image Classification:

https://www.kaggle.com/c/image-classification-fashion-mnist/notebooks

Cdiscount’s Image Classification Challenge:

https://www.kaggle.com/c/cdiscount-image-classification-challenge/notebooks

Plant seedlings classifications:

https://www.kaggle.com/c/plant-seedlings-classification/notebooks

Aesthetic Visual Analysis:

https://www.kaggle.com/c/aesthetic-visual-analysis/notebooks

我们会讨论调试深度学习解决方案的三个主要方面:

数据

模型

损失函数

还有很多例子项目(和参考资料)供你参考。

数据

图像预处理 + EDA

每一个机器学习/深度学习解决方案都从原始数据开始。在数据处理管道中有两个基本步骤。

第一步是探索性数据分析 (EDA)。它帮助我们分析整个数据集并总结它的主要特征,比如类分布、大小分布等等。通常使用可视化方法来显示这种分析的结果。

第二步是图像预处理,目的是对原始图像提高图像数据(也称为图像特征)的质量,通过抑制不必要的扭曲,缩放,增强重要的特征,使数据更适合模型并提高性能。

你可以钻研这些Kaggle笔记本,看看一些图像预处理技术:

Visualisation:

https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline#Building-a-baseline-model-

Dealing with Class imbalance:

https://www.kaggle.com/rohandeysarkar/ultimate-image-classification-guide-2020

Fill missing values (labels, features and, etc.):

https://www.kaggle.com/datafan07/analysis-of-melanoma-metadata-and-effnet-ensemble

Normalisation :

https://www.kaggle.com/vincee/intel-image-classification-cnn-keras

Pre-processing:

https://www.kaggle.com/ratthachat/aptos-eye-preprocessing-in-diabetic-retinopathy#3.A-Important-Update-on-Color-Version-of-Cropping-&-Ben's-Preprocessing

数据增强

数据增强可以通过从现有的训练样本中生成更多的训练数据来扩展我们的数据集。通过大量的随机转换生成新的样本,这些转换不仅可以生成可信的图像,而且还反映了真实的场景 —— 稍后将对此进行详细介绍。

这种技术得到了广泛的应用,不仅仅是在训练模型的数据样本太少的情况下。在这种情况下,模型开始记忆训练集,但无法泛化(在从未见过的数据上表现很差)。

通常,当一个模型在训练数据上表现很好,但在验证数据上表现很差时,我们称之为过拟合。为了解决这个问题,我们通常会尝试获取新数据,如果没有可用的新数据,则可以使用数据增强。

注:一般的经验法则是始终使用数据增强技术,因为它有助于使我们的模型见识更多的变化并更好地泛化。即使我们有一个很大的数据集,也要使用数据增强,但这是以较慢的训练速度为代价的,因为增强是在线完成的(即在训练期间)。

此外,对于每个任务或数据集,我们必须使用反映可能的现实场景的增强技术(例如,如果我们有一个猫/狗探测器,我们可以使用水平翻转、剪裁、亮度和对比度,因为这些增强匹配不同的照片拍摄方式。

这里是一些Kaggle比赛notebooks,你可以查看流行的数据增强技术:

Horizontal Flip:

https://www.kaggle.com/datafan07/analysis-of-melanoma-metadata-and-effnet-ensemble

Random Rotate and Random Dihedral:

https://www.kaggle.com/iafoss/pretrained-resnet34-with-rgby-0-460-public-lb

Hue, Saturation, Contrast, Brightness, Crop:

https://www.kaggle.com/cdeotte/triple-stratified-kfold-with-tfrecords

Colour jitter:

https://www.kaggle.com/nroman/melanoma-pytorch-starter-efficientnet

模型

开发一个基线

在这里,我们使用一个非常简单的架构创建一个基本的模型,没有任何正则化或dropout层,看看我们是否能超过50%的准确率基线。尽管我们不可能总能达到这个目标,但如果我们在尝试了多种合理的架构后不能超过基线,那么输入数据可能不包含模型进行预测所需的信息。

用Jeremy Howard的名言:

“你应该能够在15分钟内使用50%或更少的数据集快速测试你是否正在朝着一个有希望的方向前进,如果没有,你必须重新考虑一切。”

开发一个足够大可以过拟合的模型

一旦我们的基线模型有足够的能力超过基线分数,我们就可以增加基线模型的能力,直到它在数据集上过拟合为止,然后我们就开始应用正则化。我们可以通过以下方式增加模块容量:

添加更多层

使用更好的结构

更完善的训练流程

结构

根据文献,以下架构的改进提高了模型的容量,但几乎没有改变计算复杂度。

Residual Networks

Wide Residual Networks

Inception

EfficientNet

Swish activation

Residual Attention Network

大多数时候,模型容量和精度是正相关的 —— 随着容量的增加,精度也会增加,反之亦然。

训练过程

下面是一些你可以用来调整你的模型的训练过程,通过实例项目来看看它们是如何工作的:

Mixed-Precision Training

Large Batch-Size Training

Cross-Validation Set

Weight Initialization

Self-Supervised Training (Knowledge Distillation)

Learning Rate Scheduler

Learning Rate Warmup

Early Stopping

Differential Learning Rates

Ensemble

Transfer Learning

Fine-Tuning

超参数调试

与参数不同,hyperparameters是由你在配置模型时指定的(即学习率、epoch的数量、hidden units的数量、batch size大小等)。

你可以通过使用hyperparameter调优库,比如Scikit learn Grid Search,Keras Tuner来自动化这个过程,而不是去手动配置。这些库会在你指定的范围内尝试所有的hyperparameter组合,返回表现最好的模型。

需要调优的超参数越多,过程就越慢,因此最好选择模型超参数的最小子集进行调优。

并不是所有的模型超参数都同样重要。一些超参数会对机器学习算法的行为产生巨大的影响,进而影响其性能。你应该小心地选择那些对模型性能影响最大的参数,并对它们进行调优以获得最佳性能。

正则化

这种方法迫使模型学习有意义和具有泛化能力的数据表示,通过对记忆/过拟合和欠拟合进行惩罚来实现,使模型对于它没见过的数据更鲁棒。

解决上述问题的一个简单方法是获得更多的训练数据,因为一个模型训练的数据越多,自然就会泛化得越好。

这里有一些技巧你可以试着减轻过拟合和欠拟合,项目如下:

Adding Dropout:

https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline

Adding or changing the position of Batch Norm:

https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline

Data augmentation:

https://www.kaggle.com/cdeotte/triple-stratified-kfold-with-tfrecords

Mixup:

https://arxiv.org/abs/1710.09412

Weight regularization:

https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline

Gradient clipping:

https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline

损失函数

损失函数也被称为成本函数或目标函数,用于查找目标输出的模型之间的差异,并帮助模型最小化它们之间的距离。

这里是一些最流行的损失函数,与项目实例,你会发现一些技巧,以提高你的模型的能力:

Label smoothing

Focal loss

SparseMax loss and Weighted cross-entropy

BCE loss, BCE with logits loss and Categorical cross-entropy loss

Additive Angular Margin Loss for Deep Face Recognition

评估 + 错误分析

在这里,我们做消融研究,并分析我们的实验结果。我们确定了我们的模型的弱点和长处,并确定了未来需要改进的地方。在这个阶段,你可以使用以下技术,并在链接的示例中查看它们是如何实现的:

Tracking metrics and Confusion matrix:

https://www.kaggle.com/vincee/intel-image-classification-cnn-keras

Grad CAM:

https://arxiv.org/pdf/1610.02391v1.pdf

Test Time Augmentation (TTA):

https://www.kaggle.com/iafoss/pretrained-resnet34-with-rgby-0-460-public-lb

有许多实验跟踪和管理工具,采取最小设置为你自动保存所有数据,这使消融研究更容易。

最后

有许多方法来调整你的模型,并且新的想法总是会出现。深度学习是一个快速发展的领域,没有什么灵丹妙药。我们必须做很多实验,足够的试验和错误会带来突破。

加入知识星球【我们谈论数据科学】

300+小伙伴一起学习!

·推荐阅读·

python大型项目经验_图像分类:13个Kaggle项目的经验总结相关推荐

  1. 图像分类:13个Kaggle项目的经验总结

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 方向:图像分类,编辑:数据派THU 本文约2800字,建议阅读9分钟 本 ...

  2. 图像分类:来自13个Kaggle项目的经验总结

    来源:机器学习实验室 本文约2800字,建议阅读9分钟 本文作者与你分享图像分类项目经验总结. 任何领域的成功都可以归结为一套小规则和基本原则,当它们结合在一起时会产生伟大的结果. 机器学习和图像分类 ...

  3. java后端简历项目经历_从面试官甄别项目经验的角度,说说如何在简历中写项目经验(Java后端方向)...

    在大多的JD(职位介绍)里,会写明该职位需要xx时间的相关经验,换句话说就是需要在简历中看到一定年限的相关商业项目经验,否则估计连面试的机会都没. 在本文里,不讨论这种门槛是否合理,而会以Java相关 ...

  4. python开源项目贡献_如何通过为开源项目做贡献来发展自己的职业

    python开源项目贡献 我16岁的儿子Prahlad刚走进我们的公寓. "他说什么???" 我问. "他说'是'." 轻描淡写,玩起来很酷,就像许多青少年与父 ...

  5. python视频车流量计数_视频访问量实时统计项目学习

    (一)效果图 先来两个效果图看看 图1 图2 #coding=UTF-8 import random import time url_paths = [ // "/www/2", ...

  6. python大型游戏脚本_论做游戏脚本,Python输过谁?

    玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢? ​ 我打开了4399小游戏网,点开了一个不知名的游戏,唔,做寿司的,有材料在一边,客人过来后说出他们的要求,你按 ...

  7. python项目构建_通过构建4个项目来学习Python网络

    python项目构建 The Python programming language is very capable when it comes to networking. We've releas ...

  8. python简单的编程_简单的Python2.7编程初学经验总结

    如果你从来没有使用过Python,我强烈建议你阅读Python introduction,因为你需要知道基本的语法和类型. 包管理 Python世界最棒的地方之一,就是大量的第三方程序包.同样,管理这 ...

  9. python电商项目介绍_电商大数据项目-推荐系统实战(一)

    本项目是基于Spark MLLib的大数据电商推荐系统项目,使用了scala语言和java语言.基于python语言的推荐系统项目会另外写一篇博客.在阅读本博客以前,需要有以下基础: 1.linux的 ...

最新文章

  1. 数字化正在使CIO职责发生变化
  2. vue $emit、$on、$refs简介
  3. python精彩编程200例百度_Python趣味编程与精彩实例
  4. 数据结构(二)算法基础与复杂度
  5. 二叉搜索树的经典问题
  6. 官宣!华为主导首个软件定义摄像机国际标准诞生
  7. MongoDb和LINQ:如何汇总和加入集合
  8. 如何做好 VMware vSphere 性能优化?
  9. 使用函数计算打包下载OSS文件
  10. 微型计算机 持续更新,2020年南京邮电大学810《微机原理及应用》硕士研究生入学考试大纲...
  11. 238.除自身以外数组的乘积 (力扣leetcode) 博主可答疑该问题
  12. How to disable cursor positioning and text selection in an EditText? (Android)
  13. 关于AP没办法获取IP地址故障排查及思路。
  14. nuc7 android tv,7代NUC小白超高清体验NUC7I3BNH
  15. CMAP是否可以使用RemoveAll()释放内存?CMAP如何释放内存?
  16. openCV5-Threshold and Mask
  17. 风靡全球的15则数学动图,让你秒懂数学概念
  18. 苹果注定要输给欧盟,USB-C成为标准接口已是大势所趋
  19. js word 预览_Node.js微服务实践(二)
  20. 计算机清理垃圾代码,让你电脑快速开机清除系统垃圾运行批处理源代码

热门文章

  1. 构建忽略测试_分类测试以减少构建时间
  2. 如何在单个API中支持Java 6、8、9
  3. cks子,间谍,局部Mo子和短管
  4. play 打包 模块_全新的Play模块资料库
  5. 从战中反弹:将Git提交信息作为JSON返回
  6. Java性能调优:充分利用垃圾收集器
  7. JavaOne 2014:会议与合同利益冲突
  8. Spring @Transactional实际如何工作?
  9. 具有angularjs资源的Spring Rest Controller
  10. Java 8中的默认方法(Defender方法)简介