简介

本文主要以 Caltech101 图片数据集为例,讲解 Keras 中的数据处理模块(数据读入、预处理、增强等)。

数据集构建

本文使用比较经典的 Caltech101 数据集,共含有 101 个类别,如下图,其中BACKGROUND_Google子文件夹为杂项,无法分类,使用该数据集时删除该文件夹即可。

这里不妨将数据集重构为常见数据集格式,这样便于后面说明 Keras 的数据加载 API。具体重构数据集的代码可在文末 Github 找到,这里不做赘述,最后生成数据集如下,分为训练集、验证集和测试集(比例 8:1:1),每个文件夹下有 101 个子文件夹代表 101 个类别的图片。

数据划分完成后就要制作相关的数据集说明文件,在很多大型的数据集中经常看到这种文件且一般是csv 格式的文件,该文件一般存放所有图片的路径及其标签(包含的就是所有数据的说明)。生成了三个说明文件如下,图中示例的是训练集的说明文件。这部分的具体代码也可以在文末 Github 找到。

Keras数据读取API

上一节,构建了比较标准的数据集及数据集说明文件,Keras对于标准格式存储的数据集封装了非常合适的数据加载相关的API,这部分API都在Keras模块下的preprocessing模块中,主要封装三种格式的数据,分别为图像、序列、文本(对应模块名为image,sequence,text),本系列文章均以图像数据为主,其他类型数据加载可以查看TensorFlow官方文档相关部分。

tf.keras.preprocessing.image下封装了一些方法如img_to_arrayarray_to_imgload_imgsave_img等,但是这些都是琐碎的对具体图片的处理,对整个数据集进行处理的关键是tf.keras.preprocessing.image.ImageDataGenerator这个类,我们通过该类实例化一个数据集生成器对象,该对象不包含具体数据集的数据,只含有对数据的处理手段。

具体参数如下,包含大部分常用的数据增强的方法如ZCA白化、图像标准化、随机旋转、随机平移、翻转等,具体参数含义可以查看我关于Keras数据增强的文章,这里不多赘述。

tf.keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, samplewise_center=False,featurewise_std_normalization=False, samplewise_std_normalization=False,zca_whitening=False, zca_epsilon=1e-06, rotation_range=0, width_shift_range=0.0,height_shift_range=0.0, brightness_range=None, shear_range=0.0, zoom_range=0.0,channel_shift_range=0.0, fill_mode='nearest', cval=0.0, horizontal_flip=False,vertical_flip=False, rescale=None, preprocessing_function=None,data_format=None, validation_split=0.0, dtype=None
)

这里构造三个生成器,对应训练集、验证集、测试集,由于训练集用于训练可以进行数据增强(简单进行了翻转、旋转等预处理方法),验证集和测试集为了验证模型效果,不能进行数据增强。

train_gen = keras.preprocessing.image.ImageDataGenerator(rescale=1/255.,horizontal_flip=True,shear_range=0.2,width_shift_range=0.1
)
valid_gen = keras.preprocessing.image.ImageDataGenerator(rescale=1/255.
)
test_gen = keras.preprocessing.image.ImageDataGenerator(rescale=1/255.
)

获得设定了数据预处理方法的数据集生成器,那么具体的数据怎么读取呢?事实上,ImageDataGenerator对象封装了三个flow开头的方法,分别为flowflow_from_directory以及flow_from_dataframeflow表示从张量中批量产生数据,会迭代返回直到取完整个张量,使用不多;flow_from_directoryflow_from_dataframe是很常用的数据加载方法,他们依据数据集文件夹或者数据集说明文件读取Dataframe到本地进行数据读取,每次读取一个批次,占用内存和显存较小,符合实际训练需求。

