博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现批量数据增强 | keras ImageDataGenerator使用
阅读量:6822 次
发布时间:2019-06-26

本文共 3312 字,大约阅读时间需要 11 分钟。

微信公众号:

关注和置顶公众号可第一时间了解公众号最新咨询

内容目录(由[TOC]自动生成)

什么是数据不均衡问题

这里简单说明一下,重点是操作和应用:

1、数据不均衡问题

在大部分情况下,我们认为不同类别的数据是均匀分布的,很多算法也是基于这个假设,但是在真实的情况下,往往都不是如此的。例如,机器发送故障的情况是我们想要预测的,但实际上故障的概率是很低的,所以导致故障的样本量很少,即使你将所有的预测结果都设置为正常,准确率依然很高,但这个模型是一个没有用的模型,这种类似的例子是非常常见的。

2、常见的解决方法

解决的方案很多,主要从两个方面考虑(面试的时候可能会问)

1)数据层面
2)算法层面

在项目中,我们可能没那么多时间去思考从算法方面去解决,更多的时候想的是能用就行,但是网上很多的例子很多是基于内置的数据,这是非常让人难受的,或者是基于一张图片进行数据增强,很痛苦。更一般的情况是,对训练集下的某一个文件夹的所有图片进行数据增强,这就是我写这个的理由。

函数说明

准备工作

所使用的环境

Python3.6、tensorflow-gpu 1.5.0、keras2.2.4

功能说明

1)ImageDataGenerator 图片生成器

2)flow_from_directory 以文件夹路径为参数,生成经过数据提升/归一化后的数据,在一个无限循环中无限产生batch数据

参数说明

1)ImageDataGenerator 图片生成器

from keras.preprocessing.image import ImageDataGenerator datagen = ImageDataGenerator(         rotation_range=40,         width_shift_range=0.2,         height_shift_range=0.2,         rescale=1./255,         shear_range=0.2,         zoom_range=0.2,         horizontal_flip=True,         fill_mode='nearest',         cval=0,         channel_shift_range=0,         horizontal_flip=False,         vertical_flip=False,         rescale=None) 复制代码
参数

rotation_range:整数,数据提升时图片随机转动的角度

width_shift_range:浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度
height_shift_range:浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度
rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)
shear_range:浮点数,剪切强度(逆时针方向的剪切变换角度)
zoom_range:浮点数或形如[lower,upper]的列表,随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]
fill_mode:‘constant’‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理
cval:浮点数或整数,当fill_mode=constant时,指定要向超出边界的点填充的值
channel_shift_range: Float. Range for random channel shifts.
horizontal_flip:布尔值,进行随机水平翻转
vertical_flip:布尔值,进行随机竖直翻转
rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前

2)flow_from_directory

gen = datagen.flow_from_directory(                            path,                            target_size=(224, 224),                            batch_size=15,                            save_to_dir=dst_path,#生成后的图像保存路径                            save_prefix='xx',                            save_format='jpg') for i in range(6):     gen.next() """ path:文件读入的路径,必须是子文件夹的上一级(这里是个坑,不过试一哈就懂了) target_size:图片resize成的尺寸,不设置会默认设置为(256.256) batch_size:每次输入的图片的数量,例如batch_size=32,一次进行增强的数量为32, 个人经验:batch_size的大小最好是应该和文件的数量是可以整除的关系 save_to_dir:增强后图片的保存位置 save_prefix:文件名加前缀,方便查看 save_format:保存图片的数据格式 产生的图片总数:batch_size*6(即range中的数字) """ 复制代码

完整代码

from keras.preprocessing.image import ImageDataGenerator path = 'E:/C3D_Data/train' # 类别子文件夹的上一级 dst_path = 'E:/C3D_Data/train_result' #  图片生成器 datagen = ImageDataGenerator(     rotation_range=5,     width_shift_range=0.02,     height_shift_range=0.02,     shear_range=0.02,     horizontal_flip=True,     vertical_flip=True ) gen = datagen.flow_from_directory(                            path,                            target_size=(224, 224),                            batch_size=15,                            save_to_dir=dst_path,#生成后的图像保存路径                            save_prefix='xx',                            save_format='jpg') for i in range(6):     gen.next() 复制代码

效果展示

总结

1、能基本实现我们需要的数据增强的要求

2、但是实际上数据增强的手段不止这些(有兴趣可以继续探索)

这里需要强调一点,ImageDataGenerator里面应该是每一张图片进去都会随机有可能受到所有的操作(例如裁剪,旋转等)的作用

希望每一篇用心写的推文都能帮助到你,可能你已经是大神了,这些对你没啥用,但是这却是新手一开始都会遇到的难题,不想大家因为一点小小的挫折就放弃,所以推文一方面是记录自己真实遇到的坑,另一面也希望能够提升自己的表达能力。

代码已经更新到:

希望能够得到你们一颗真心的star(还没被点过)

转载地址:http://fzmzl.baihongyu.com/

你可能感兴趣的文章
滑动窗口的最大值
查看>>
[转]BT常用渗透命令
查看>>
面向.Net程序员的前端优化
查看>>
HTTPS到底是个什么鬼?
查看>>
Yii框架中ActiveRecord使用Relations
查看>>
leetcode 55.跳跃游戏
查看>>
flexPaper +swftools实现文档在线阅读
查看>>
分形树的绘制
查看>>
获取父页面标签对象,获取当前标签div高度
查看>>
分享10条PHP性能优化的小技巧,帮助你更好的用PHP开发:
查看>>
loadrunner请求中有汉字 如何编码
查看>>
java数据结构 • 面向对象 • 异常 • 随机数·时间
查看>>
springmvc 实现pc端手机端适配(同一个请求根据不同客户端展示不同界面)
查看>>
BTree和B+Tree详解
查看>>
VS2005工程迁移到Eclipse CDT
查看>>
Linux高端内存映射(上)【转】
查看>>
usb_control_msg参数详解【转】
查看>>
8086汇编指令速查手册
查看>>
Node.js安装及环境配置
查看>>
j2EE web.xml中的url-pattern的映射规则
查看>>