使用tensorflow读取自己的图片集,对keras.preprocessing.image_dataset_from_directory函数的理解

文章介绍了TensorFlow的image_dataset_from_directory函数,用于从文件夹结构创建图像数据集。该函数包括参数解释,如directory、label_mode、batch_size等,并提供了如何根据数据集划分训练集和验证集的示例。文章还讨论了返回值的格式以及在模型训练中的应用,包括图片展示、神经网络构建和模型训练过程。
摘要由CSDN通过智能技术生成

函数原型

def image_dataset_from_directory(
    directory,  #数据的文件地址
    labels="inferred",  
    label_mode="int",
    class_names=None,
    color_mode="rgb", #图像通道   ********* 参数(grayscale,rgb,rgba)分别代表1,3,4
    batch_size=32, #数据每个批次的大小
    image_size=(256, 256), #图像的像素大小,默认256*256
    shuffle=True, #默认打乱数据 ******** 参数(True,Flase)
    seed=None, #默认种子随机获取 *********** 参数(像验证码一样,随机几个int类型数据,如:1234)
    validation_split=None, #验证集切片,数值是0-1之间,表示将数据几等分 ********参数(如:0.2)
    subset=None, #配合 validation_split使用,分片后区分训练集和测试集************参数(training或validation)
    interpolation="bilinear",
    follow_links=False,
    crop_to_aspect_ratio=False,
):

参数解释

参数名称解释输入参数条件意义
directory数据地址path需要包含子目录,每个目录包含一个类的图像。否则,将忽略目录结构。
labels标签inferred None结果:(1)ingerred:根据目录结构生成标签 (2)None:无标签
labels_mode标签形式int; categorical; binary; None(1)int:标签被编码为整数0,1,2,3,4,应该使用损失函数sparse_categorical_crossentropy loss;(2)categorical:标签将被编码为分类向量使用的损失函数应为:categorical_crossentropy loss;(3)binary:标签0或1;(4)None:不标签
class_names分类名称Nonelabels=inferred可以通过函数调用获取参数;如:class_names = train.class_names 结果为 [‘cloudy’, ‘rain’, ‘shine’, ‘sunrise’]
color_mode颜色形式grayscale; rgb; rgba(1)grayscale是灰度图,图像为1通道;(2)rgb是彩色图像,图像是3通道;(3)rgba是4通道
batch_size数据批次大小int数字默认大小32,表示每个批次有32组数据,可以通过 (总的照片数) /(batch_size) 得到数据集的批次数量即batch数量
image_size图像像素大小(int,int)设置图像的像素大小
shuffle打乱数据True,FalseTrue表示随机打乱数据,False表示按照字母数字顺序排序
seed随机种子随便int整型像验证码一样,随便设置一个数,遇到相同随机种子的随机数相等(不随机了)
validation_split验证集切片0-1的数验证集切片,数值是0-1之间,表示将数据几等分,如validation_split=0.2,表示20%的数据作为验证集
subset切片的哪个集training或validationvalidation_split设置后如果subset=training则表示这部分为训练集。相反subset=validation表示这部分为验证集
interpolation字符串插值默认为“bilinear”。支持’ bilinear ', ’ nearest ', ’ bicbic ', ’ area ', ’ lanczos3 ', ’ lanczos5 ', ’ gaussian ', ’ mitchellcubic '。
follow_links访问符号链接子目录False/True是否访问符号链接指向的子目录

返回值

返回一个tf.data.Dataset对象,也即一个数据集。数据集主要看(x,y,道集)(x=images,y=labels,道集=color_mode)
数据集格式:受label_mode参数影响

images格式

label_modeimages格式
int; binary; categorial(1)结果是元组格式:(images,labels) ; (2)其中,images图像的格式为TensorSpec(shape=(batch_size,widch,height,num_channels),dtype=tf.float32);
None只要,images图像的格式为TensorSpec(shape=(batch_size,widch,height,num_channels),dtype=tf.float32);
差别:因为None表示无标签,所以只有images格式,其中labels=None也会产生此影响

labels格式

label_modelabels格式
int(batch_size,),dtype = tf.int32 (0,1,2等int数值)
binary(batch_size,1),dtype = tf.float32 (0或1)
categorial(batch_size,num_classes),dtype=tf.float32 (one-hot编码)

举例

例子:以天气识别数据集为例,数据集一共1125张图,分为cloudy、rain、shine、sunrise四类。

