tensorflow2数据读取P3: tf.data.Dataset.from_generator通过preprocessing.image.ImageDataGenerator构造Dataset

tf.data.Dataset.from_generator通过preprocessing.image.ImageDataGenerator构造Dataset

虽然自己定义生成器就可以构建dataset,但是用一些已经写好且功能比较完善的库,处理起数据会更方便。比如,处理图片数据,可以使用tf.keras.preprocessing.image.ImageDataGenerator制作生成器,再用tf.data.Dataset构造dataset
ImageDataGenerator有很多写好的方法,例如

import tensorflow as tf
tf.keras.preprocessing.image.ImageDataGenerator(
	rescale = 1./255, # 将8bit的图像归一化到0~1
	rotation_range = 10, # 对图像进行旋转角度在10以内的旋转
)

此外,ImageDataGenerator还有一个功能,就是可以直接从文件夹读取图片,并制作好对应的标签。图片要按照这样的格式存放
tensorflow2数据读取P3: tf.data.Dataset.from_generator通过preprocessing.image.ImageDataGenerator构造Dataset_第1张图片
比如根目录是imgs, 这个目录下放了2个文件夹。cat文件夹中放猫猫的图片,dog文件夹中放狗狗的图片。

img_generator = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale = 1./255, # 将8bit的图像归一化到0~1
    rotation_range = 10, # 对图像进行旋转角度在10以内的旋转
)
imgroot = r'imgs'
ds = tf.data.Dataset.from_generator(
    lambda: img_generator.flow_from_directory(
    imgroot,
    target_size = (2, 2), # 可以将图片都缩放到目标大小
    batch_size = 1, # 设置每次yield数据量
    ),
    output_types = (tf.float32, tf.float32)
)

可以取出一些迭代的结果,看看获取到的数据是什么样子的。这里为了方便截图查看,将target_size设置得很小。

for one_example in ds:
	print(one_example)

在这里插入图片描述
打印其中一个样本,可以看到构建的dataset每次会返回1个包含两元素的元组(tuple)。元组的第一个元素是缩放到target_size且归一化(rescale = 1./255)之后的Tensor类型数据。第二个元素是ImageDataGenerator制作好的标签,这里是one-hot方式表示。我们在imgs图片目录放了cat和dog两个文件夹,ImageDataGenerator制作的标签就包含2个类别,[0,1]和[1,0]。如果想知道它们各自对应的是什么,可以通过调用class_indices属性,获取对应的映射关系。

img_generator.flow_from_directory(
    imgroot,
    target_size = (2, 2), # 可以将图片都缩放到目标大小
    batch_size = 1, # 设置每次yield数据量
    ).class_indices

在这里插入图片描述
ImageDataGenerator还有很多其他可以配置的参数,功能丰富,可以通过help方法或查阅API文档进行了解。
使用的代码https://gitee.com/xxjdxmt/learning/tree/master

你可能感兴趣的:(tensorflow2使用,tensorflow,深度学习,人工智能)