前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【TensorFlow2.0】数据读取与使用方式

【TensorFlow2.0】数据读取与使用方式

作者头像
用户1508658
发布于 2019-07-28 01:49:14
发布于 2019-07-28 01:49:14
4.6K1
举报
文章被收录于专栏:有三AI有三AI

大家好,这是专栏《TensorFlow2.0》的第三篇文章,讲述如何使用TensorFlow2.0读取和使用自己的数据集。

如果您正在学习计算机视觉,无论你通过书籍还是视频学习,大部分的教程讲解的都是MNIST等已经为用户打包封装好的数据集,用户只需要load_data即可实现数据导入。但是在我们平时使用时,无论您是做分类还是检测或者分割任务,我们不可能每次都能找到打包好的数据集使用,大多数时候我们使用的都是自己的数据集,也就是我们需要从本地读取文件。因此我们是很有必要学会数据预处理这个本领的。本篇文章,我们就聊聊如何使用TensorFlow2.0对自己的数据集进行处理。

作者&编辑 | 汤兴旺

在TensorFlow2.0中,对数据处理的方法有很多种,下面我主要介绍两种我自认为最好用的数据预处理的方法。

1 使用Keras API对数据进行预处理

1.1 数据集

本文用到的数据集是表情分类数据集,数据集有1000张图片,包括500张微笑图片,500张非微笑图片。图片预览如下:

微笑图片:

非微笑图片:

数据集结构组织如下:

其中800张图片用来训练,200张用来测试,每个类别的样本也是相同的。

1.2 数据预处理

我们知道,在将数据输入神经网络之前,需要将数据格式化为经过预处理的浮点数张量。现在我们看看数据预处理的步骤,如下图:

这个步骤虽然看起来比较复杂,但在TensorFlow2.0的高级API Keras中有个比较好用的图像处理的类ImageDataGenerator,它可以将本地图像文件自动转换为处理好的张量。

接下来我们通过代码来解释如何利用Keras来对数据预处理,完整代码如下:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_data_dir = r"D://Learning//tensorflow_2.0//smile//data//train" val_data_dir = r"D://Learning//tensorflow_2.0//smile//data//val"

img_width,img_height = 48,48 batch_size = 16

train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, horizontal_flip=True) val_datagen = ImageDataGenerator(rescale=1. / 255) train_generator = train_datagen.flow_from_directory( train_data_dir, target_size=(img_width, img_height), batch_size=batch_size) val_generator = val_datagen.flow_from_directory( val_data_dir, target_size=(img_width, img_height), batch_size=batch_size)

在上面的代码中,我们首先导入ImageDataGenerator,即下面代码:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

ImageDataGenerator是tensorflow.keras.preprocessing.image模块中的图片生成器,同时也可以使用它在batch中对数据进行增强,扩充数据集大小,从而增强模型的泛化能力。

ImageDataGenerator中有众多的参数,如下:

tf.keras.preprocessing.image.ImageDataGenerator(

featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, zca_epsilon=1e-6, rotation_range=0., width_shift_range=0., height_shift_range=0.,

brightness_range,

shear_range=0., zoom_range=0., channel_shift_range=0., fill_mode='nearest', cval=0., horizontal_flip=False, vertical_flip=False, rescale=None, preprocessing_function=None, data_format=K.image_data_format())

具体含义如下:

featurewise_center:布尔值,使输入数据集去中心化(均值为0)

samplewise_center:布尔值,使输入数据的每个样本均值为0。

featurewise_std_normalization:布尔值,将输入除以数据集的标准差以完成标准化。

samplewise_std_normalization:布尔值,将输入的每个样本除以其自身的标准差。

zca_whitening:布尔值,对输入数据施加ZCA白化。

rotation_range:整数,数据增强时图片随机转动的角度。随机选择图片的角度,是一个0~180的度数,取值为0~180。

width_shift_range:浮点数,图片宽度的某个比例,数据增强时图片随机水平偏移的幅度。

height_shift_range:浮点数,图片高度的某个比例,数据增强时图片随机竖直偏移的幅度。

shear_range:浮点数,剪切强度(逆时针方向的剪切变换角度)。是用来进行剪切变换的程度。

