当前位置:网站首页>边境的悍匪—机器学习实战:第十三章 使用TensorFlow加载和预处理数据
边境的悍匪—机器学习实战:第十三章 使用TensorFlow加载和预处理数据
2022-07-30 05:44:00 【来自边境的悍匪】
第十三章 使用TensorFlow加载和预处理数据
文章目录
前言
我们训练模型的过程中,有很多的时间需要用来完成数据的分析与处理,并且这一部分的工作会占去你大部分的精力。我们在模型训练的前期阶段就已经会面临很多的问题:1、数据集较大难以加载,2、每个实例之间关联性很强导致的模型过拟合,3、对数据的预处理。这些问题很棘手处理起来很复杂,所以TensorFlow针对这些问题都提供了它特有的解决方式。让我们一起来看一下吧。
一、思维导图

二、主要内容
1、数据API
- 链式转换
我们在使用数据API创建一个数据集完成后,可以对数据集做任何的转换操作,由于每次转换之后都会生成一个新的数据集,所以我们可以使用链式的方式对数据进行多重转换。 - 乱序数据
我们在使用梯度下降来训练模型时,数据的相互独立与均匀分布将会对梯度下降的效果有很大的影响。所以我们需要对数据进行乱序处理。
对于数据集可以放入内存中的数据,我们可以使用缓冲区的方式,在获取数据之前将指定数据的实例放入缓冲区,当需要一个数据时,从缓冲区中随机获取一个,并从原数据中去一个实例替换刚刚取出的那一个。
对于数据集相当庞大的数据,我们可以将所有的数据集拆分为多个小的文件,然后训练过程中随机读取,不过还是会存在同一个文件的数据之间相互有关联的情况,这种情况我们可以同时读取多个文件然后交错他们的记录,并创建一个缓冲区形成最终的乱序。 - 预处理数据
在收到打乱之后的数据集,我们就需要创建一个对数据进行预处理的函数,然后讲预处理的函数和之前的创建、乱序操作整合在一起放入到一个函数中,使得所有代码都能够重用。 - 预取
我们为了在训练过程中使得GPU的使用率尽可能的达到100%,我们就需要在训练一个批次数据的时候,尽可能的准备好下一个批次的数据为GPU的获取提供数据。 - 和tf.keras一起使用数据集
我们可以使用csv_reader_dataset()创建数据集并且不需要循环,因为keras已经为我们进行了处理。我们可以将这些生成的数据传给fit,还可以自定义循环,甚至是构建整个训练的TF函数。
2、TFRcord格式
- 简介
TFRecord是TensorFlow首选的数据格式,它可以存储大量的数据并且有效的读取,TFRecord是始终简单的二进制格式,它值包含了大小不同的二进制记录序列。我们可以使用tf.io.TFRecordWrite创建TFRecord文件,可以使用tf.data.TFRecordDataset读取一个或者多个TFRecord文件。 - 压缩的TFRecord文件
如果在数据的传输过程中需要通过网络加载文件。我们可以设置options参数来创建压缩后的TFRecord文件。 - 协议缓冲区简介
TFRcord文件通常包含序列化的缓冲区这是一种可移植可扩展的二进制格式。我们在定义完成后需要对.proto进行编译,如果需要再次把数据保存在TFRecord中则需要对数据进行序列化。但是序列化的方法并不是TensorFlow函数,会导致性能降低。 - TensorFlow协议
因为使用protobufs会降低模型的性能,所以提出了TensorFlow协议,主要使用的protobuf是Example protobuf它通常会创建不只一个的Example然后序列化存入TFReord中。
我们在加载序列化的Example protobufs需要使用到tf.data.TFRecordDataset并使用tf.io.parse_single_example来解析每一个。 - 使用SequenceExample Protobuf处理列表的列表
当你遇到得的数据是列表中的列表有多层对应关系的时候,我们就需要SequenceExample来解决,构建的方式与Example相同,但是在解析的时候需要使用tf.io.parse_single_sequence_example或者tf.io.parse_sequence_example。
3、预处理输入特征
- 简介
我们在把数据送入到神经网络之前,我们需要对数据进行预处理,将所有特征转换为数据特征。这个时候我们就需要创建一个自定义层,并把一部分数据传入到层中使其自适应。 - 使用独热向量编码分类特征
我们在对分类特征进行转换并且特征的数据少于10时,可以使用独热向量,由于独热向量的大小等于分类数加上oov桶的数量,所以分类数量大于10时不建议使用。 - 使用嵌入编码分类特征
当我们需要处理的分类很多时,我们可以使用嵌入。嵌入是表示类别的可训练米基向量,嵌入的初始化是随机的,然后在训练的过程中逐步完善,嵌入的表征越好神经网络越容易做出准确的预测。这种方式成为表征学习。嵌入与层一样可以在相同的任务中重用。
词嵌入是一种常见的的嵌入实例,往往都会在深度学习中有很好的效果,不过由于嵌入的过于灵活,嵌入会学习到一个类似于人性偏见的问题。缺少了公平性。 - Keras预处理层
TenosrFlow为了提高开发的效率已经努力提供了几个预处理层。例如:Normalization的特征标准化,TextVectorization将单词编码为测绘表中的索引,Discretization将连续的数据切成不同的离散快。
当你需要将一组数据多次进行预处理时,你可以使用PreprocessingStage将多个处理层串联起来,创建一个预处理流水线,你可以像使用层一样的使用这个流水线。
4、TF Transform
一些小批量的数据可以直接使用把数据加载到内存中的方式来预处理数据,但是如果涉及到无法放入内存的大量数据,那么就需要先对这些数据进行预处理。
使用首先预处理的方式就会涉及到模型的迁移问题,就需要在不同的部署环境中都编写一套同样的预处理程序,或者是每个部署环境都使用预处理过后的数据,但是这两个方式都显得很笨拙,所以就提出了TF Transform,使用它一旦你的预处理函数编写完之后你就可以将它插入到模型中。
5、TensorFlow数据集项目
当你想要加载一些通用的数据集时,你可以只是使用TensorFlow数据集,你通过设置参数或者是调用其他方法来完成数据的处理操作。
三、课后练习
- 为什么要使用Data API?
获取大量的数据并对数据进行预处理是一个很庞大的工程。使用DataAPI可以简化这个过程。它提供的功能包括从各种不通的数据集获取数据,从多个不同的数据源并行读取数据,并对数据进行转换,对数据进行交织,打乱数据顺序,批处理和预取。 - 将大数据集拆分为多个文件有什么好处?
我们将大型数据集打乱为多个文件的好处是1、在使用乱序缓冲区细致的打乱数据之前先对数据进行粗略的打乱。2、能够解决单台计算机没有办法存放庞大数据集的情况。3、操作很多的小文件相对来说要比操作一个大文件要比较容易。4、当多个小文件是存放在不同的服务器上的时候,可以在不同的服务器上下载文件,这样可以提高带宽利用率。 - 在训练过程中,如何分辨输入流水线是瓶颈?你可以如何解决?
你可以使用TensorBoard来可视化数据分析,如果你的CPU没有完全利用,则你的输入可能会达到瓶颈,你可以并行读取和预处理多个线程的数据,并确保它能预取一些批次,如果这样还不能使你的GPU达到100%的利用率那你可能需要优化代码。你也可以将数据集保存到多个TFRcord文件中,并在训练之前对数据进行预处理。如果有必要,请使用有更多CPU和RAM的计算机,并确保GPU带宽足够大。 - 你可以将任何二进制数据保存到TFRecord文件,还是仅保存序列化的协议缓冲区?
TFRcord文件由一系列的任意二进制记录组成,你可以在记录中存储所需的任何二进制数据。但是实际上,大多数TFRecord文件都包含序列化协议缓冲区的序列,我们可以使用协议协议缓冲区的优势,在多种语言和多个平台之间轻松的读取。 - 为什么要将所有数据转换为Example protobuf格式?为什么不使用自己的protobuf定义?
Example protobuf格式的有点是,TensorFlow提供了一些操作来解析它,不需要定义自己的格式,并且已经足够灵活可以代表大多说的数据集中的实例。如果你不使用Example protobuf那么你需要定义自己的协议缓冲区然后使用protoc进行编译,然后使用tf.io.decode_proto()函数来解析序列化的protobuf,并且需要讲描述符和模型一起部署,过程很复杂但是可以做到。 - 使用TFRecords时,应何时激活压缩?为什么不系统地进行呢?
在使用TFRecord时,如果训练训练脚本需要下载TFRcord文件时,通常会希望下载的文件是压缩的文件减小下载的时间,但是如果你的训练脚本和TFRcord在同一台服务器上,那么就不建议使用压缩文件,因为这样会浪费了CPU的的资源来解压缩。 - 对数据进行预处理,可以在编写数据文件时,或者在tf.data流水线内,或者在模型内的预处理层中,或使用TF Transform。你能否列出每种方法的一些利弊?
使用在创建数据文件是对数据进行预处理方式的优点是:会使得训练运行得更快,因为他不必及时执行预处理。而且再某些情况下预处理过的数据会比原始数据小得多,可以节省了磁盘空间和下载的时间。缺点是:如果要按每个想法都生成预处理的数据集,或者是需要对数据集进行扩充,那么将要占用大量的磁盘空间,其次就是你必须在调用模型之前就对所有的数据完成预处理。
如果在tf.data.流水线镜像预处理,那么调整预处理的逻辑和对数据进行扩充要相对方便得多,但是这种方式会使得训练速度变得很慢,每个一个实例每个轮次进行一次预处理,并且同样的还是需要在调用模型之前就完成所有的预处理。
如果把预处理层添加到模型中,那么只需要编写一次预处理代码就可以进行预测和训练。并且当你的模型部署到不同的平台,你也不需要多次编写预处理代码,更不会有模型使用了错误的预处理数据导致的错误。缺点是:训练示例会在每个轮次进行一次预处理,并且默认情况下预处理操作将在GPU上针对当前轮次运行。
使用TF Transform结合了之前的很多有点,可以对数据集进行预处理并且每个实例只会预处理一次,而且会生成预处理层,所以你只用编写一次预处理代码,减少失误,缺点就是你得花时间去学会如何使用它。 - 列举一些可用于编码分类特征的常用技术。文本呢?
如果要对诸如电影等级这样具有自然顺序的分类特征进行排序编码最简单的就是使用顺序编码例如0、1、2,如果是没有自然循序的可以使用独热编码,如果类别很多那么可以使用嵌入。
对于文本,一种好的的选择是使用词袋表示:一个句子可能表示每个可能单词计数的向量。由于普通单词通常不是很重要,因此你需要使用TF-IDF来减轻权重。另外你还可以使用经过训练的词嵌入进行编码,除了对单词编码,还可以对每个字母或子单词令牌进行编码。
四、总结
这一章讲解了数据从创建出来到处理到传入模型训练之前的所有内容。所有内容总结一下为:
- 我们可以使用TensorFlow提供的数据API创建数据并对数据进行任何的操作。
- TensorFlow首选的数据格式是TFRecord,这个文件是一个简单的二进制格式,并且提供了TenorFlow协议能够使用TF方法加载和解析TFRecord文件。
- 对数据进行预处理时建议使用TF Transform,这个方式能使得你的编码只需一次就能像使用普通的层一样使用预处理层。
- 你可以TensorFlow加载任何你需要的通用数据集。
对文章有任何疑惑或者想要和博主一起学机器学习一起进步的朋友们可以添加 群号:666980220。需要机器学习实战电子版或是思维导图的也可以联系我。祝你好运!
项目地址: github
边栏推荐
- 十二、Kotlin进阶学习:一、Lambda 表达式;二、高阶函数;
- Common exception analysis of Redis client
- 基于MATLAB 2021b的机器学习、深度学习
- sql concat() function
- Kotlin协程的简单用法:1、GlobalScope(不建议使用);2、lifecycleScope、viewModelScope(建议使用);
- 七、Kotlin基础学习:1、创建类;2、构造函数;3、继承;4、封装;5、抽象类;6、接口;7、嵌套类;8、内部类;9、枚举类
- 原创 Acegi 1.03 安全机制
- 二十二、Kotlin进阶学习:简单学习RecyclerView实现列表展示;
- 冒泡排序、选择排序、插入排序、快速排序
- [Getting C language from zero basis - navigation summary]
猜你喜欢
随机推荐
Servlet基本原理与常见API方法的应用
Detailed explanation of regular expression syntax and practical examples
MySQL index optimization and failure scenarios
The types of data structures and MySQL index
冒泡排序、选择排序、插入排序、快速排序
【青岛站】SWAT模型高阶应用暨无资料地区建模、不确定分析与气候变化、土地利用对面源污染影响模型改进及案例分析研讨
Oracle数据库SQL优化详解
对于国内数据交换平台的分析
Self-augmented Unpaired Image Dehazing via Density and Depth Decomposition程序运行记录
sql concat()函数
用户密码加密编码使用 Bcrypt 代替 MD5,SHA1和SHA256
【MySQL功法】第5话 · SQL单表查询
XMLBean的基础运用
The Request request body is repackaged to solve the problem that the request body can only be obtained once
Nodejs PM2 monitoring and alarm email (2)
Using PyQt5 to add an interface to YoloV5 (1)
Rsync实现Win系统间的文件夹或数据同步
Xcode 绑定按钮点击事件
Shardingsphere depots table and configuration example
十、Kotlin基础学习:1、延迟加载;2、异常处理;3、使用 throw 主动抛出异常;4、自定义异常;









