从数据预处理、增强、模型优化、调参再到损失函数...

本文转载自:AI公园
作者:Prince Canuma 编译:ronghuaiyang

注:文末附CV学习交流群

导读

覆盖了模型相关的方方面面,从数据准备到模型的推理,每个阶段的方法和要点,非常多的参考资料,足够看一段时间了。

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

机器学习和图像分类也不例外,工程师们可以通过参加像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

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

最后

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

英文原文:https://neptune.ai/blog/image-classification-tips-and-tricks-from-13-kaggle-competitions

CVer-学术交流群

建了CVer微信交流群!想要进计算机视觉学习交流群的同学,可以直接加微信号:CVer5555。加的时候备注一下:研究方向+学校+昵称,即可。然后就可以拉你进群了。

强烈推荐大家关注CVer知乎账号和CVer微信公众号,可以快速了解到最新优质的CV论文。

推荐阅读

利用知识蒸馏改进目标检测:面向准确高效的检测器

使用深度学习从视频中估计车辆的速度(已开源)

ECCV 2020 | 旷视开源LabelEnc:提升目标检测的新型中间监督方法

这9个技巧让你的PyTorch模型训练得飞快!

牛津博士论文 | 学习重建和分割3D目标(143页PDF)

谷歌刚刚发布Objectron新数据集,可完美检测3D目标,超过4百万幅图像和15K视频剪辑!

综述 | MIT提出视频理解/行为识别:全面调研(2004-2020)

综述 | 基于无人机的目标跟踪的相关滤波器:全面调研

从三个维度加速你的CNN:全面的剪枝框架

DeformCaps:第一个用于目标检测的可变形胶囊网络

Recall Loss:用于不平衡图像分类和语义分割的召回损失

即插即用!Rotate to Attend:卷积Triplet注意力模块

旷视提出MegDetV2:目标检测/实例分割系统

综述 | 基于深度学习的医学图像分割技术:全面调研

ResNet还是DenseNet?即插即用的DS涨点神器来了!

综述 | 基于深度学习的端到端人脸识别技术:全面调研

TBC:共享Thinner Filters,实现更强的CNN!

综述 | 行人检测技术(从手工特征到深度学习):全面调研

超越EfficientNets!无需注意力,也能让你的网络更快更强!

OpenCV 4.5来了!更强的SIFT,改进RANSAC算法,新增目标跟踪网络SiamRPN++

综述 | 基于深度学习的实时语义分割方法:全面调研

涨点神器!南航提出AFF:注意力特征融合

NeurIPS 2020 | 谷歌大脑提出:重新思考预训练和自训练

NeurIPS 2020 | 用于图像复原/恢复的神经稀疏表示

NeurIPS 2020 | aLRPLoss:统一目标检测中的分类和定位的平衡损失函数

CCE:具有互补交叉熵的不平衡图像分类

谷歌地标检索2020 Kaggle 第一名解决方案

ECCV AIM 2020 真实图像超分辨率挑战赛3项冠军解决方案

LVIS 实例分割挑战赛2020的第一名解决方案:好的Box不能保证好的Mask

ETH Zurich提出DPIR:具有Denoiser先验的即插即用图像恢复

综述 | 人脸图像质量评估:全面调研(2004-2020)

ECCV 2020 | NAS-DIP:通过NAS实现DIP(去噪/去雾/超分辨率/修复等)

TIP 2020 | PNEN:金字塔Non-Local增强型网络

综述 | 小样本学习:全面调研(Few-shot)

MiCo:用于半监督域自适应的Mixup联合训练

使用深度神经网络从Noisy Labels中学习:全面调研

剪枝filter?还是剪枝layer?这是个问题

ECCV 2020 | WeightNet:重新探索Weight网络的设计空间

Mask TextSpotter v3:用于场景文字检测和识别的分割Proposal网络

ECCV 2020 | 魔鬼在细节中:车辆重识别的自监督注意力(SAVER)

ECCV 2020 | 53.5 AP!PAA:用于目标检测的IoU预测的概率Anchor分配

ECCV 2020 | 南京理工提出FPT:特征金字塔Transformer

ECCV 2020 | 长尾数据集中多标签分类的分布平衡损失

ECCV 2020 | BMask R-CNN:边界保持的Mask R-CNN

ECCV 2020 | 即插即用!PSConv:将特征金字塔压缩到紧凑