zoom_range:浮点数或形如[lower,upper]的列表,随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]。用来进行随机的放大。

channel_shift_range:浮点数,随机通道偏移的幅度。

fill_mode:‘constant’,‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理。

cval:浮点数或整数,当fill_mode=constant时,指定要向超出边界的点填充的值。

horizontal_flip:布尔值,进行随机水平翻转。随机的对图片进行水平翻转,这个参数适用于水平翻转不影响图片语义的时候。

vertical_flip:布尔值,进行随机竖直翻转。

rescale: 值将在执行其他处理前乘到整个图像上,我们的图像在RGB通道都是0~255的整数,这样的操作可能使图像的值过高或过低,所以我们将这个值定为0~1之间的数。

preprocessing_function: 将被应用于每个输入的函数。该函数将在任何其他修改之前运行。该函数接受一个参数,为一张图片(秩为3的numpy array),并且输出一个具有相同shape的numpy array。

下面看看我们对数据集增强后的一个效果,由于图片数量太多,我们显示其中9张图片,增强后图片如下:

大家可以多尝试下每个增强后的效果,增加些感性认识,数据增强和图片显示代码如下,只需要更改ImageDataGenerator中的参数,就能看到结果。

import matplotlib.pyplot as plt from PIL import Image from tensorflow.keras.preprocessing import image import glob datagen = ImageDataGenerator(rotation_range=30,rescale=1./255, shear_range=0.2,horizontal_flip=True) gen_data=datagen.flow_from_directory(

r"D://Learning//tensorflow_2.0//smile//datas//mouth//test",

batch_size=1,

shuffle=False, save_to_dir=r"D://Learning//tensorflow_2.0//smile//datas//mouth//model", save_prefix='gen', target_size=(48, 48)) for i in range(9): gen_data.next() name_list=glob.glob(r"D://Learning//tensorflow_2.0//smile//datas//mouth//model"+'/*') fig = plt.figure() for i in range(9): img = Image.open(name_list[i]) sub_img = fig.add_subplot(331 + i) sub_img.imshow(img) plt.show()

说完了数据增强,我们再看下ImageGenerator类下的函数flow_from_diectory。从这个函数名,我们也明白其就是从文件夹中读取图像。

train_generator = train_datagen.flow_from_directory( train_data_dir, target_size=(img_width, img_height), batch_size=batch_size)

flow_from_diectory中有如下参数:

directory:目标文件夹路径,对于每一个类,该文件夹都要包含一个子文件夹。

target_size:整数tuple,默认为(256, 256)。图像将被resize成该尺寸

color_mode:颜色模式,为"grayscale"和"rgb"之一,默认为"rgb",代表这些图片是否会被转换为单通道或三通道的图片。

classes:可选参数,为子文件夹的列表,如['smile','neutral'],默认为None。若未提供,则该类别列表将从directory下的子文件夹名称/结构自动推断。每一个子文件夹都会被认为是一个新的类。(类别的顺序将按照字母表顺序映射到标签值)。

class_mode: "categorical", "binary", "sparse"或None之一。默认为"categorical。该参数决定了返回的标签数组的形式, "categorical"会返回2D的one-hot编码标签,"binary"返回1D的二值标签。"sparse"返回1D的整数标签,如果为None则不返回任何标签,生成器将仅仅生成batch数据。

batch_size:batch数据的大小,默认32。

shuffle:是否打乱数据,默认为True。

seed:可选参数,打乱数据和进行变换时的随机数种子。

save_to_dir:None或字符串,该参数能让你将数据增强后的图片保存起来,用以可视化。

save_prefix:字符串,保存数据增强后图片时使用的前缀, 仅当设置了save_to_dir时生效。

save_format:"png"或"jpeg"之一,指定保存图片的数据格式,默认"jpeg"。

这些参数中的directory一定要弄清楚,它是指类别文件夹的上一层文件夹,在该数据集中,类别文件夹为smile和neutral,它的上一级文件夹是train。所以director为 r"D://Learning//tensorflow_2.0//smile//data//train"

另外,class这个参数也要注意,通常我们就采用默认None,directory的子文件夹就是标签。在该分类任务中标签就是smile和neutral。

