背景知识
在 深度学习中, 数据的预处理占据了我们在训练过程中的一大部分,如何利用不同的库加载我们的数据显得尤为重要。因此本次blog将结合tensorflow2.0中数据加载部分官方文档讲述如何加载我们自己标注的数据和标签。
测试环境
- 操作系统:Windows10
- 深度学习框架:Tensorflow==2.0 or plus
- IDE: Pycharm
自定义数据格式介绍
在 深度学习中, 对于模型的搭建固然重要,但是在数据的预处理部分也占据了训练过程中的很大一部分时间,如何利用不同的库加载我们的数据显得尤为重要。由于本人感兴趣的是图像这一块的领域,因此数据将以图像分类为例,进行演示和说明。
数据下载的链接为 演示数据下载
简单看一下数据的存储的方式,数据存储的方式的目录结构为:
可以看到每张图片的父节点目录就是他们分类的结果,而每个文件夹里面的内容就是分类的图片。在我们准备好数据之后就可以开始我们的数据加载部分的操作了。
自定义数据加载
在tensorflow==2.0中需要使用到的数据加载函数有:
# 数据记载模块,主要功能是使用迭代器动态获取对应切片
ds = tf.data.Dataset.from_tensor_slices()
# 利用ds输出的套一层function函数,就是一个映射(这点和pytorch中的transform很类似)
ds = ds.map(function)
# 从函数名就可以看出这个函数的作用是,在缓冲区大小为buffer_size的地方,先打乱整个数据,并填满(需等待一点点时间),并由repeat进行重新启动
obj = tf.data.experimental.shuffle_and_repeat(buffer_size = buffer_size)
# 设置BATCH_SIZE,对象固有属性
ds = ds.batch(BATCH_SIZE)
# 从缓存中取得数据,对象固有属性
ds = ds.prefetch(buffer_size=AUTOTUNE)
有了上面的函数介绍,现在开始操作步骤:
- 得到图像的路径和标签,作为函数
ds= tf.data.Dataset.from_tensor_slices
的参数 - 利用
ds.map
加入图片的读取,预处理(归一化,resize等)操作 - 打乱得到的数据并设置
batch_size
- 获取数据
预设值参数
import tensorflow as tf
AUTOTUNE = tf.data.experimental.AUTOTUNE
图像的路径和标签,获取对象 ds
# data_root 这里是你下载图片保存的地址,我这里data_root = "C:\\Users\wu\\.keras\\datasets\\flower_photos"pathlib生成一个路径对象
import pathlib
data_root = pathlib.Path(data_root)
# 获取所有图片的路径的对象
all_image_paths = list(data_root.glob("*/*"))
# 获取所有图片的路径的字符串
all_image_paths = [str(path) for path in all_image_paths]
# 打乱所有路径
import random
random.shuffle(all_image_paths)
# 图片数量
image_count = len(all_image_paths)
# 图像名称
label_names = sorted(item.name for item in data_root.glob("*/") if item.is_dir())
# 为图像名称设置映射,映射结果为整数
label_to_index = dict((name, index) for index, name in enumerate(label_names))
# 获取所有图像所对应的标签
all_image_labels = [label_to_index[pathlib.Path(path).parent.name] for path in all_image_paths]
# 获取对象ds
ds = tf.data.Dataset.from_tensor_slices((all_image_paths,all_image_labels))
图片的读取,预处理
# 预处理图片
def preprocess_image(image):
image = tf.image.decode_jpeg(image,channels=3)
image = tf.image.resize(image,[192,192])
image /=255.0
return image
# 读取图片+预处理
def load_and_preprocess_image(path):
image = tf.io.read_file(path)
return preprocess_image(image)
# 读取图片+预处理+获取图片对应的标签
def load_and_preprocess_from_path_label(path,label):
return load_and_preprocess_image(path),label
# 将图片的预处理部分附在切片的对象上
image_label_ds = ds.map(load_and_preprocess_from_path_label)
打乱得到的数据并设置batch_size
ds = image_label_ds.apply(tf.data.experimental.shuffle_and_repeat(buffer_size=image_count))
ds = ds.batch(Batch_Size)
ds = ds.prefetch(buffer_size=AUTOTUNE)
获取数据
def change_range(image,label):
return 2*image-1,label
keras_ds = ds.map(change_range)
image_batch,label_batch = next(iter(keras_ds))
至此,图片数据的读取和输入到神经网络的输入即可。