tensorflow中生成图片数据集可以使用这个类,根据图片所在文件夹划分训练集和验证集:tf.keras.preprocessing.image_dataset_from_directory

从图片文件中生成一个tf.data.Dataset的类:自动划分训练集和验证集。

源码:tensorflow2.11版本:

def image_dataset_from_directory(
    directory,
    labels="inferred",
    label_mode="int",
    class_names=None,
    color_mode="rgb",
    batch_size=32,
    image_size=(256, 256),
    shuffle=True,
    seed=None,
    validation_split=None,
    subset=None,
    interpolation="bilinear",
    follow_links=False,
    crop_to_aspect_ratio=False,
    **kwargs,
):

参数:

  1. directory: 数据所在目录。如果标签是“inferred”(默认),则它应该包含子目录,每个目录包含一个类的图像。否则,将忽略目录结构。 
  2. labels: “inferred”(标签从目录结构生成),或者是整数标签的列表/元组,其大小与目录中找到的图像文件的数量相同。标签应根据图像文件路径的字母顺序排序(通过Python中的os.walk(directory)获得)。
  3. label_mode:
  •  'int':表示标签被编码成整数(例如:sparse_categorical_crossentropy loss),y_true被编码成一个整数值。
  • ‘categorical’指标签被编码为分类向量(例如:categorical_crossentropy loss),y_true是一个多分类的结果。
  • ‘binary’意味着标签(只能有2个)被编码为值为0或1的float32标量(例如:binary_crossentropy)。
  • None(无标签)
  1. class_names: 仅当“labels”为“inferred”时有效。这是类名称的明确列表(必须与子目录的名称匹配)。用于控制类的顺序(否则使用字母数字顺序)。
  2. color_mode: "grayscale"、"rgb"、"rgba"之一。默认值:"rgb"。图像将被转换为1、3或者4通道。
  3. batch_size: 数据批次的大小。默认值:32
  4. image_size: 从磁盘读取数据后将其重新调整大小。默认:(256,256)。由于管道处理的图像批次必须具有相同的大小,因此该参数必须提供。
  5. shuffle: 是否打乱数据。默认值:True。如果设置为False,则按字母数字顺序对数据进行排序。
  6. seed: 用于shuffle和转换的可选随机种子。
  7. validation_split: 0和1之间的可选浮点数,可保留一部分数据用于验证。
  8. subset: "training"或"validation"之一。仅在设置validation_split时使用。
  9. interpolation: 字符串,当调整图像大小时使用的插值方法。默认为:bilinear。支持bilinearnearestbicubicarealanczos3lanczos5gaussianmitchellcubic.。
  10. follow_links: 是否访问符号链接指向的子目录。默认:False。

生成器的Return返回值:

一个tf.data.Dataset对象。

  1. 如果label_mode为None,它将生成float32张量,其shape(batch_size, image_size[0], image_size(1), num_channels),并对图像进行编码(有关num_channels的规则,参见下文)。
  2. 否则,将生成一个元组(images, labels),其中图像的shape(batch_size, image_size[0], image_size(1), num_channels),并且labels遵循下面描述的格式。

关于labels格式规则:

  1. 如果label_mode 是 int, labels是形状为(batch_size, )int32张量
  2. 如果label_mode 是 binarylabels是形状为(batch_size, 1)的1和0的float32张量。
  3. 如果label_mode 是 categoriallabels是形状为(batch_size, num_classes)float32张量,表示类索引的one-hot编码。(多分类)

自定义图片数据集生成器:

原始数据集图片文件夹的结构:data文件夹中有多少个子文件夹,就表明有多少个类。

文件命名建议使用英文。

 