以上就是在TensorFlow2.0中利用Keras这个高级API来对分类任务中的数据进行预处理。另外如果您需要完成一个目标检测等任务,则需要自定义一个类来继承ImageDataGeneraton。具体怎么操作,请期待我们的下回关于如何利用TensorFlow2.0处理目标检测任务的分享。

2 使用Dataset类对数据预处理

由于该方法在TensorFlow1.x版本中也有,大家可以比较查看2.0相对于1.x版本的改动地方。下面是TensorFlow2.0中使用的完整代码:

import tensorflow as tf

#from tensorflow.contrib.data import Dataset

#from tensorflow.python.framework import dtypes

#from tensorflow.python.framework.ops import convert_to_tensor

txtfile=r"D://Learning//tensorflow_2.0//smile//datas//train//train.txt" batch_size = 64 num_classes = 2 image_size = (48,48)

class ImageData: def read_txt_file(self): self.img_paths = [] self.labels = [] for line in open(self.txt_file, 'r'): items = line.split(' ') self.img_paths.append(items[0]) self.labels.append(int(items[1])) def __init__(self, txt_file, batch_size, num_classes, image_size, buffer_scale=100): self.image_size = image_size self.batch_size = batch_size self.txt_file = txt_file ##txt list file,stored as: imagename id self.num_classes = num_classes buffer_size = batch_size * buffer_scale # 读取图片 self.read_txt_file() self.dataset_size = len(self.labels) print("num of train datas=", self.dataset_size)

# 转换成Tensor

#self.img_paths=convert_to_tensor(self.img_paths, dtype=dtypes.string)

#self.labels =convert_to_tensor(self.labels, dtype=dtypes.int32)

# 转换成Tensor self.img_paths = tf.convert_to_tensor(self.img_paths, dtype=tf.string) self.labels = tf.convert_to_tensor(self.labels, dtype=tf.int32) # 创建数据集 data = tf.data.Dataset.from_tensor_slices((self.img_paths, self.labels)) print("data type=", type(data)) data = data.map(self.parse_function) data = data.repeat(1000) data = data.shuffle(buffer_size=buffer_size) # 设置self data Batch self.data = data.batch(batch_size) print("self.data type=", type(self.data)) def augment_dataset(self, image, size): distorted_image = tf.image.random_brightness(image, max_delta=63) distorted_image = tf.image.random_contrast(distorted_image, lower=0.2, upper=1.8) # Subtract off the mean and divide by the variance of the pixels. float_image = tf.image.per_image_standardization(distorted_image) return float_image def parse_function(self, filename, label): label_ = tf.one_hot(label, self.num_classes)

#img = tf.read_file(filename)

img = tf.io.read_file(filename) img = tf.image.decode_jpeg(img, channels=3)

img = tf.image.convert_image_dtype(img, dtype=tf.float32)

#img =tf.random_crop(img,[self.image_size[0],self.image_size[1],3])

img=tf.image.random_crop(img, [self.image_size[0], self.image_size[1], 3]) img = tf.image.random_flip_left_right(img) img = self.augment_dataset(img, self.image_size) return img, label_ dataset = ImageData(txtfile, batch_size, num_classes, image_size)

上图中标红色的地方是tensorFlow2.0版本与1.x版本的区别,红色部分属于1.X版本。主要更改在contrib部分,在tensorFlow2.0中已经删除contrib了,其中有维护价值的模块会被移动到别的地方,剩余的都将被删除,这点大家务必注意。

如果您对上面代码有任何不明白的地方请移步之前的文章:【tensorflow速成】Tensorflow图像分类从模型自定义到测试

重要活动,本周有三AI纪念扑克牌发售中,只有不到100套的名额噢,先到先得!

有三AI纪念扑克牌

总结

