易 AI - 机器学习加载数据集(输入管道 Pipeline)

原文:http://makeoptim.com/deep-learning/yiai-dataset-pipeline

机器学习数据集为大家介绍了什么是数据集,如何收集数据集机器学习计算机视觉基础 为大家介绍了图像在计算机中如何表达操作的;本文将为大家介绍如何在 TensorFlow 中加载数据集

创建项目

https://github.com/CatchZeng/YiAI-examples/releases/download/1.0.0/Glory.of.Kings.zip 下载数据集,将下载的 Glory.of.Kings.zip 解压。创建 load-dataset 项目,并将解压后的数据集拷贝到项目中。

注:代码地址 https://github.com/CatchZeng/YiAI-examples/blob/master/load-dataset/load-dataset.ipynb

加载单张图

from tensorflow.keras.preprocessing import image
import numpy as np

def load_image(img_path, target_size):
    img = image.load_img(img_path, target_size=target_size)
    img_tensor = image.img_to_array(img)
    return img_tensor

image_path = f'./Glory of Kings/train/houyi/houyi1.jpg'
img_width = 224
img_height = 224
target_size = (img_width, img_height)

img_tensor = load_image(image_path, target_size)
print(img_tensor.shape)
(224, 224, 3)

tf.keras.preprocessing.image 模块提供了加载图像图像增强的一些工具,在数据集预处理中经常用到。这里,先使用 load_img 从文件中加载图像为 PIL format。然后,通过 img_to_arrayPIL format 转换为 Numpy array

显示单张图

import matplotlib.pyplot as plt

def show_image(img_tensor):
    print(f'img_tensor:{img_tensor[0][0]}')
    show_tensor = img_tensor/255.
    print(f'show_tensor:{show_tensor[0][0]}')
    plt.imshow(show_tensor)
    plt.axis('off')
    plt.show()

show_image(img_tensor)
img_tensor:[31. 43. 65.]
show_tensor:[0.12156863 0.16862746 0.25490198]

matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。pyplotmatplotlib 的一个模块,它提供了一个类似 MATLAB 的接口。

imshow 方法支持

  • (M,N):具有标量数据的图像。使用归一化和颜色图将这些值映射到颜色。
  • (M,N,3):具有 RGB 值(0-1 浮点0-255 整数)的图像。
  • (M,N,4):具有 RGBA 值(0-1 浮点0-255 整数)的图像,即包括透明度

由于 img_to_array 返回值默认为 float32,所以无法直接使用 imshow 显示。因此,这里直接使用 img_tensor/255. 为图像数据做归一化

加载数据集

import tensorflow as tf

data_dir = f"./Glory of Kings/train"
batch_size = 9
img_height = 224
img_width = 224
validation_split=0.2

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=validation_split,
  subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)

val_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=validation_split,
  subset="validation",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)

class_names = train_ds.class_names
print(class_names)

print(train_ds)
Found 3607 files belonging to 3 classes.
Using 2886 files for training.
Found 3607 files belonging to 3 classes.
Using 721 files for validation.
['houyi', 'kai', 'wangzhaojun']
<BatchDataset shapes: ((None, 224, 224, 3), (None,)), types: (tf.float32, tf.int32)>

tf.keras.preprocessing 提供了 image_dataset_from_directory方法,便于我们从目录中加载数据集。

参数:

  • validation_split:机器学习数据集提过数据集一般分为训练集、验证集、测试集,而训练的时候需要训练集和验证集。validation_split 的意思是将 data_dir 目录的所有图片的百分之多少划分为验证集。这里设置为 0.2 表示,20% 为验证集,80% 为训练集。
  • subset:可取值为 "training" 或者 "validation" 分别表示训练集和验证集。
  • seed:可选随机种子
  • batch_size:批量数据的大小。默认值:32

image_dataset_from_directory 返回值是 tf.data.Dataset,是一个包含图像和标签数据的元组 (images, labels),其 images 的形状为 (batch_size, image_size[0], image_size[1], num_channels)

显示数据集

import matplotlib.pyplot as plt
import math

plt.figure(figsize=(10, 10))
cols = 3
for images, labels in train_ds.take(1):
  rows = math.ceil(len(images)/cols)
  for i in range(len(images)):
    plt.subplot(rows, cols, i + 1)
    show_tensor = images[i].numpy()/255.
    plt.imshow(show_tensor)
    plt.title(class_names[labels[i]])
    plt.axis("off")

tf.data.Dataset 提供了 take 方法来按 batch_size 分批取数据。这里的 count 设置为 1 表示取 1 次批量(batch_size)大小的数据,batch_size9 所以,取出了 9 张图片。

plt.subplot 的作用是把一个绘图区域(可以理解成画布)分成多个小区域,用来绘制多个子图。

数据输入管道

AUTOTUNE = tf.data.AUTOTUNE

train_ds_count = len(np.concatenate([i for x, i in train_ds], axis=0))
print(train_ds_count)

train_ds = train_ds.cache().shuffle(train_ds_count).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

cache

cache 的作用是缓存数据集中的元素。第一次迭代(iterated)数据集时,其元素将缓存在指定的文件或内存中,随后的迭代将使用缓存的数据,加快训练速度。

shuffle

shuffle(buffer_size) 的作用是随机洗牌数据集元素,防止数据过拟合

首先,Dataset 会取所有数据的前 buffer_size 数据项,填充 buffer,如下图

然后,从 buffer 中随机选择一条数据输出,比如这里随机选中了 item 7,那么 bufferitem 7 对应的位置就空出来了。

然后在从 Buffer 中随机选择下一条数据输出。

注:这里的数据项 item,并不只是单单一条真实数据,如果有 batch size,则一条数据项 item 包含了 batch size 条真实数据。

这里,大家可以想象,如果 batch size1,那么就 相当于是顺序输出,这就让 shuffle 毫无意义;如果 batch size训练集的大小,那么就可以将数据较好地随机化;当然,大家可以根据自己的数据集情况做调整。

prefetch

prefetch 作用是从数据集中预提取元素,加快训练速度。

小结

本文通过王者荣耀案例的数据集,为大家讲解了如何处理数据集,这不但可以帮助大家看懂王者荣耀案例代码,也有助于大家将前面将的内容串联起来,文中提到的方法在往后的学习和实践中也是非常常用的,需要好好掌握。下一篇开始,笔者将带大家进入期待已久的模型部分的讲解。

参考链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容