【开源框架】一文道尽主流开源框架中的数据增强

大家都知道有效的数据对于深度学习的重要性,然而有时能够获取的数据确实有限,为了让模型更加鲁棒,我们可以添加数据或者对已有数据做数据增强。下面我具体阐述四个深度学习框架,包括Caffe,Tensorflow,Pytorch,Mxnet。

01Caffe

Caffe实现数据增强,需要用到三个文件。

1.第一个文件为网络配置文件prototxt,见下图。

2.第二个文件为数据输入层cpp

即image_data_layer.cpp,所在位置为下图。

3. 第3个为caffe的proto配置文件

image_data_layer.cpp中的变量在其中进行定义,proto所在位置为下图。

下面我们具体分析。

上面的网络结构中的数据输入层,类型是ImageData,所以数据源是图片。以图中image_data_param对象为例,image_data_param中配置了训练图片的路径source,batchsize,shuffle等,而这些参数的定义,是采用Google的protobuf协议,在caffe.proto中定义的。所以让我们来看proto文件。

下图是image_data_param在proto文件中的对应定义。

从图中我们可以看到prototxt中的source,batch_size,shuffle三个变量。这三个变量在Caffe的运行过程中,只需要载入一次,它用于初始化网络,比如网络输入数据,batchsize,是否打乱文件list等操作,下面颜色标注即对它们的使用。

image_data_layer.cpp是数据读取的cpp,其中有两个函数,一个set_up函数,用于网络数据输入层初始化,还有一个load_batch函数用于批量载入数据。load_batch函数中调用了data_transformer中的一个函数Transform, 所以我们应该再去看data_transformer.cpp。Transform函数它的输入是cv图片和Caffe的blob指针。在这个函数中我们就可以使用各种数据增强函数了。举一个图片转换的例子。以下图片是我在data_transformer.cpp文件中定义的一个旋转函数。

之后在Transform函数中选择是否调用这个函数。大家可以个性化定义函数,用来做数据增强。自定义了函数之后,修改了caffe源码,记得重新编译Caffe。

之后在prototxt中声明调用就好,如下图。

以上就是在caffe中做数据增强的具体流程。主要是要在caffe.proto中定义操作,在data_transformer.cpp应用操作。

02Tensorflow

因为tensorflow官方已经封装好了常用的操作,所以直接调用API即可。相关操作在Images模块中,为了方便我们直接看下截图。

官方的API中数据增强操作非常全面, 而Caffe官方没有提供,需要自己定义。不禁感叹caffe确实有逼格。我截图的第一个版块是对图片的编码解码,下面分别是对图片按类别整理的操作,大家要想了解清楚,还是自己去研读。

03Pytorch

下面看下Pytorch的数据增强使用,依旧是贴心的API接口。Pytorch的数据转换主要是在PIL.Image上,下面来看官方文档,如下图所示。

和Tensorflow一样通过模块调用相应操作即可,这些真没啥好说的。

04Mxnet

Mxnet小巧且功能强大。与Caffe相比,Caffe训练过程中会保存每一层的参数,而Mxnet只保留当前正在前向或者反向传播的参数。Mxnet更适合分布式训练,一般比赛刷榜用的多。

具体操作大家去看Image API模块,下图是一个截图。

05总结

1. 以上方法所做的皆为有监督的数据增强方法,生成的图片,是在已有的图片上直接做几何变换或像素变换,即训练的时候在线使用。当然了,这些数据增强操作毕竟有限,且不一定对所有任务适合。Google最新的研究AutoAugment,是无监督的方法,它能够对不同的任务自动学习不同的操作,是未来重要的研究方向。另外,无监督的数据增强方法还有如GAN,可以做一些数据生成的离线数据增强,也是比较有意思的研究方向。

2. Caffe使用更多的数据增强操作必须修改源码,而其它三个框架则是通过高层API直接使用。为了增进理解,我们应该多去研究caffe源码。

原文发布于微信公众号 - 有三AI(yanyousan_ai)

原文发表时间:2018-07-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券