本文主要介绍了如何在TensorFlow2.0中对自己的数据进行预处理。主要由两种比较好用的方法,第一种是TensorFlow2.0中特有的,即利用Keras高级API对数据进行预处理,第二种是利用Dataset类来处理数据,它和TensorFlow1.X版本基本一致。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有三AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
有必要搞这么复杂,太复杂了,一点可操作性都没有
有必要搞这么复杂,太复杂了,一点可操作性都没有
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Intellij IDEA 14 创建Maven Web项目
点击File–》new Project,弹出下面设置框,选择Maven,设置SDK,勾选Create from archetype,在下面选中maven-archetype-webapp,点击Next。
程序新视界
2022/11/30
6900
Intellij IDEA 14 创建Maven Web项目
maven的hello word
maven目录结构 src/main/java Application/Library sources src/main/resources Application/Library resources src/main/filters Resource filter files src/main/webapp Web application sources src/test/java Test sources src/test/resources Test resources src/test/filt
东营浪人
2019/09/05
4820
IntelliJ IDEA 17和Maven构建javaWeb项目
前言   电脑又断电了,眼看着写好的东西就没有了,这是第二次犯这个错误了。很难受呀!还是回到正题吧,我们来使用IDEA和Maven构建一个JavaWeb项目   软件环境:       IDEA:2017.2.1     JDK:1.8.0_91     Maven:3.3.9 一、Maven配置 1.1、Maven简介    相对于传统的项目,Maven 下管理和构建的项目真的非常好用和简单,所以这里也强调下,尽量使用此类工具进行项目构建, 它可以管理项目的整个生命周期。   可以通过其命令做所有相关的工
用户1195962
2018/01/18
1.2K0
IntelliJ IDEA 17和Maven构建javaWeb项目
Maven Web 应用
本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的项目,如何创建、构建、部署已经运行一个 web 应用。
陈不成i
2021/07/15
6280
解决Idea创建maven-archetype-webapp项目无java目录的问题
  在适用IDEA创建maven-archetype-webapp项目的时候,创建完成后发现在main文件夹下没有java源文件夹,不少小伙伴也遇到该问题,但不知道怎么解决,下面我就来分享解决步骤。
阿豪聊干货
2018/08/09
8320
解决Idea创建maven-archetype-webapp项目无java目录的问题
IntelliJ IDEA创建maven web项目(IDEA新手适用)
PS:从eclipse刚转到IDEA,对于这个陌生的工具我表示无言,但听说很好用,也就试试,结果我几乎花了一晚上的时间才搭起来maven web项目,觉得在此给各位一个搭建maven web项目的教程,指出我踩过的各种坑!
全栈程序员站长
2022/09/13
1.4K0
IDEA配置Maven
file--settings ---Build, Excution,Deployment--Build Tools--Maven
兮动人
2021/06/11
7.2K0
IDEA配置Maven
IDEA 创建Maven Web项目
公司有一个非常老的项目,决定进行简单重构,纳入自动化流水线部署的序列。原项目采用很古老的Jar包依赖模式,也就是直接将jar包放在项目中。同时,项目结构也非常奇特,不是标准的Web项目目录结果。
程序新视界
2022/07/29
1.1K0
IDEA 创建Maven Web项目
IDEA配置Maven教程{收藏}
maven是apache组织开发的一款开源的可以管理JavaWeb项目jar包的构建,可以解决jar包之间的冲突;可以对项目进行管理,比如项目打包等,maven使用pom项目对象模型进行构建项目的。
框架师
2019/09/19
7.7K0
IDEA配置Maven教程{收藏}
idea new web project maven jetty
0.转载自http://blog.csdn.net/qwdafedv/article/details/79448332
qubianzhong
2018/09/19
4890
从0到1教你学Maven(全网最详细)(六)maven创建javase项目,创建web项目
以上是选择maven创建项目,并且选择jdk。还可以根据模板创建maven项目,可以加快创建项目的速度,也可以不使用模板。
一写代码就开心
2021/03/02
5800
从0到1教你学Maven(全网最详细)(六)maven创建javase项目,创建web项目
【Maven 入门教程】4、如何使用 IDEA 创建 Maven 项目
之前我们已经学习过 Maven 是什么,我们可以用它来干什么。接着我们又介绍了如何安装和配置 Maven,再接着,我们又了解了 Maven 中常用的一些命令以及如何利用 Archetype 来生成项目骨架,并对利用 Maven 所生成项目的结构进行了描述。最后则是 Maven 中的一些核心概念和如何进行依赖管理,并说明当依赖产生冲突时,应该如何解决。但以上始终还是停留在概念的阶段,并未进入我们实际的开发中。那么今天的内容就主要来看看,我们如何利用 IDEA 搭配 Maven 来开发一个简单的 Demo。
村雨遥
2022/06/16
4.7K0
【Maven 入门教程】4、如何使用 IDEA 创建 Maven 项目
Idea创建maven项目流程、修改默认配置、及注意事项
windows7+jdk1.7.0_80+tomcat8.5.41+maven3.0.5+idea2017.3.6
秋雨
2019/07/22
4.5K0
Idea创建maven项目流程、修改默认配置、及注意事项
使用IntelliJ IDEA 15和Maven创建Java Web项目(1)
    相对于传统的项目,Maven 下管理和构建的项目真的非常好用和简单,所以这里也强调下,尽量使用此类工具进行项目构建, 它可以管理项目的整个生命周期。
