# 2.8 数据扩充（Data augmentation）

当下计算机视觉的主要问题是没有办法得到充足的数据

最简单的数据扩充方法就是垂直镜像对称

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/f92337ae2e50a0896d42d45cc7951e43.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/f92337ae2e50a0896d42d45cc7951e43.png)

另一个经常使用的技巧是随机裁剪，给定一个数据集，然后开始随机裁剪，得到不同的图片放在数据集中，随机裁剪并不是一个完美的数据扩充的方法，如果随机裁剪的那一部分（红色方框标记部分，编号4）看起来不像猫。但在实践中，这个方法还是很实用的，随机裁剪构成了很大一部分的真实图片

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/709aa552b6a5f4715620047bacf64753.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/709aa552b6a5f4715620047bacf64753.png)

也可以使用旋转，剪切（仅水平或垂直坐标发生变化）图像，扭曲变形，引入很多形式的局部弯曲等等，但在实践中太复杂所以使用的很少

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/e7e2d497b751f798e77e1b040ebbf358.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/e7e2d497b751f798e77e1b040ebbf358.png)

彩色转换：给**R**、**G**和**B**三个通道上加上不同的失真值

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/a5bcde6f0d2c2326be700c0ca441c934.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/a5bcde6f0d2c2326be700c0ca441c934.png)

实践中对**R**、**G**和**B**的变化是基于某些分布，改变可能很小，**R**、**G**和**B**的值是根据某种概率分布来决定，这样会使得学习算法对照片的颜色更改更具鲁棒性

对**R、G和B**有不同的采样方式，其中一种影响颜色失真的算法是**PCA**，即主成分分析，**PCA**颜色增强的大概含义是，如果图片呈现紫色，即主要含有红色和蓝色，绿色很少，然后**PCA**颜色增强算法就会对红色和蓝色增减很多，绿色变化相对少一点，所以使总体的颜色保持一致

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/d69cfc9648f3a37eede074bd28c74c0d.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/d69cfc9648f3a37eede074bd28c74c0d.png)

如果有特别大的训练数据，可以使用**CPU**线程，不停的从硬盘中读取数据，用**CPU**线程来实现失真变形，可以是随机裁剪、颜色变化，或者是镜像

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/2d9b9ca15ce25598d229470494d796ee.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/2d9b9ca15ce25598d229470494d796ee.png)

同时**CPU**线程持续加载数据，然后实现任意失真变形，从而构成批数据或者最小批数据，这些数据持续的传输给其他线程或者其他的进程，然后开始训练，可以在**CPU**或者**GPU**上实现一个大型网络的训练

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/5ee17d350497cb8cf52881f14cb0d9e8.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/5ee17d350497cb8cf52881f14cb0d9e8.png)

常用的实现数据扩充的方法是使用一个线程或者是多线程来加载数据，实现变形失真，然后传给其他的线程或者其他进程，来训练编号2和这个编号1，可以并行实现

在数据扩充过程中也有一些超参数，比如说颜色变化了多少，以及随机裁剪的时候使用的参数
