深度学习训练中为什么要将图片随机剪裁(random crop)

2023-05-16

        图像分类中,深度学习训练时将图片随机剪裁(random crop)已经成为很普遍的数据扩充(data augmentation)方法,随机剪裁不但提高了模型精度,也增强了模型稳定性,但是它如此有效的核心原因是什么呢?仅仅是因为数据扩充吗?这个是下面我们需要研究的问题。

        神经网络的学习(参数估计)本质就是建立输入X与输出Y的统计关系,神经网络的学习问题仍是统计机器学习问题,而神经网络学习往往需要大量的数据,但是我们用大量的数据学习到的模型是否稳定呢?因为神经网络广为诟病的黑箱问题,我们很难用数学原理来推断模型的稳定性(目前模型测试以黑盒测试为主,依赖于测试样本,包括但不限于模型的同分布测试,多场景、跨分布测试,边界测试,极端条件测试等)。模型是否学到了我们希望的特征呢?比如在人脸识别中,人识别相似但不同的人的方法往往是关注几个重要的脸部器官的差异,脸部轮廓的差异,以及明显的特征点(如:痣、胎记等)。但是在训练神经网络的时候很难告诉他我们关注的特征,让他用我们的方法来学习,神经网络不像人那样,你告诉他某个人脸上的胎记可以很好的辨别这个人,他就知道胎记是关键特征,往往只能给他足够多的数据以便于在统计意义上获得我们希望他关注的特征。但是问题来了,比如

      「俄罗斯坦克问题」

       这个故事说,美国军方试图训练一台电脑来区分俄罗斯和美国坦克的照片。 它们的分类准确度非常高,但俄罗斯坦克的所有照片都模糊不清,而美国坦克是高清晰度的。该算法不是识别坦克,而是学习区分模糊和清晰的照片。

       因子特征分布问题

       所以模型训练时会存在这样的问题,即:目的和数据不符合(我们给了模型错误的数据)。 「俄罗斯坦克问题」本质上是一个集合中的概率问题,可以假设训练图片(这里假设每类训练图片数量基本相同)包含因子特征:

        俄罗斯坦克A,美国坦克B

        模糊X,清晰Y

        而类别标签,俄罗斯坦克为C_a,美国坦克为C_b

        所以俄罗斯坦克的图片为I_a=\{A,X\},美国坦克的图片为I_b=\{B,Y\};

        这里存在多映射关系即

                                     P(C_a|A)=P(C_a|X)=P(C_a|I_a)

                                     P(C_b|B)=P(C_b|Y)=P(C_b|I_b)

       我们的目的是给定图片 学习A\rightarrow C_aB\rightarrow C_b的映射关系,但是如果模型建立了X\rightarrow C_a,Y\rightarrow C_b 的映射关系,用以上数据测试仍然显示为正确,但用数据I_c=\{A,Y\}I_d=\{B,X\}测试会发现模型建立了错误的关系。

       所以为了避免数据与目的不符,需要在数据中加入因子XY,即数据变为

                      俄罗斯坦克的图片为: I_a=\{A,X\}I_c=\{A,Y\}

                      美国坦克的图片为:    I_b=\{B,Y\}I_d=\{B,X\};

       这个时候当XY在每类均匀分布的时候,XY被学习器视作为了噪音,即

                                    \frac{P(A|X)}{P(B|X)}=\frac{P(A|Y)}{P(B|Y)}=1

        所以特征 XY对分类的信息增益为 0,即 XY无预测能力,这时才正确建立了与我们目的相符的映射关系。

        * XY对分类的信息增益计算如下

        信息熵:

                           H(\chi ) = - \sum_{i = 1 }^{c} p_i\log p_i ,其中 c 为分类数

        信息增益:

                         Gain(D,\alpha )=H(D)-\sum_{v=1 }^{V}\frac{\left | D^v \right |}{\left | D \right |}H(D^v),这里 D 指数据集,V=2 即清晰与模糊

       这里只有两类,理想情况下样本中每类分布概率为0.5,所以样本的信息熵为:

                        H(D) = -(0.5\log_2(0.5)+0.5\log_2(0.5))=1

       而清晰与模糊特征在每类中均匀分布则概率为0.5,各特征的信息熵为:

                       H(D^X) =H(D^Y) = -(0.5\log_2(0.5)+0.5\log_2(0.5))=1

       所以信息增益为:

                        Gain(D,XY)=H(D) - (0.5*H(D^X)+0.5*H(D^Y)) = 0

       所以如果某个特征在各类间是均匀分布的,那么该特征的信息增益是 0,读者可以扩展到多类问题上。同样的简单举例,如果所有图片都是清晰的,那么清晰对分类也是无预测能力的,套用以上公式信息增益算出来也是 0。

        因子特征的难易问题

        俄罗斯坦克问题还存在另一个问题,即特征难易问题,这里的特征难和易主要指特征提取的难易问题,分类也占了部分和数据特征提取后的最小维度相关。

        这里简单定义特征的难易:以\epsilon(其中 \epsilon \rightarrow 0)的误差正确分类该特征的最小模型容量或函数复杂度。这里特征是高维的,该分类问题包含特征降维(提取)过程,即模型容量包含了降维函数+分类函数的容量(其他可参考VC维及模型容量的概念)。

                                    \frac{1}{n}\sum _{i=0}^{n}\left \| \ \inf F(x)-C \right \|<\epsilon \ \ ; \ s.t. \ \epsilon \rightarrow 0

        \inf F(x)即满足该条件的下界模型容量,所以如上,虽然概率上各特征相同

                                   P(C_a|A)=P(C_a|X)=P(C_a|I_a)

                                   P(C_b|B)=P(C_b|Y)=P(C_b|I_b)

        但是模型对特征的偏好不同,在保证分类误差最小的情况下,模型越简单该模型会更倾向于选择更简单特征(更简单特征的最优模型容量与该模型容量的距离更小)。这里假设区分模糊比区分坦克类型更简单,那么模型将更容易学习到区分模糊和清晰。所以在作训练的时候,目的分类特征越难,越需要保证其他无关特征的分布在类间的均匀。

       深度学习训练中为什么要将图片随机剪裁?

       这个裁剪并不仅仅是增加数据,而如上文也是一个弱化数据噪声与增加模型稳定性的方法。比如假设:

       二类分类问题(如区分人脸与猫脸),C_1类别主要特征为\{E_1,F_1,G_1\}C_2\{E_2,F_2,G_2\},这里的特征可能是非离散的,如人脸的局部patch(眼睛及周围区域,嘴巴及周围区域,为了容易书写用离散的方式)

       增加背景数据噪音:C_1,C_2随机加入N_1,N_2,N_3,这里同上可以表示为非人(猫)脸背景区域

       这个时候随机剪裁可以得到图片(这里为了方便,未考虑组合特征对类别的相关关系,即多个局部特征可以组合为全局特征,这时全局特征有关于类别的关联关系,这个关系和其包含的局部特征不同):如

                                   I_1=\{E_1,F_1,G_1\}

                                   I_2=\{E_1,F_1,G_1,N_1\}

                                  I_3=\{E_1,F1,N_2\}

                                  I_4=\{F_1,G_1,N_3\}

                                          ...

      因为 N_1,N_2,N_3 为随机的而 E_1,F_1,G_1 总是能高概率产生 E_1,F_1,G_1\rightarrow C_1 的映射,这时 \{E_1,F_1,G_1\}任意因子相对于N_1,N_2,N_3有更高的信息增益或者权重。即:

                                  P(C_1|x\in\{E_1,F_1,G_1\})\gg P(C_1|x\in\{N_1,N_2,N_3\})

      如果 N_1,N_2,N_3 在类别 C_2 也有相应的分布,那么N_1,N_2,N_3 对分类的信息增益接近于零。

      假设模型未见过数据I_x=\{F_1,G_1,N_1,N_3\},那么模型如何预测该数据?通过上式我们可以看到F_1,G_1的权重远高于其他特征,即使其他未见过的噪声加入,F_1,G_1因子的权重仍然起主要作用,而个别的因子特征缺失并不会大幅影响模型的预测结果,这个和深度学习中的dropout原理相同,区别是dropout更加随机,所以综上模型有更高的稳定性。

      随机裁剪相当于建立每个因子特征与相应类别的权重关系,减弱背景(或噪音)因子的权重,且使模型面对缺失值不敏感,也就可以产生更好的学习效果,增加模型稳定性。

       同理,数据增强中的光照强度,对比度,柔和度,噪声水平等等,也是同样的道理,看上去是增加模型对于不同数据分布条件下的适应能力,本质上还是这些因子的分布在训练集中是不平衡的,这样就会导致模型的因子偏好,从而影响模型稳定性。

