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

解决keras、tensorflow 2.0版本报错问题 前言 主要是解决由于1.0版本和2.0版本代码实现不同造成的报错 报错一:cannot import name 'Adam' from'keras.optimizers' 报错语句:from keras.optimizers import Adam 正确语句:from keras.optimizers import adam_v2 报错二: .................. 阅读详情

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

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

作者&编辑 | 汤兴旺

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


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

1.1 数据集

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


微笑图片:

640?wx_fmt=png

非微笑图片:

640?wx_fmt=png

数据集结构组织如下:

640?wx_fmt=png

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

1.2 数据预处理

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

640?wx_fmt=png

这个步骤虽然看起来比较复杂,但在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"

img_width,img_height = 48,48

train_datagen = ImageDataGenerator(

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

from tensorflow.keras.preprocessing.image import ImageDataGenerator

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

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

tf.keras.preprocessing.image.ImageDataGenerator(

   featurewise_center=False,

   brightness_range,    

   shear_range=0.,

具体含义如下:

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张图片,增强后图片如下:

640?wx_fmt=png

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

import matplotlib.pyplot as plt

        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",

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

train_generator = train_datagen.flow_from_directory(

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

      # 转换成Tensor

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

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

       #img = tf.read_file(filename)

       img = tf.io.read_file(filename)

       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])

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

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

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

有三AI纪念扑克牌

640?wx_fmt=jpeg

总结

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


下期预告:使用TensorFlow构建深度学习网络。

近期chat

640?wx_fmt=jpeg

今日看图猜技术

640?wx_fmt=png

知识汇总

640?wx_fmt=png

有三AI生态

640?wx_fmt=png

转载文章请后台联系

侵权必究

更多请关注知乎专栏《有三AI学院》

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

往期精选

TF2.0之TFRecord文件读取(下) TF2.0之TFRecord文件读取(下) 此文章为 “VOC转化为TFRecord文件(一)”的下篇 # tfrecord文件读取:参考 reader = tf.data.TFRecordDataset('./target2/000.tfrecord') feature_description = { #1. 对于单个元素的变量,我们使用FixlenFeature来读取,需要指明变量存储的数据类型 #2. 对于list类型的变量,我们使用VarLenFeature来读取,同样需要指明读取变 阅读详情

相关推荐

Tensorflow中使用tfrecord方式读取数据

前言本博客默认读者对神经网络与Tensorflow有一定了解,对其中的一些术语不再做具体解释。并且本博客主要以图片数据为例进行介绍,如有错误,敬请斧正。使用Tensorflow训练神经网络时,我们可以用多种方式来读取自己的数据。如果数据集比较小,而且内存足够大,可以选择直接将所有数据读进内存,然后每次取一个batch的数据出来。如果数据较多,可以每次直接从硬盘中进行读取,不过这种方式的读取效率就比较

无空ty的博客 2万+

关于contrib模块在tensorflow2.0下运行的解决方案

今天在学习代码时,因为tensorflow2.0对contrib模块进行分开维护,contrib在tensorflow2.0已经被移除,其功能要不就是集成在tensorflow中了,要不就是转到别的repo上了,compat.v1方法尝试之后发现并没什么用。 解决方案: 1.在对tensorflow版本没有要求的情况下,可以降低tensorflow的版本,进行重新安装。pip uninstall tensorflow 2.对应要使用的contrib中的功能,找tensorflow2.0的API手册中相应方法

weixin_43217958的博客 9367

Tensorflow2.0 HDFS数据读取

Tensorflow HDFS数据读取1. 背景2. Code2.1 From CSV2.2 From TensorRecord 1. 背景 实际工作中训练数据往往很多,很难全部download到本地使用pandas load使用。本文介绍从HDFS读取数据用于训练的方法。 ps: 代码基于tensorflow 2.0 实现 2. Code 不废话,直接上代码吧 2.1 From CSV 基本思路...

一对儿程序猿 5678

深度学习笔记14_猫狗分类案例优化 - 数据增强

猫狗分类案例优化 - 数据增强 数据增强的基本概念 **数据增强:**利用多种数字图像处理方法(旋转,剪切,错切,缩放,翻转,边缘填充)生成可信图像. 其目标是,模型在训练时不会两次查看完全相同的图像。这让模型能够观察到数据的更多内容,从而具有更好的泛化能力。 在keras中可以通过:ImageDataGenerator函数来实现图像的随机变换. rotation_range 是角度值(在 0~...

瓦力人工智能 1415

PSOC Creator 入门教程超详细

最近工作原因需要使用到赛普拉斯的一款芯片,奈何以前没有用过,所以趁这次也学习了一些简单的用法,总结一下,希望能帮到有需要朋友,因为网上关于这方面的文章少的可怜,详细点的更是少之又少!废话少说,正文开始.

qm_mq的博客 5747

从科研小白到动物行为分析:我的DeepLabCut 3.0安装与初体验全记录

本文记录了从科研小白到成功安装并使用DeepLabCut 3.0进行动物行为分析的全过程。详细介绍了Anaconda环境配置、CUDA版本选择、DeepLabCut安装步骤及验证方法,并分享了初体验中的实用技巧和跨学科研究心得,为生物研究者提供了AI工具应用的实战指南。

weixin_30235225的博客 403

版本升级:tensorflow2.0(自动程序版本变更脚本,tf网址,contrib)

注意事项: 以前的网址是https://www.tensorflow.org/,现在fq都打不开!! 现在新网址是https://tensorflow.google.cn/这个不fq都可以打开了,中文网站! 将低版本tf代码自动升级为高版本 以前使用的tf1.13版本,现在换成了tf2.0,以前程序用不了了,例如下图中背景色的代码都是无法读取的 tf2.0更新了很多api,利用终端进...

执契的博客 8967

calibre QRC提取寄生参数

typical将上面的文件QCI_flow里面的文件 在Cp 到当前 ,其实应该是某几个文件,但是我给忘记了 就全cp过来了 ,无影响,不过也希望大佬指正。

2202_75711937的博客 1523

ImageDataGenerator生成器的flow,flow_from_directory用法总结,及自己踩的坑【原创】

踩坑: 一直都不知其问题出在哪,如报错: ValueError: Error when checking target: expected sequential_1 to have shape (2,) but got array with shape (1,) 源代码中: 进行fine-tune,原本是 #top_model.add(Dense(1, activation='s...

Monster_H7的博客 7239

【100分】【等和子数组最小和】

逆序排序,这样能够使得在分组时优先选取较大的元素,以便将元素分配到较小的子集中,从而使得每个子集的和相对均衡。给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。分成若干个组,使得每组的和相等,并求出满足条件的所有分组中,组内元素和的最小值。在递归的过程中,我们需要注意一个优化点,即避免将相同和的桶重复计算。4 个子集(5),(1,4),(2,3),(2,3)2 个子集(5, 1, 4),(2,3, 2,3)个子集,则返回子集和的最小值,如果不能,则将。

weixin_54707168的博客 1169

SAR图像降噪:基于小波变换和双边滤波器的Matlab实现

小波变换和双边滤波器是常用的图像降噪技术,它们可以在保持图像细节的同时有效抑制噪声。本文介绍了基于小波变换和双边滤波器的SAR图像降噪方法,并提供了相应的Matlab源代码。通过对比原始图像和降噪后的图像,可以观察到噪声得到一定程度的抑制,同时保留了图像的细节信息。本文将介绍一种基于小波变换和双边滤波器的方法,用于SAR图像的降噪,并提供相应的Matlab源代码。希望这篇文章能够帮助您理解基于小波变换和双边滤波器的SAR图像降噪方法,并为您提供实现该方法的Matlab源代码。对图像的高频部分进行降噪处理。

ScriptCharm的博客 841

tensorflow2.0和torch的数据读取方式总结

1. tensorflow2.0的数据读取方式 1.1 直接读取图片数据 tf2.0读取数据的方式有很多种【0】,当想要直接读取数据时,推荐采用tf.data.dataset的方式。该方式可以并行读取数据,也可以在训练网络的同时读取数据,可以充分发挥GPU和多核CPU的实力。 根据个人的理解,我认为tf.data.Dataset对象在读取图片时,并非一次性把所有数据都读入内存中,而是在使用时才读取数据,这里牵扯三个存储位置第一个位置是硬盘中的数据,第二个是shuffle()设置的内存中的一块区域,

BIT_Legend的博客 455

WPF+MVVM案例实战(二十三)- 阴影效果详解

通过附加属性实现阴影效果,通过改变不同的阴影属性值达到不同阴影效果

lingshuangcanxue 561

delphi cxgrid读取本地image_【TensorFlow2.0】数据读取与使用方式

大家好,这是专栏《TensorFlow2.0》的第三篇文章,讲述如何使用TensorFlow2.0读取和使用自己的数据集。如果您正在学习计算机视觉,无论你通过书籍还是视频学习,大部分的教程讲解的都是MNIST等已经为用户打包封装好的数据集,用户只需要load_data即可实现数据导入。但是在我们平时使用时,无论您是做分类还是检测或者分割任务,我们不可能每次都能找到打包好的数据集使用,大多...

weixin_39968490的博客 603

ORB-SLAM3算法2之EuRoc开源数据集运行ORB-SLAM3生成轨迹并用evo工具评估轨迹

ORB-SLAM3算法1 已成功编译安装ORB-SLAM3到本地,本篇目的是用EuRoc开源数据来运行ORB-SLAM3,并生成轨迹,最后用evo评估工具来评估ORB-SLAM3生成的轨迹和真值轨迹。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 3762

YOLOv8训练流程-原理解析[目标检测理论篇]

本篇文章主要介绍了YOLOv8训练的流程,主要介绍了Task Aligned Assigner正负样本匹配策略以及YOLOv8的损失计算。

ice 4518

【Tensorflow2.0】9、tf.data与keras数据读取方式速度对比

文章目录1、三种数据读取方式对比1.1、准备本文所用数据1.2、准备tf.data数据1.3、keras生成器读数据方式1.4、tf.data包装keras生成器1.5、有了三种数据类型开始比较速度2.对tf.data进行改进2.1 使用AUTOTUNE2.2 使用cache2.3 map的使用说明: 关于对shuffle,cache,batch,map,prefeach,repeat的顺序,排列...

dddeee的专栏 3148

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

tensorflow入门教程(五十二)通过fit_generator和Sequence多进程读取训练数据

# #作者:韦访 #博客:https://blog.csdn.net/rookie_wei #微信:1007895847 #添加微信的备注一下是优快云的 #欢迎大家一起学习 # ---- 韦访20190822 1、概述 这一讲用的是tensorflow2.0,tensorflow2.0确实比tensorflow1.x简洁许多,特别是直接集成了keras使得它更易上手。我们以前的教程中有说过...

韦访的专栏 1514

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Tensorflow2.0 自定义图像数据集 读取加速 tf.data.Dataset.cache (二)

接上一篇Tensorflow2.0 tf.data.Dataset.from_tensor_slices 自定义图像数据集 (一要 这里写目录标题Tensorflow图像数据集加载图片路径和标签读取图像预处理创建Tensorflow Dataset对象方案一(不推荐)方案二(推荐)Dataset对象的预处理输入网络Pytorch参考 Tensorflow 图像数据集加载 从tf.keras...

Forrest97的博客 3719

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Tensorflow2.0 tf.data.Dataset.from_tensor_slices 自定义图像数据集 (一)

Pytorch 标准二级目录名为类别的图像存储格式数据,采用Pytorch自带API db = torchvision.datasets.ImageFolder(root='dir', transform=preprocess) Tensorflow 标准二级目录名为类别的图像存储格式数据,采用Pytorch自带API db = torchvision.datasets.ImageFolder(...

Forrest97的博客 3186

docsets tensorflow_如何系统学习使用tensorflow?

一个成熟框架的最好的学习路径永远来自官方DOC但是tensorflow经过多个版本的迭代,官方文档内容繁多,如何循序渐进,按需索取呢?以下教学基于tensorflow官网最新版本,也就是tf2.0以上,新入门者也建议从2.0学起,抽象较为高层,api较为友好。如果你需要看一些1.0代码,也可以参考旧版文档。首先进入教程左边栏中快速入门,keras,预处理先进行速览,Estimator属于和kera...

weixin_33585822的博客 147

tensorflow2.0 读取图片数据总结

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

qq_35306993的博客 5683

tensorflow2.0-从文件夹中读取图片数据

tensorflow2.0-从文件夹中读取图片数据 1. 从路径CSV文件读取图片数据 2.直接从文件夹读取

weixin_41485334的博客 6323

TensorFlow中读取图像数据的三种方式

Update on 2019.06.18 从tesorflow1.11之后,(大概是这个版本号),谷歌推出了tf.data模块来读取数据,甚至在tensorflow2.0中,取消了数据队列管道,所以我建议大家学习tf.data模块。未来我也会做详细的tf.data模块使用说明。 Upata on 2019.7.22 我已经更新了tf.data的使用方法。建议精读,一定能掌握tf.da...

我的博客有点东西 1万+

Tensorflow2.0加载图片数据集的两种方式

在tensorflow2.0中加载图片数据集一般有两种方式,第一种是使用tf.keras中的ImageDataGenerator生成器,适合图片分类问题,简单但不灵活;第二种是使用tf.data.Dataset搭配tf.image中的一些图片处理方法,较为灵活。下面分别介绍一下。

weixin_43917574的博客 7809

TensorFlow2.0教程-保持和读取模型

TensorFlow2.0教程-保持和读取模型 Tensorflow 2.0 教程持续更新 :https://blog.csdn.net/qq_31456593/article/details/88606284 完整tensorflow2.0教程代码请看tensorflow2.0:中文教程tensorflow2_tutorials_chinese(欢迎star) 入门教程: TensorFlow ...

知行_那片天 1万+
上一篇: 有三AI一周年了,说说我们的初衷,生态和愿景
下一篇: 【AI不惑境】残差网络的前世今生与原理
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值