tf.keras.utils.image_dataset_directory()预处理数据,进行模型训练以石头、剪刀、布(rock-scissors-paper)手势数据为例

1 语法介绍:

tf.keras.utils.image_dataset_from_directory()

从目录中读取数据并进行预处理

tf.keras.utils.image_dataset_from_directory(
    directory, #数据存放目录
    labels='inferred', #标签由目录结构推断
    label_mode='int', #标签编码方式:int、categorical、binary;分别为标签编码为整数、类别向量、二分类编码为0或1
    class_names=None, #用于labels='inferred'时,类名的显式列表(必须匹配子目录的名称)。用于控制类的顺序(否则使用字母数字顺序)。
    color_mode='rgb', #“grayscale”、“rgb,默认值:“rgb”,将图像转为 1、3、4通道
    batch_size=32, #一次处理图像的数量
    image_size=(256, 256), #指定读取图像后,调整图像大小
    shuffle=True, #是否打乱原数据的顺序
    seed=None, #随机种子
    validation_split=None, #验证集分割比例
    subset=None, #要返回的数据的子集为training或者validation或者both(训练集和验证集组成的元组)
    interpolation='bilinear',#调整图像大小时用的插值方法,默认bilinear,
    follow_links=False, #是否访问符号链接指向的子目录
    crop_to_aspect_ratio=False, #调整图像大小时是否保留纵横比
    **kwargs

tf.data.Dataset.take()

从该数据集中创建最多包含count个元素的数据集。 

tf.data.Dataset.take(

count, #子集最多包含的数量

 name=None, #源数据名称

)

2 tf.keras.utils.image_dataset_from_directory()数据预处理 

import tensorflow as tf
import os
import matplotlib.pyplot as plt

train_dir="E:/machine learning data/rps_data/rps_train/" #训练集
test_dir="E:/machine learning data/rps_data/rps_test/"

train_data=tf.keras.utils.image_dataset_from_directory(
    train_dir,
    labels='inferred',
    label_mode='int',#标签编码
    validation_split=0.2,#验证集比例为20%
    subset='training',#处理后得到的数据为训练集
    seed=123,
    #class_names=
    shuffle=True,
    color_mode='rgb',
    batch_size=32,
    image_size=(64,64)
)
validation_data=tf.keras.utils.image_dataset_from_directory(
    train_dir,
    labels='inferred',
    label_mode='int',#标签编码
    validation_split=0.2,
    subset='validation',#处理后得到的数据为验证集
    seed=123,
    #class_names=
    shuffle=True,
    color_mode='rgb',
    batch_size=32,
    image_size=(64,64)
)

test_data=tf.keras.utils.image_dataset_from_directory(
    test_dir,
    labels='inferred',#自己推断标签,根据目录结构
    label_mode='int',
    shuffle=True,
    color_mode='rgb',
    batch_size=32,
    image_size=(64,64)
)

 结果:

 3 tf.data.Dataset.take()显示训练数据前几张图像

#查看训练集的前9张图片
class_names=train_data.class_names
print(class_names)

plt.figure(figsize=(10,10))
for image,label in train_data.take(1): #BatchDataset类型数据返回最多一个批次为包含图像数组和标签的元组,图像数组shape=(32,64,64,3),标签(32,1)
    #print(image,label)
    for i in range(9):
        ax=plt.subplot(3,3,i+1)
        plt.imshow(image[i].numpy().astype("uint8"))#转换为numpy形式的数组
        plt.axis('off')
        plt.title(class_names[label[i]])

结果:

4 模型构建和训练

#构建模型
model=tf.keras.Sequential([
    tf.keras.layers.Rescaling(1/255),
    tf.keras.layers.Conv2D(64,(3,3),padding='same',activation='relu',input_shape=(64,64,3)),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(128,(3,3),padding='same',activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128,activation='relu'),
    tf.keras.layers.Dense(64,activation='relu'),
    tf.keras.layers.Dense(3,activation='softmax')
])
model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
              metrics=['acc'])
model.build(input_shape=(2016,64,64,3))
model.summary()