参考:

1. Approximating CNNs with Bag-of-local-Features models works surprisingly well on ImageNet

2. Why do deep convolutional networks generalize so poorly to small image transformations

3. Adversarial Examples Are Not Bugs, They Are Features

4. Imagenet-Trained CNNs Are Biased Towards Texture Increasing Shape Bias Improves Accuracy And Robustness

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习训练中为什么要将图片随机剪裁(random crop) 的相关文章

  • 基于 2 个输入的伪随机数生成器 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我需要根据 2 个输入值 X 和 Y 生成一个伪随机数 给定相同的 X 和 Y 值 我需要得到相同的结果 结果应介于 0 和 1 之间 含
  • 与随机数生成算法相关的种子是什么?为什么经常使用计算机时间来创建该种子?

    我读到了seeds用于初始化随机数生成器 但似乎种子的随机性对于从生成器获得良好的随机性并不重要 所以我想了解什么是seed实际上 为什么这么称呼呢 最后为什么time在计算机系统中是用来生成这样的种子的 伪随机数生成器生成数字序列 它不是
  • 以概率从列表中选择随机元素

    我有一个包含四个项目 A B C D 的列表 每个项目都有被选择的概率 例如 A 有 74 的机会被选中 B 15 C 7 D 4 我想创建一个函数 根据其概率随机选择一个项目 有什么帮助吗 为您的项目定义一个类 如下所示 class It
  • 为 javascript 编写一个真正具有包容性的随机方法

    Javascript MATH 对象有一个随机方法 该方法从集合 0 1 返回 0 含 0 1 不包括 有没有办法返回一个真正随机的方法 其中包括 1 e g var rand MATH random 2 if rand gt 1 rand
  • 裁剪 SVG 的正确方法?

    我对 SVG 图像完全感到困惑 我想将图像裁剪为其核心内容 我想通过指定其视图框和 或视口和 或其他任何内容来裁剪它 除非我不想更改折线元素中的任何点 图像按原样呈现类似这样的内容 注意 边框仅用于说明目的 边框实际上并不是 SVG 的一部
  • Android:将图像裁剪为特定尺寸

    我的目的是让用户从图库中选择一张图像 然后进行裁剪活动 但是 我需要将定义裁剪蒙版的矩形锁定到某个尺寸 然后用户只需重新定位它即可显示图像的一部分 关于如何做到这一点有什么想法吗 Thanks T Intent intent new Int
  • 如何通过从字母数字字符中采样来创建随机字符串?

    我尝试编译以下代码 extern crate rand 0 6 use rand Rng fn main rand thread rng gen ascii chars take 10 collect
  • 为什么我在这段代码中不断得到两个相同的随机值? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 https stackoverflow com questions 932520 why does it appear that my random num
  • 固定长度的随机数

    我想生成一个 0 9 数字且长度 5 的随机整数 我尝试这样做 function genRand min max for var i 1 i lt 5 i var range max min 1 return Math floor Math
  • PHP随机输出数组元素

    我如何从大约 20 个元素的数组中随机回显 5 个元素 Thanks 这有效吗 values array rand input 5 或者 作为更灵活的功能 function randomValues input num 5 return a
  • 在 R 中,如何让 PRNG 在平台之间给出相同的浮点数?

    在 R 4 1 1 中运行以下代码会在平台之间产生不同的结果 set seed 1 x lt rnorm 3 3 print x 22 0 83562861241004716 intel windows 0 8356286124100471
  • java代码的等效vb代码

    谁能告诉我这段Java代码到底做了什么 SecureRandom random SecureRandom getInstance SHA1PRNG byte bytes new byte 20 synchronized random ran
  • 从 Go Slice 中选择一个随机值

    情况 我有一些值 需要从中随机选择一个值 然后我想将它与固定字符串连接起来 到目前为止 这是我的代码 func main create the reasons slice and append reasons to it reasons m
  • 如何生成泊松过程?

    原问题 我想生成一个泊松过程 如果按时间到达的人数t is N t 我有一个带有参数的泊松分布 我如何生成N t 我将如何在 C 中做到这一点 澄清 我最初想使用泊松分布生成过程 但是 我对我需要的过程参数感到困惑 我以为我可以用N t 但
  • iOS 非矩形图像裁剪? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • REST - 获取随机数 GET 还是 POST?

    应该如何在 REST 中正确实现随机数生成器 GET RANDOM or POST RANDOM 服务器每次返回不同的随机数 我可以看到这两种方式的论点 我想说这与返回的包含当前时间的页面相同 其中许多都是使用 GET 完成的 抽象地说 获
  • javascript的随机实现在各种浏览器中的可信度如何?

    我想做一些关于 javascript 和加密的实验 我很好奇随机函数的实现是如何不可预测的 有人做过硬测试吗 显然 浏览器有能力生成强随机性 对于 ssl 问题是它们是否赋予 javascript 相同的强度 一般来说 随机函数在加密方面并
  • 创建一个具有相同定义域和值域的随机双射函数

    创建一个具有相同定义域和值域的随机双射函数 我所说的随机双射函数是指使用随机算法 或至少是伪随机算法 将元素从域映射到范围的函数 而不是像 x y 这样的函数 域和范围有时可能是一个非常小的集合 例如 1 2 3 4 5 因此配对函数将不起
  • 我可以有效地从 HashSet 中随机采样吗?

    我有一个std collections HashSet 我想采样并删除一个均匀随机的元素 目前 我正在做的是使用随机抽样索引rand gen range 然后迭代HashSet到该索引来获取元素 然后我删除选定的元素 这可行 但效率不高 有
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh

随机推荐