> ## Content Index
> Fetch the complete content index at: https://yinguobing.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# 深度学习训练图像太少怎么办
- URL: https://yinguobing.com/blog/short-of-images-for-deep-learning/
- Published: 2017-11-13T07:53:06.000Z
- Updated: 2017-11-13T08:00:04.000Z
- Description: 深度学习庞大的参数量对训练数据量提出了新的要求。如果我们手头数据非常有限怎么办？
- Author: 尹国冰
- Tags: 深度学习, TensorFlow

深度学习庞大的参数量对训练数据量提出了新的要求。如果我们手头数据非常有限怎么办？

# 为什么深度学习需要大量数据

深度学习的背后是深度神经网络。从2012年起，ImageNet竞赛中的历年冠军都采用深度神经网络作为问题的解决方案，并且网络的深度也呈现出逐年加深的趋势。从2012年Alexnet的8层一举增加到了2015年Resnet的152层。伴随着网络加深带来的一个重要变化就是参数量的增加，例如Resnet网络中有2千多万个节点，参数量达到了1亿4千多万。从参数数量来看，深度神经网络是一个非常复杂的模型。

![图片来源：TED](https://yinguobing.com/blog/content/images/2017/11/lifeifei.jpg)

在统计学习领域，有一个重要的概念叫做VC Dimension。它可以用来描述统计学习算法的表现能力。具体算法模型的表现可以用如下公式来表示：

![formular_vc_dimension](https://yinguobing.com/blog/content/images/2017/11/formular_vc_dimension.jpg)

其中D为VC Dimension，N为训练样本的数量。一般算法越复杂，D越大。从公式可以看出，为了保证Pr，D越大的复杂模型所需要的N也越大[\[1\]](#fn1)。

所以，数据量的大小对于深度学习来说非常重要。尤其当所要解决的问题需要复杂模型来对应的时候。在知名机器学习竞赛网站Kaggle上，你可以找到各种各种样的数据集竞赛。从这些数据集我们可以一窥机器学习所需数据量的大小[\[2\]](#fn2)。

![kaggle_data_size](https://yinguobing.com/blog/content/images/2017/11/kaggle_data_size.jpg)

但是实际情况中，我们要解决的问题往往是非常个性化的，并且可能由于种种原因，没有对数据进行有效的记录，导致数据集的大小非常有限，甚至没有数据集。

缺乏数据是目前深度学习在定制应用领域面临的一大问题。即便是本身拥有大量数据的公司，更多的数据同样会对模型带来有益的效果。为此行业内也提出了一些对应方法，这些方法在某种程度上可以改善因数据不足造成的模型泛化能力差的现象。

# 图像数据增强的方法

以图像分类为例。对于深度学习来说，学习重点在图像本身包含的信息，例如下图里有一辆汽车。理解图中的物体是“汽车”这个信息是深度学习的目标。幸运的是，图像本身是一种结构化的数据，对图像进行一些空间或者频率上的变换可以模拟数据集中不存在的真实情况，并且这些变换不会对图像的语义产生极大影响。通过这些变换，训练图像的数量显著增加，图像数据集获得增强。

![vw_van](https://yinguobing.com/blog/content/images/2017/11/vw_van.jpg)

常见的图像变换操作包括：

- 局部裁剪，翻转、旋转
- 亮度，对比度，Gamma
- 色相，饱和度

同一幅图像经过一种变换、或者多种变换的组合会生成一幅新的图像，更进一步，变换的位置、方向、变化量级是随机的，进而增加了训练样本的数量。

## 随机裁剪

为了防止深度神经网络过拟合，可以通过对训练图像进行随机裁剪的方式来获得新的训练数据。经过裁剪的图像只保留了原始图像的局部信息，用这样的样本去训练神经网络相当于要求神经网络具备“从局部推断整体”的能力，也就是具备更好的泛化能力。在使用随机裁剪时需要注意：裁剪区域过小可能会造成主体目标被裁掉，导致样本无效。

![Say hello to my cat Shawn](https://yinguobing.com/blog/content/images/2017/11/shawn.jpg)

## 随机翻转

翻转是指将图像沿水平或者垂直方向进行翻转。这种操作适用于图片中的样本存在水平或者垂直对称性的情况。旋转是指以图片中心为原点，在图像平面内进行旋转操作。若要进行这两种操作，需要格外留意神经网络的输出是否是对称性敏感的。如果你希望你的神经网络能够区分出左手与右手，那么在训练过程中对样本进行随机水平翻转恐怕不是个好主意。

![flip](https://yinguobing.com/blog/content/images/2017/11/flip.jpg)

在“基于深度学习的手势检测“中，我们采用Hololens以第一人称视角的方式录制了2000多个手势。由于Hololens拍照需要用一只手做出手势触发，所以训练样本以左手为主。通过采用左右翻转的图像数据集增强策略，完成训练的神经网络仍然可以检测出右手做出的手势。

## 明亮程度

实际场景中的物体往往处于不同的光照环境下，因此亮度、对比度与Gamma调整可以使图片在亮度上呈现出差异性，并且不改变图片本身的语义。如果训练样本图片本身存在过曝或者曝光不足的情况，这些调整可能会使得图片细节大量丢失，造成样本作废。因此图片明暗程度的调整也需要根据训练样本的实际情况去做出选择。

![chair](https://yinguobing.com/blog/content/images/2017/11/chair.jpg)

## 色彩

色彩也是物体的一个非常重要的视觉特征。色相与饱和度是从色彩的角度对数据集进行增强。调整饱和度可以模拟在不同成像条件下所拍摄到的图像，例如香蕉始终是黄色，即使饱和度调整之后它依旧是香蕉本身。但是色相的调整要格外小心。同一型号的汽车可能有不同的外观色，但是一只蓝色的橙子出现的概率就微乎其微了。

![color_transform](https://yinguobing.com/blog/content/images/2017/11/color_transform.jpg)

# 总结

以上这些用于图像数据集增强的变换方式在TensorFlow中获得了原生支持。具体可以参考官方的API文档[\[3\]](#fn3)。如果你在实际使用中也遇到了数据集太小的问题，可以尝试一下本文列出的方法。

---

1. [为什么深度学习对训练样本的数量要求较高？](https://www.zhihu.com/question/29633459/answer/45138977?ref=yinguobing.com) [↩︎](#fnref1)
2. [https://www.kaggle.com/datasets](https://www.kaggle.com/datasets?ref=yinguobing.com) [↩︎](#fnref2)
3. [https://tensorflow.google.cn/api\_guides/python/image](https://tensorflow.google.cn/api%5Fguides/python/image?ref=yinguobing.com) [↩︎](#fnref3)