赞
踩
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 | 分类名称 | None | labels=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,False | 无 | True表示随机打乱数据,False表示按照字母数字顺序排序 |
seed | 随机种子 | 随便int整型 | 无 | 像验证码一样,随便设置一个数,遇到相同随机种子的随机数相等(不随机了) |
validation_split | 验证集切片 | 0-1的数 | 无 | 验证集切片,数值是0-1之间,表示将数据几等分,如validation_split=0.2,表示20%的数据作为验证集 |
subset | 切片的哪个集 | training或validation | validation_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参数影响
label_mode | images格式 |
---|---|
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也会产生此影响 |
label_mode | labels格式 |
---|---|
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来展示:
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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。