bear_fish
2018/09/19
7420
使用IntelliJ IDEA 15和Maven创建Java Web项目(1)
Maven详细介绍
如何回答这个问题要看你怎么看这个问题。 绝大部分Maven用户都称Maven是一个"构建工具":一个用来把源代码构建成可发布的构件的工具。 构建工程师和项目经理会说 Maven是一个更复杂的东西:一个项目管理工具。那么区别是什么? 像Ant这样的构建 工具仅仅是关注预处理,编译,打包,测试和分发。像 Maven 这样的一个项目管理工 具提供了构建工具所提供功能的超集。 除了提供构建的功能,Maven还可以生成报告, 生成Web站点,并且帮助推动工作团 队成员间的交流。一个更正式的 Apache Maven 1 的定义: Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。别让Maven是一个"项目管理"工具的事实吓跑你。如果你只是在找一个构建工具,Maven能做这个工作。 事实上,本书的一些章节将会涉及使用Maven来构建和分发你的项目。
WindWant
2020/09/11
2.7K0
Maven详细介绍
使用IDEA创建SpringMvc并整合Thymeleaf(Java配置版)
使用idea:File–>New–>Project–>Maven,然后勾选"Create from archetype",继续选中"maven-archetype-webapp"。最后填好GroupId和ArtifactId.
凡人飞
2020/09/20
1.1K0
Java快速入门教程 3、使用IntelliJ IDEA+Maven 创建、开发、管理项目
在 POM 中,groupId, artifactId, packaging, version 叫作 maven 坐标,它能唯一的确定一个项目。有了 maven 坐标,我们就可以用它来指定我们的项目所依赖的其他项目,插件,或者父项目。
KenTalk
2018/09/11
2.5K0
Java快速入门教程 3、使用IntelliJ IDEA+Maven 创建、开发、管理项目
IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架
在「详述 IntelliJ IDEA 创建 Maven 项目及设置 java 源目录的方法」一文中,我们已经将 IntelliJ IDEA 中的 Maven 项目的框架搭建完成。接着上文,在本文中,我们更近一步,利用 Tomcat 运行我们的 Web 项目。
CG国斌
2018/04/29
2.3K4
IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架
在eclipse下使用maven创建web项目
第一次接触maven管理的项目是在大三的时候,当时由于忙于享受大学里的美好时光而错过了美好的学习时机。现在想想还是有点小后悔的,如果当初能够好好学习,现在来公司就能够直接手手头上这个项目,不至于这么苦逼,大热天还得抱着电脑学习。但是之前所做的每一件事,只要不是对着天花板发呆,谁知道对我们的日后成长会有什么影响了。所以仔细想想还是抓紧当下,展望未来吧! 在看这篇文章之前,大家伙得先把maven安装配置好,还要在eclipse上安装上maven插件。不然下面的操作你是无法进行下去的。这里推荐一些maven相关教程。 Maven安装配置: http://jingyan.baidu.com/article/d8072ac45d3660ec94cefd51.html Eclipse上安装maven插件: http://blog.csdn.net/wode_dream/article/details/38052639 Maven基础学习教程:http://wiki.jikexueyuan.com/project/maven/overview.html
我是李超人
2020/08/20
9530
Maven Web项目
这里注意和java项目的几个区别:没有test项目、没有在主项目源码下面建立指定的包结构层次.
郑小超.
2023/10/16
2510
Maven Web项目
相关推荐
Intellij IDEA 14 创建Maven Web项目
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档