目录
1、基本步骤
(1) 检查和熟悉数据
(2) 构建输入管道
(3) 构建模型
(4) 训练模型
(5) 测试模型
(6) 改进模型并重复此过程
2.数据下载
2.1 环境
需要使用到的库如下:
import matplotlib.pyplot as plt
import numpy as np
import os
import PIL
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
2.2 数据说明
下载flowers样本数据,该样本数据包含以下类别数据:
flower_photo/
daisy/菊花/
dandelion/蒲公英/
roses/玫瑰/
sunflowers/向日葵/
tulips/郁金香/
数据下载源代码如下:
import pathlib
dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
data_dir = pathlib.Path(data_dir)
以上这段代码中函数的完整参数如下:
参考原文:https://blog.youkuaiyun.com/qq_39507748/article/details/104997553
tf.keras.utils.get_file(
fname, origin, untar=False, md5_hash=None,
file_hash=None,cache_subdir='datasets',
hash_algorithm='auto', extract=False,
archive_format='auto', cache_dir=None
)
参数说明--
fname:文件名,如果指定了绝对路径"/path/to/file.txt",则文件将会保存到该位置
origin:文件的URL
untar:boolean,文件是否需要解压缩
md5_hash:MD5哈希值,用于数据校验,支持sha256和md5哈希
cache_subdir:用于缓存数据的文件夹,若指定绝对路径"/path/to/folder"则将存放在该路径下
hash_algorithm:选择文件校验的哈希算法,可选项有'md5', 'sha256', 和'auto'.
默认'auto'自动检测使用的哈希算法
extract:若为True则试图提取文件,例如tar或zip
archive_format:试图提取的文件格式,可选为'auto', 'tar', 'zip',
和None. 'tar' 包括tar, tar.gz, tar.bz文件. 默认'auto'是['tar', 'zip']. None或空列表将返回没有匹配
cache_dir:文件缓存后的地址,若为None,则默认存放在根目录的.keras文件夹中
运行结果如下:

pathlib.Path(data_dir)函数路径转换说明:
import pathlib
dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
print(data_dir)
print(type(data_dir))
data_dir = pathlib.Path(data_dir)
print(data_dir)
print(type(data_dir))
C:\Users\Administrator\.keras\datasets\flower_photos
<class 'str'>
C:\Users\Administrator\.keras\datasets\flower_photos
<class 'pathlib.WindowsPath'>
我们在路径下查看该数据:数据已经被解压出来。


daisy/菊花/ 数量:633
dandelion/蒲公英/ 数量:898
roses/玫瑰/ 数量:641
sunflowers/向日葵/ 数量:699
tulips/郁金香/ 数量:799
共计:3670
LICENSE.txt 中包含了图片作者和网址信息:

打开一些数据查看图片的大小,发现图片的像素大小,形状都不一样。部分图片如下:

2.3 数据查看代码
源代码:str类型的data_dir没有glob函数,因此上文中转化为“pathlib.WindowsPath”类型
image_count = len(list(data_dir.glob('*/*.jpg')))
print(image_count)
roses = list(data_dir.glob('roses/*'))
img0=PIL.Image.open(str(roses[0]))
plt.imshow(img0)
plt.show()

3.创建数据集
从上文中我们知道,以上图片数据集的大小尺寸都不一样,因此,我们需要创建一组具有相同大小尺寸的数据集,即将以上所有图片转化为像素大小相同的图片数据集。
3.1 数据集创建函数
使用的函数:
tf.keras.preprocessing.image_dataset_from_directory()
函数详解:完整参数
tf.keras.preprocessing.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,
)
参数说明:
- directory: 数据所在目录。如果标签是“inferred”(默认),则它应该包含子目录,每个目录包含一个类的图像。否则,将忽略目录结构。
- labels: “inferred”(标签从目录结构生成),或者是整数标签的列表/元组,其大小与目录中找到的图像文件的数量相同。标签应根据图像文件路径的字母顺序排序(通过Python中的os.walk(directory)获得)。
- label_mode: 'int':表示标签被编码成整数(例如:
sparse_categorical_crossentropyloss)。‘categorical’指标签被编码为分类向量(例如:categorical_crossentropyloss)。‘binary’意味着标签(只能有2个)被编码为值为0或1的float32标量(例如:binary_crossentropy)。None(无标签)。 - class_names: 仅当“labels”为“inferred”时有效。这是类名称的明确列表(必须与子目录的名称匹配)。用于控制类的顺序(否则使用字母数字顺序)。
- color_mode: "grayscale"、"rgb"、"rgba"之一。默认值:"rgb"。图像将被转换为1、3或者4通道。
- batch_size: 数据批次的大小。默认值:32
- image_size: 从磁盘读取数据后将其重新调整大小。默认:(256,256)。由于管道处理的图像批次必须具有相同的大小,因此该参数必须提供。
- shuffle: 是否打乱数据。默认值:True。如果设置为False,则按字母数字顺序对数据进行排序。
- seed: 用于shuffle和转换的可选随机种子。
- validation_split: 0和1之间的可选浮点数,可保留一部分数据用于验证。
- subset: "training"或"validation"之一。仅在设置validation_split时使用。
- interpolation: 字符串,当调整图像大小时使用的插值方法。默认为:
bilinear。支持bilinear,nearest,bicubic,area,lanczos3,lanczos5,gaussian,mitchellcubic.。 - follow_links: 是否访问符号链接指向的子目录。默认:False。
Returns
一个tf.data.Dataset对象。
- 如果label_mode为None,它将生成float32张量,其shape为(batch_size, image_size[0], image_size(1), num_channels),并对图像进行编码(有关num_channels的规则,参见下文)。
- 否则,将生成一个元组(images, labels),其中图像的shape为(batch_size, image_size[0], image_size(1), num_channels),并且labels遵循下面描述的格式。
关于labels格式规则:
- 如果label_mode 是 int, labels是形状为(b
277



被折叠的 条评论
为什么被折叠?



