当前位置:   article > 正文

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

tensorflow.keras.preprocessing.image

函数原型

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,
):
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

参数解释

参数名称解释输入参数条件意义
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 #获取数据集中包含的类别
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
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))>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

分析***

返回值为 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的需要加入这行代码才能将图像显示出来
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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层
])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

文章参考

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/865668
推荐阅读
相关标签
  

闽ICP备14008679号