'''所有默认参数可以不写'''’
train = keras.preprocessing.image_dataset_from_directory(
    directory = data_dir, #文件路径
#   labels = “inferred”#默认
#   label_mode = "int" #默认
#   color_mode="rgb" #默认
#   class_name = None #默认
#   batch_size=32,#默认
    image_size=(180,180), #调整读取数据的大小
	shuffle=True, #打乱数据
    seed = 123,#设置种子保证重复性
    validation_split=0.2, #验证集切片1125*0.2=225
    subset='training', #切片后的部分为训练集
#   interpolation="bilinear",#默认
#   follow_links=False,#默认
)
val = keras.preprocessing.image_dataset_from_directory(
    directory = data_dir, #文件路径
#   labels = “inferred”#默认
#   label_mode = "int" #默认
#   color_mode="rgb" #默认
#   class_name = None #默认
#   batch_size=32,#默认
    image_size=(180,180), #调整读取数据的大小
	shuffle=True, #打乱数据
    seed = 123,#设置种子保证重复性
    validation_split=0.2, #验证集切片1125*0.2=225
    subset='validation', #切片后的部分为测试集
#   interpolation="bilinear",#默认
#   follow_links=False,#默认
)
class_names = train.class_names #获取数据集中包含的类别
Found 1125 files belonging to 4 classes.
Using 900 files for training
Using 225 files for validation.

print(train) #打印train
<_BatchDataset element_spec=(TensorSpec(shape=(None, 128, 128, 3), dtype=tf.float32, name=None), 
TensorSpec(shape=(None,), dtype=tf.int32, name=None))>

print(train.take(1)) #打印第1组
<_TakeDataset element_spec=(TensorSpec(shape=(None, 128, 128, 3), dtype=tf.float32, name=None),
 TensorSpec(shape=(None,), dtype=tf.int32, name=None))>

分析***

返回值为 Dataset数据集:

1.batch_size = 32 则 训练集:分为了 900/32 = 28组;测试集:分为了225/32 = 7.03 = 8组
2.images格式 label_mode = ‘int’ 则返回结果为(images,labels),形状为:
<_BatchDataset element_spec=(TensorSpec(shape=(None, 128, 128, 3), dtype=tf.float32, name=None), TensorSpec(shape=(None,), dtype=tf.int32, name=None))>
3.labels格式 label_mode = ‘int’ 则返回结果为 (batch_size,),dtype = tf.int32
总结
train训练集:有28组batch,每个batch形状为(images,labels),images包含32张(180,180,3)的图片,则images形状为(32,180,180,3)。labels包含32个代表不同类别的标签,则labels形状为(32,)。因为标签形式labels_mode=‘int’,表示32个标签有(0,1,2,3)四种数字组成如:
tf.Tensor([1 1 1 0 2 1 1 0 0 3 3 1 0 2 0 2 0 2 0 3 0 3 0 1 1 0 2 0 0 0 0 3], shape=(32,), dtype=int32)

validation测试集:只有batch数量不同,其他都一样

使用(在不同阶段的使用)

1.图片展示,使用plt来展示:

  • 需要使用take(i)选择第i个batch
  • 表现图片有所不同:plt.imshow(images[i].numpy().astype(“uint8”), cmap=plt.cm.binary)
plt.figure(figsize=(20, 5))  
for images,labels in train.take(1):#从第1个batch中
    for i in range(20): #选择20张图片和标签
     # 将整个画布分成2行10列,绘制第i+1个子图。
       plt.subplot(2, 10, i+1)
       plt.imshow(images[i].numpy().astype("uint8"), cmap=plt.cm.binary)#将图片表示出来
       plt.title(class_names[labels[i]])#表示对应标签
       plt.axis('off')
plt.show()  #使用pycharm的需要加入这行代码才能将图像显示出来

2.搭建神经网络

#归一处理第一层
 model = Sequential([
    tf.keras.layers.experimental.preprocessing.Rescaling(1./255,input_shape=(180,180,3)),  #图片预处理将像素值转化到0-1之间
    Conv2D(filters=32,kernel_size=3,activation='relu',input_shape=(180,180,3)),
    MaxPool2D((2,2)),
    Conv2D(filters=64,kernel_size=3,activation='relu'),
    MaxPool2D((2,2)),
    Flatten(),
    Dense(64,activation='relu'),
    Dense(len(class_names))  #因为不是热编码了 去除softmax层
])

3.模型训练
格式为Dataset可以直接输入,fit函数中有写x=train,y会从x中获取)

history = model.fit(train,#这里不同于以往
                    epochs=20,
                    verbose=1,
					validation_data = val,#这里不同于以往
                    )

evaluate = model.evaluate(val)
print(evaluate)

文章参考

官网地址介绍
中文翻译介绍

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值