flow(x,y=None,batch_size=32,shuffle=True,sample_weight=None,seed=None,save_to_dir=None,save_prefix='',save_format='png',subset=None
)
flow_from_directory(directory,target_size=(256, 256),color_mode='rgb',classes=None,class_mode='categorical',batch_size=32,shuffle=True,seed=None,save_to_dir=None,save_prefix='',save_format='png',follow_links=False,subset=None,interpolation='nearest'
)
flow_from_dataframe(dataframe,directory=None,x_col="filename",y_col="class",weight_col=None,target_size=(256, 256),color_mode='rgb',classes=None,class_mode='categorical',batch_size=32,shuffle=True,seed=None,save_to_dir=None,save_prefix='',save_format='png',subset=None,interpolation='nearest',validate_filenames=True,**kwargs
)

上述三个数据生成的方法具体参数在我的数据增强博文中解释了常用的一些,其他的可以参考官方文档。

例如,使用flow_from_directory读取上一节生成数据集的训练集,具体代码和结果如下(第一行输出是因为generator获得具体数据后会进行一个默认信息的输出,共6907张图片,按照给定的32的批尺寸,需要迭代215步)。

train_generator = train_gen.flow_from_directory(directory="../data/Caltech101/train/",target_size=(224, 224),batch_size=32,class_mode='categorical'
)print("class number", train_generator.classes)
print("images number", train_generator.n)
print("steps", train_generator.n // train_generator.batch_size)
Found 6907 images belonging to 101 classes.
class number [  0   0   0 ... 100 100 100]
images number 6907
steps 215

再例如,使用flow_from_dataframe按照数据集说明文件读取数据(DataFrame使用Pandas预先读取),该方法实际上是上一种方法的变种,当数据集没有按照文件夹划分训练和测试,而是由说明文件划分时,该方法非常实用。示例代码和运行结果如下(这里directory参数为空是因为说明文件给出的就是对于当前目录的数据集目录,而该方法是按照当前目录+directory参数目录+dataframe指定目录进行索引,故此处为空即可)。

df_train = pd.read_csv('../data/desc_train.csv', encoding='utf8')
df_train['class'] = df_train['class'].astype(str)train_generator = train_gen.flow_from_dataframe(dataframe=df_train,directory="",x_col='file_name',y_col='class',target_size=(224, 224),batch_size=32,class_mode='categorical'
)print("class number", train_generator.classes)
print("images number", train_generator.n)
print("steps", train_generator.n // train_generator.batch_size)
Found 6907 images belonging to 101 classes.
class number [  0   0   0 ... 100 100 100]
images number 6907
steps 215

数据使用

现在通过构造完整的数据生成器,有了获得具体数据的途径,事实上这个生成器就是一个数据迭代器而已,可以类似Pytorch动态图那样通过循环访问每一批次的数据,代码如下;也可以通过Keras对Generator封装的训练方法fit_generator一键实现训练,这点我们后面的文章提到。

for step, (x, y) in enumerate(train_generator):print(x.shape)print(y.shape)

补充说明

本文主要介绍使用Keras对图像数据的加载、增广、使用等,具体代码可以查看我的Github,欢迎Star或者Fork。

Keras-数据准备相关推荐

  1. 人工智能--Keras数据加载与增强

    实验目的和要求: 掌握Keras图像数据加载的方法 掌握Keras图像数据增强的方法 实验内容: 假设cifar10有10类的数据,分别存在10个文件夹,每个文件夹的图像来自同一类.训练数据文件夹结构 ...

  2. keras数据输入非常大怎么办?分批次?

    哈喽.模型落地过程中遇到很多问题,我都要去经历.填坑.人生何处不是坑?? 有坑才有坑! 如果tf可以分批次读入内存数据[比如tfrecords,这个我最不推荐了,麻烦:比如自己写个next,边读边训练 ...

  3. keras数据增广并保存到本地文件夹

    当需要对指定文件夹下的图片进行数据增广时,使用keras的ImageDataGenerator类的flow_from_directory()方法可快速的实现 1.首先实例化ImageDataGener ...

  4. tf torch keras 数据增强 data augmentation

    数据增强 data augmentation 2017年11月14日 22:19:27 阅读数:7964

  5. 基于Pytorch、Keras、Tensorflow的图片数据生成器搭建

    1. 前言 作为一个对三种深度学习框架(Tensorflow,Keras,Pytorch)刚刚完成入门学习的菜鸟,在实战的过程中,遇到了一些菜鸟常见问题,即图片数据加载与预处理.在刚刚接触深度学习的时 ...

  6. 图片基础与tf.keras介绍

    图片基础与tf.keras介绍 1.1 图像基本知识 回忆:之前在特征抽取中如何将文本处理成数值. 思考:如何将图片文件转换成机器学习算法能够处理的数据? 我们经常接触到的图片有两种,一种是黑白图片( ...

  7. 【Keras学习】常见问题与解答

    Keras FAQ:常见问题 如何引用Keras? 如果Keras对你的研究有帮助的话,请在你的文章中引用Keras.这里是一个使用BibTex的例子 @misc{chollet2015keras,a ...

  8. 学习笔记 Keras:常见问题

    目录: 目录: 常见问题 如何引用Keras? 如何使Keras调用GPU? 如何在多张GPU卡上使用Keras? 数据并行 设备并行 "batch", "epoch&q ...

  9. [深度学习] Keras 如何使用fit和fit_generator

    介绍 在本教程中,您将了解Keras .fit和.fit_generator函数的工作原理,包括它们之间的差异.为了帮助您获得实践经验,我已经提供了一个完整的示例,向您展示如何从头开始实现Keras数 ...

  10. 盘一盘 Python 系列 10 - Keras (上)

    本文含 12119 字,64图表截屏 建议阅读 62 分钟 0 引言 本文是 Python 系列的第十三篇,也是深度学习框架的第一篇 - Keras. 深度学习之 Keras 深度学习之 Tensor ...

最新文章

  1. 360董事长周鸿祎发表全员信:疫情当前,要做好长期在家办公的准备
  2. Sping面试题 Top 50
  3. pandas使用dropna函数删除dataframe中所有包含缺失值的数据行(drop rows which contain missing vlaues in dataframe)
  4. 几种常见的JVM调优场景(建议收藏)
  5. [管理心得] 稻盛和夫为日航危机出诊--人情营销的典型
  6. java enum 定义属性_java enum(枚举)使用详解 + 总结
  7. 多重循环控制(难点重点)
  8. 网易严选Java开发三面面经:java读文件内容
  9. 明显调用的表达式前的括号必须具有函数类型_Chisel(二) Scala语法 变量与函数...
  10. 图论 —— 网络流 —— 最小割 —— 平面图与对偶图
  11. 对 5G “迟钝”的苹果,该如何后来居上?| 极客头条
  12. 解决Ubuntu系统找不到进程,但是GPU显存占满问题
  13. win10电脑黑屏只有鼠标箭头_电脑开机就黑屏,只显示鼠标怎么办?别急,简单几步,轻松解决!...
  14. scratch编程——一个列表实现经典扫雷游戏
  15. 在ubuntu中安装DroidCam 让Andorid 安卓手机摄像头成为Linux外部可移动摄像头
  16. 电磁场有限元基本原理(5)
  17. 优质短信api接口具备的特点
  18. 纪念一下获得十大优秀学生
  19. ML - 贷款用户逾期情况分析1 - Baseline
  20. 计算机资源管理器出问题怎么办,电脑资源管理器运行异常导致任务栏出现问题...

热门文章

  1. leader选举的源码分析-FastLeaderElection.starter
  2. @EnableAutoConfiguration注解的实现原理
  3. jwt:token的解析
  4. Spring Cloud依赖
  5. 【报错笔记】程序报错:Cause: java.sql.SQLException: Invalid value for getInt() - ‘4ab72edc-c02f-423f-ae9e-18c30
  6. ERROR: Could not read unit serial number!
  7. 探析“Java序列化”之serialVersionUID
  8. 《构建之法》阅读第四章、第十七章收获
  9. 人工智能化发展已经到了哪一步?
  10. 细数非对称加密与对称加密的区别