#模型开始训练
import datetime
start_time=datetime.datetime.now()
epochs=10
history=model.fit(train_data,validation_data=validation_data,epochs=epochs,verbose=1)
#模型结束训练
end_time=datetime.datetime.now()
cost_time=end_time-start_time
print('模型训练时长:',cost_time)

 5 查看训练精度和损失以及验证集精度和损失

#查看精度和损失
acc=history.history['acc']
val_acc=history.history['val_acc']
loss=history.history['loss']
val_loss=history.history['val_loss']
x=range(len(acc))

fig,ax=plt.subplots(1,2,figsize=(12,5))
ax1=ax[0]
ax2=ax[1]

ax1.plot(x,acc,'b',label='acc')
ax1.plot(x,val_acc,'r',label='val_acc')
ax1.set_xlabel('epoch')
ax1.set_ylabel('acc/val_acc')
ax1.set_title('acc and val_acc')
ax1.legend()

ax2.plot(x,loss,'r',label='loss')
ax2.plot(x,val_loss,'y',linestyle='--',label='val_loss')
ax2.set_xlabel('loss')
ax2.set_ylabel('val_loss')
ax2.set_title('loss and val_loss')
ax2.legend()
plt.show()

结果:

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: tf.keras.utils.image_dataset_from_directory是一个函数,用于从目录中读取图像数据集并返回一个tf.data.Dataset对象。它可以自动将图像数据集划分为训练集和验证集,并对图像进行预处理数据增强。此函数是TensorFlow Keras API的一部分,用于构建深度学习模型。 ### 回答2: tf.keras.utils.image_dataset_from_directory是一个用于从文件夹中加载图像数据集的实用函数。该函数以指定的文件夹路径作为输入,自动将文件夹中的图像按照类别划分,并生成一个tf.data.Dataset对象,用于训练或评估深度学习模型。 该函数的主要参数包括: - directory:指定的文件夹路径,用于加载图像数据集。 - labels:可选参数,指定是否从文件夹的子文件夹中自动提取类别标签。 - label_mode:可选参数,指定类别标签的返回类型。支持"categorical"、"binary"、"sparse"和"int"四种类型。 - batch_size:指定生成的Dataset对象中每个batch的样本数量。 - image_size:可选参数,指定生成的样本的图像大小。 - validation_split:可选参数,指定用于验证集划分的比例。 当调用该函数时,首先会通过遍历指定路径下的所有图片文件,自动提取所有类别的名称。然后,根据提取的类别信息,将文件夹中的图像按照类别划分,并为每个类别生成一个不同的整数标签。最后,将这些划分好的图像数据转换为tf.data.Dataset对象,并将类别标签与样本数据一一对应。 最终生成的Dataset对象中,每个样本都是一个元组,包含图像数据和对应的类别标签。该Dataset对象可以直接用于训练或评估深度学习模型,并且可以通过设置参数来自动进行数据增强、批处理等操作。 使用tf.keras.utils.image_dataset_from_directory函数,可以方便地加载和处理大量的图像数据集,提高模型训练的效率和准确率。 ### 回答3: tf.keras.utils.image_dataset_from_directory是一个用于从文件目录中加载图像数据集的函数。它基于TensorFlowKeras API,并提供了一种方便的方式来准备图像数据进行训练和验证。 该函数能够自动地从文件目录读取图像,并创建一个TensorFlow数据集对象,其中每个图像与其标签关联。使用该函数,可以轻松地从文件夹中加载具有不同类别的图像数据,并自动将其划分为训练集和验证集。可以指定训练集和验证集的比例、图像的大小、批次大小等参数。此外,还可以进行数据预处理操作,如图像放缩、归一化等。 使用该函数的步骤如下: 1. 准备图像数据集:将不同类别的图像按照标签存储在不同的文件夹中。 2. 调用image_dataset_from_directory函数:指定图像文件夹的路径,并设定其他参数如图像大小、批次大小等。 3. 接收返回的数据集对象:该对象包含训练集和验证集。 4. 可以将该数据集对象直接用于模型训练、评估和推理。 该函数的优点是简单易用,能够快速地加载图像数据集,并且能够与tf.data API无缝集成,方便进行数据增强、数据流水线等高级操作。它减少了手动处理图像数据的工作量,使得图像分类、目标检测等任务更加高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冲冲冲@chong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值