赞
踩
众所周知在搞深度学习的时候数据是一个大问题,实践证明增加数据量在深度学习过程中能提高模型的性能,因此当数据集非常小的时候数据增广就成为了一个必要手段,而数据增广又分为在线增广和离线增广,下面介绍一下这两个方法的区别并列举pytorch和Keras的数据增广方法帮助理解。
数据增广就是对现有的数据进行一些图形学或者几何学上的图像变换,网上有很多介绍的因此这里就不过多介绍了。
在线增广即在模型训练过程中一边训练一边对数据进行增广,这种方法优点是不需要将增广的数据合成出来,因此节省了数据的存储空间,具有很高的灵活性,并且理论上来说训练过程中的数据量是无限的,但是这也可能导致一个问题每个epoch训练的图像都是不一样的,在进行分类或者其他对数据变化要求不太高的任务时这种方法能取得很好的效果,但是在进行如文字识别等对数据变化要求很高的任务时可能不会取得太好的提升,尤其是当数据增广后图像变化很大的情况下模型甚至无法很好的收敛,这种情况下可以尝试离线增广或者在做增广的时候提高使用原图像的概率。
离线增广即在进行模型训练之前就对数据进行增广并生成图像,这种方法的优点是增广的数据可视化,使得开发者能够控制好增广数据的效果,由于离线增广的数据往往都是有限的因此可以很好的评价数据增广对模型性能的提升,但是缺点是需要将增广数据生成出来因此占用更多的存储空间并且灵活性差。
下面介绍pytorch和Keras进行数据增广的demo。
- import torchvision
- # 定义数据增广的操作
- transforms = torchvision.transforms.Compose([
- torchvision.transforms.Resize((224, 224)), #将图像resize
- torchvision.transforms.ColorJitter(hue=.05, saturation=.05),#色彩扰动
- torchvision.transforms.RandomHorizontalFlip(), #随机水平翻转
- torchvision.transforms.RandomRotation(20, resample=PIL.Image.BILINEAR) #随机旋转
- ])
- #加载训练数据并使用增广
- dataset = torchvision.datasets.ImageFolder('datapath', transform=transforms)
- #此方法是在线增广,之后可将dataset传入Dataloader,同一张图像在训练过程中的每个epoch都是不同的。
- from tensorflow.keras.preprocessing.image import ImageDataGenerator
- #定义数据增广操作
- train_datagen = ImageDataGenerator(
- rescale=1./255,#将像素值归一化到[0,1]之间
- shear_range=0.2, # 错切变换
- zoom_range=0.2, #在宽或高的方向放大图像
- rotation_range=15)#旋转
- #加载训练数据集并应用增广
- train_generator = train_datagen.flow_from_directory(
- 'datapath', #数据集路径
- target_size=(100, 100), #将图像resize到100X100
- batch_size=5,
- class_mode='binary',
- save_to_dir='augdatapath',#保存增广数据的路径
- save_prefix='aug',#增广数据明明前缀
- save_format='png')#增广数据保存格式
- #生成增广数据,每调用next()函数一次就生成batch里面图像的增广图像,此处batch_size为5,4个循环生成#20张增广图像。
- for i in range(4):
- train_generator.next()
pytorch支持在线增广,生成离线增广数数据只需调用相应的transforms方法应用在图像上即可,而Keras不仅支持在线增广,而且也支持生成离线增广数据,在flow_from_directory()方法中有相应的保存增广数据的参数。数据增广的方法有很多,本文只是帮助理解在线增广和离线增广的区别。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。