def data_generate(data_dir,batch_size,img_height,img_width):

    train_dataset=tf.keras.preprocessing.image_dataset_from_directory(
        data_dir,
        label_mode='categorical',#生成多分类;标签被编码成分类向量; binary ;
        validation_split=0.2,
        batch_size=batch_size,
        shuffle=True,
        seed=120,
        subset='training',
        image_size=(img_height,img_width),
        # color_mode='rgb' #默认图片的是rgb
    )

    val_dataset=tf.keras.preprocessing.image_dataset_from_directory(
        data_dir,
        label_mode='categorical',
        validation_split=0.2,
        batch_size=batch_size,
        seed=120,
        shuffle=True,
        subset='validation',
        image_size=(img_height,img_width)
    )
    class_names=train_dataset.class_names #对应数据集的labels 值

    return train_dataset,val_dataset,class_names

调用时:只传入最外层的文件夹:data即可

 #生成数据集:
    train_dataset,val_dataset,class_names=data_generate('../data',10,224,224)

生成train_dataset是一个元组:(images,labels):

labels:

​
['lavender', 'peach_blossom', 'roses', 'sunflowers', 'tulip']

​

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
感谢您的提问。使用 tf.keras.preprocessing.image_dataset_from_directory() 函数生成训练集验证集和测试集的过程如下: 1. 准备数据集,要求数据集按照别分好文件夹,每个子文件夹应存放该别的图像数据。 2. 导入 tensorflow 和其他必要的库。 3. 使用 tf.keras.preprocessing.image_dataset_from_directory() 函数加载数据集,并按比例划分训练集验证集和测试集。 4. 对图像数据进行预处理,包括数据增强、标准化等操作。 5. 创建模型,并将训练集用于训练模型。 6. 使用验证集调整模型参数和模型架构,并根据测试集评估模型性能。 下面是使用 tf.keras.preprocessing.image_dataset_from_directory() 函数生成训练集验证集和测试集的示例代码: ``` import tensorflow as tf import pathlib # 加载数据集 data_dir = pathlib.Path("path/to/dataset") train_ds = tf.keras.preprocessing.image_dataset_from_directory( data_dir, validation_split=0.2, subset="training", seed=123, image_size=(img_height, img_width), batch_size=batch_size) val_ds = tf.keras.preprocessing.image_dataset_from_directory( data_dir, validation_split=0.2, subset="validation", seed=123, image_size=(img_height, img_width), batch_size=batch_size) # 数据预处理 data_augmentation = tf.keras.Sequential( [ tf.keras.layers.experimental.preprocessing.RandomFlip("horizontal"), tf.keras.layers.experimental.preprocessing.RandomRotation(0.1), tf.keras.layers.experimental.preprocessing.RandomZoom(0.1), ] ) normalization_layer = tf.keras.layers.experimental.preprocessing.Rescaling(1./255) # 构建模型 model = tf.keras.Sequential([ data_augmentation, normalization_layer, tf.keras.layers.Conv2D(32, 3, activation='relu'), tf.keras.layers.MaxPooling2D(), tf.keras.layers.Conv2D(64, 3, activation='relu'), tf.keras.layers.MaxPooling2D(), tf.keras.layers.Conv2D(128, 3, activation='relu'), tf.keras.layers.MaxPooling2D(), tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(num_classes) ]) # 训练模型 model.compile(optimizer='adam', loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) model.fit( train_ds, validation_data=val_ds, epochs=epochs ) # 模型评估 test_ds = tf.keras.preprocessing.image_dataset_from_directory( data_dir, image_size=(img_height, img_width), batch_size=batch_size) model.evaluate(test_ds) ``` 其,data_dir 表示数据集所在目录,img_height 和 img_width 分别表示图像高度和宽度,batch_size 表示 batch 的大小,epochs 表示训练轮数,num_classes 表示分数。训练集验证集划分比例由 validation_split 参数控制。data_augmentation、normalization_layer 分别表示数据增强和标准化的操作,model 表示构建的模型,model.compile() 函数指定了优化器、损失函数和评估指标,model.fit() 函数用于训练模型,model.evaluate() 函数用于评估模型性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值