cv图像翻转_涨点技巧!汇集13个Kaggle图像分类项目的性能提升指南相关推荐

  1. 涨点技巧!汇集13个Kaggle图像分类项目的性能提升指南

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 本文转载自:AI公园 作者:Prince Canuma  编译:ronghuaiyang 导读 ...

  2. ios 图像翻转_在iOS 14中使用计算机视觉的图像差异

    ios 图像翻转 Human eyes are very receptive to visual representations. Similarly, computer vision enables ...

  3. cv图像翻转_OpenCV 图像反转

    /*程序名:invImage.c功能:读入图像文件,进行图像翻转并显示在屏幕上*/#include#include#include#include"cv.h"#include&qu ...

  4. 怎么使图表居中显示_【Excel技巧】制作柱形图图表完美呈现百分比,提升您的报表颜值...

    Excel做报表分析,涉及到数据对比,图表和表格两种表达形式,老板肯定更青睐图表.因为图表更能形象地表示数据之间的关系,可以比较数据的差距,让人一目了然. 例如: 如果,你的报表是这样子: 人家的报表 ...

  5. python写spark的效率问题_“大数据架构”Spark 3.0发布,重大变化,性能提升18倍...

    我们激动地宣布,作为Databricks运行时7.0的一部分,可以在Databricks上使用Apache SparkTM 3.0.0版本.3.0.0版本包含超过3400个补丁,是开源社区做出巨大贡献 ...

  6. 图像翻转操作:深入了解cv::flip函数

    文章目录 引言: 1. cv::flip函数概述: 2. 代码示例: 3. 结果分析: 4. 总结: 引言: 在图像处理中,图像翻转是一种常见的操作,它可以在水平.垂直或同时水平和垂直方向改变图像的方 ...

  7. python函数图像平移_[Python图像处理]六.图像缩放,图像旋转,图像翻转与图像平移...

    图像缩放 图像缩放主要是调用resize()函数实现,result = cv2.resize(src, dsize[, result[.fx, fy[,interpolation]]])  其中src ...

  8. 新手炼丹师的调参内经——深度学习涨点技巧总结

    新手炼丹师的调参内经--深度学习涨点技巧总结 训练神经网络的过程就像是一个炼丹的过程,各位炼丹师们除了要设计一个好的丹方(Contribution),配置好的炼丹炉(GPU Server),当然这其中 ...

  9. 【CNN结构设计】无痛的涨点技巧:ACNet

    ❝ 论文链接:https://arxiv.org/pdf/1908.03930.pdf ❞ 1. 前言 不知道你是否发现了,CNN的结构创新在这两年已经变得相对很少了,同时要做出有影响力并且Solid ...

最新文章

  1. JQuery插件:ScrollTo平滑滚动到页面指定位置
  2. 理解Vue 2.5的Diff算法
  3. 音视频开发(30)---新一代视频编码标准:HEVC、AVS2和AV1性能对比报告
  4. Mysql 用Not In 的问题:子查询的结果中有Null则查不出来
  5. Request介绍及演示样例 PART1
  6. Udp---模拟实现客户端与服务器通信
  7. HDU1286 找新朋友
  8. C语言求素数中flag的作用,c语言编程判断素数 c语言程序设计(判断素数)
  9. 为什么要使用McAfee Endpoint Security?
  10. 利用MATLAB求均值、方差和标准差
  11. android使用h5框架,轻量级Android  H5 Native Hybrid 框架
  12. 程序员必备技能之上传代码(Github篇)
  13. MA5671 上海联通配置指南
  14. 计算机计算建筑结构的方法有哪些,建筑结构设计包括哪些内容呢?
  15. CSDN最全数学公式
  16. 复印机的工作过程大致如下
  17. 推荐一个开源的LMS系统ILIAS
  18. 南土所褚海燕组综述微生物组学的技术和方法及其应用
  19. Linux系统使用rsync命令进行本地备份还原详解
  20. ege寻宝挑战游戏(C、C++)(大一上游戏项目)

热门文章

  1. html里面怎么ul加高度,div里面嵌套了ul,为什么div的高度小于ul高度
  2. impala写入oracle,dataframe 写入 impala 语法错误,怎么解决?
  3. java 开发详解_面向接口编程详解-Java篇
  4. zip版mysql5.6_mysql 5.6 压缩包版安装方法
  5. crt 8.7.3 黑暗模式_科技有意思 | 黑黑黑黑黑黑黑黑暗模式
  6. 解锁设备_无师自通解锁新设备抗击疫情
  7. wordpress添加html媒体文件,WordPress“添加媒体”文件时只显示上传到当前文章的附件图片...
  8. 谷歌浏览器无网络连接 打不开网页解决办法
  9. win7系统屏幕键盘打开教程
  10. springMVC问题XXX is not mapped [from XX]或者Unknown entity: com.spring.main.pojo.Person