热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javadataset读取数据,TensorFlow读写数据

前言回顾前面:众所周知,要训练出一个模型,首先我们得有数据。我们第一个例子中,直接使用dataset的api去加载mnist

前言

回顾前面:

众所周知,要训练出一个模型,首先我们得有数据。我们第一个例子中,直接使用dataset的api去加载mnist的数据。(minst的数据要么我们是提前下载好,放在对应的目录上,要么就根据他给的url直接从网上下载)。

一般来说,我们使用TensorFlow是从TFRecord文件中读取数据的。

TFRecord 文件格式是一种面向记录的简单二进制格式,很多 TensorFlow 应用采用此格式来训练数据

所以,这篇文章来聊聊怎么读取TFRecord文件的数据。

一、入门对数据集的数据进行读和写

首先,我们来体验一下怎么造一个TFRecord文件,怎么从TFRecord文件中读取数据,遍历(消费)这些数据。

1.1 造一个TFRecord文件

现在,我们还没有TFRecord文件,我们可以自己简单写一个:

def write_sample_to_tfrecord():

gmv_values = np.arange(10)

click_values = np.arange(10)

label_values = np.arange(10)

with tf.python_io.TFRecordWriter("/Users/zhongfucheng/data/fashin/demo.tfrecord", options=None) as writer:

for _ in range(10):

feature_internal = {

"gmv": tf.train.Feature(float_list=tf.train.FloatList(value=[gmv_values[_]])),

"click": tf.train.Feature(int64_list=tf.train.Int64List(value=[click_values[_]])),

"label": tf.train.Feature(int64_list=tf.train.Int64List(value=[label_values[_]]))

}

features_extern = tf.train.Features(feature=feature_internal)

# 使用tf.train.Example将features编码数据封装成特定的PB协议格式

# example = tf.train.Example(features=tf.train.Features(feature=features_extern))

example = tf.train.Example(features=features_extern)

# 将example数据系列化为字符串

example_str = example.SerializeToString()

# 将系列化为字符串的example数据写入协议缓冲区

writer.write(example_str)

if __name__ == '__main__':

write_sample_to_tfrecord()

我相信大家代码应该是能够看得懂的,其实就是分了几步:

生成TFRecord Writer

tf.train.Feature生成协议信息

使用tf.train.Example将features编码数据封装成特定的PB协议格式

将example数据系列化为字符串

将系列化为字符串的example数据写入协议缓冲区

参考资料:

ok,现在我们就有了一个TFRecord文件啦。

1.2 读取TFRecord文件

其实就是通过tf.data.TFRecordDataset这个api来读取到TFRecord文件,生成处dataset对象

对dataset进行处理(shape处理,格式处理...等等)

使用迭代器对dataset进行消费(遍历)

demo代码如下:

import tensorflow as tf

def read_tensorflow_tfrecord_files():

# 定义消费缓冲区协议的parser,作为dataset.map()方法中传入的lambda:

def _parse_function(single_sample):

features = {

"gmv": tf.FixedLenFeature([1], tf.float32),

"click": tf.FixedLenFeature([1], tf.int64), # ()或者[]没啥影响

"label": tf.FixedLenFeature([1], tf.int64)

}

parsed_features = tf.parse_single_example(single_sample, features=features)

# 对parsed 之后的值进行cast.

gmv = tf.cast(parsed_features["gmv"], tf.float64)

click = tf.cast(parsed_features["click"], tf.float64)

label = tf.cast(parsed_features["label"], tf.float64)

return gmv, click, label

# 开始定义dataset以及解析tfrecord格式

filenames = tf.placeholder(tf.string, shape=[None])

# 定义dataset 和 一些列trasformation method

dataset = tf.data.TFRecordDataset(filenames)

parsed_dataset = dataset.map(_parse_function) # 消费缓冲区需要定义在dataset 的map 函数中

batchd_dataset = parsed_dataset.batch(3)

# 创建Iterator

sample_iter = batchd_dataset.make_initializable_iterator()

# 获取next_sample

gmv, click, label = sample_iter.get_next()

training_filenames = [

"/Users/zhongfucheng/data/fashin/demo.tfrecord"]

with tf.Session() as session:

# 初始化带参数的Iterator

session.run(sample_iter.initializer, feed_dict={filenames: training_filenames})

# 读取文件

print(session.run(gmv))

if __name__ == '__main__':

read_tensorflow_tfrecord_files()

无意外的话,我们可以输出这样的结果:

[[0.]

[1.]

[2.]]

ok,现在我们已经大概知道怎么写一个TFRecord文件,以及怎么读取TFRecord文件的数据,并且消费这些数据了。

二、epoch和batchSize术语解释

我在学习TensorFlow翻阅资料时,经常看到一些机器学习的术语,由于自己没啥机器学习的基础,所以很多时候看到一些专业名词就开始懵逼了。

2.1epoch

当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个epoch。

这可能使我们跟dataset.repeat()方法联系起来,这个方法可以使当前数据集重复一遍。比如说,原有的数据集是[1,2,3,4,5],如果我调用dataset.repeat(2)的话,那么我们的数据集就变成了[1,2,3,4,5],[1,2,3,4,5]

所以会有个说法:假设原先的数据是一个epoch,使用repeat(5)就可以将之变成5个epoch

2.2batchSize

一般来说我们的数据集都是比较大的,无法一次性将整个数据集的数据喂进神经网络中,所以我们会将数据集分成好几个部分。每次喂多少条样本进神经网络,这个叫做batchSize。

在TensorFlow也提供了方法给我们设置:dataset.batch(),在API中是这样介绍batchSize的:

representing the number of consecutive elements of this dataset to combine in a single batch

我们一般在每次训练之前,会将整个数据集的顺序打乱,提高我们模型训练的效果。这里我们用到的api是:dataset.shffle();

三、再来聊聊dataset

我从官网的介绍中截了一个dataset的方法图(部分):

1460000018530101?w=332&h=988

dataset的功能主要有以下三种:

创建dataset实例

通过文件创建(比如TFRecord)

通过内存创建

对数据集的数据进行变换

比如上面的batch(),常见的map(),flat_map(),zip(),repeat()等等

文档中一般都有给出例子,跑一下一般就知道对应的意思了。

创建迭代器,遍历数据集的数据

3.1 聊聊迭代器

迭代器可以分为四种:

单次。对数据集进行一次迭代,不支持参数化

可初始化迭代

使用前需要进行初始化,支持传入参数。面向的是同一个DataSet

可重新初始化:同一个Iterator从不同的DataSet中读取数据

DataSet的对象具有相同的结构,可以使用tf.data.Iterator.from_structure来进行初始化

问题:每次 Iterator 切换时,数据都从头开始打印了

可馈送(也是通过对象相同的结果来创建的迭代器)

可让您在两个数据集之间切换的可馈送迭代器

通过一个string handler来实现。

可馈送的 Iterator 在不同的 Iterator 切换的时候,可以做到不从头开始。

简单总结:

1、 单次 Iterator ,它最简单,但无法重用,无法处理数据集参数化的要求。

2、 可以初始化的 Iterator ,它可以满足 Dataset 重复加载数据,满足了参数化要求。

3、可重新初始化的 Iterator,它可以对接不同的 Dataset,也就是可以从不同的 Dataset 中读取数据。

4、可馈送的 Iterator,它可以通过 feeding 的方式,让程序在运行时候选择正确的 Iterator,它和可重新初始化的 Iterator 不同的地方就是它的数据在不同的 Iterator 切换时,可以做到不重头开始读取数据。

string handler(可馈送的 Iterator)这种方式是最常使用的,我当时也写了一个Demo来使用了一下,代码如下:

def read_tensorflow_tfrecord_files():

# 开始定义dataset以及解析tfrecord格式.

train_filenames = tf.placeholder(tf.string, shape=[None])

vali_filenames = tf.placeholder(tf.string, shape=[None])

# 加载train_dataset batch_inputs这个方法每个人都不一样的,这个方法我就不给了。

train_dataset = batch_inputs([

train_filenames], batch_size=5, type=False,

num_epochs=2, num_preprocess_threads=3)

# 加载validation_dataset batch_inputs这个方法每个人都不一样的,这个方法我就不给了。

validation_dataset = batch_inputs([vali_filenames

], batch_size=5, type=False,

num_epochs=2, num_preprocess_threads=3)

# 创建出string_handler()的迭代器(通过相同数据结构的dataset来构建)

handle = tf.placeholder(tf.string, shape=[])

iterator = tf.data.Iterator.from_string_handle(

handle, train_dataset.output_types, train_dataset.output_shapes)

# 有了迭代器就可以调用next方法了。

itemid = iterator.get_next()

# 指定哪种具体的迭代器,有单次迭代的,有初始化的。

training_iterator = train_dataset.make_initializable_iterator()

validation_iterator = validation_dataset.make_initializable_iterator()

# 定义出placeholder的值

training_filenames = [

"/Users/zhongfucheng/tfrecord_test/data01aa"]

validation_filenames = ["/Users/zhongfucheng/tfrecord_validation/part-r-00766"]

with tf.Session() as sess:

# 初始化迭代器

training_handle = sess.run(training_iterator.string_handle())

validation_handle = sess.run(validation_iterator.string_handle())

for _ in range(2):

sess.run(training_iterator.initializer, feed_dict={train_filenames: training_filenames})

print("this is training iterator ----")

for _ in range(5):

print(sess.run(itemid, feed_dict={handle: training_handle}))

sess.run(validation_iterator.initializer,

feed_dict={vali_filenames: validation_filenames})

print("this is validation iterator ")

for _ in range(5):

print(sess.run(itemid, feed_dict={vali_filenames: validation_filenames, handle: validation_handle}))

if __name__ == '__main__':

read_tensorflow_tfrecord_files()

参考资料:

3.2 dataset参考资料

在翻阅资料时,发现写得不错的一些博客:

最后

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

下一篇文章打算讲讲如何理解axis~

1460000018530102?w=258&h=258

觉得我的文章写得不错,不妨点一下赞!



推荐阅读
  • 装饰器是一种用于在不修改原函数代码的情况下,动态地添加功能的工具。它允许你在函数执行前后插入额外的逻辑,从而增强或改变函数的行为。 ... [详细]
  • 本文详细介绍了使用NumPy和TensorFlow实现的逻辑回归算法。通过具体代码示例,解释了数据加载、模型训练及分类预测的过程。 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 本文详细介绍了 TensorFlow 的入门实践,特别是使用 MNIST 数据集进行数字识别的项目。文章首先解析了项目文件结构,并解释了各部分的作用,随后逐步讲解了如何通过 TensorFlow 实现基本的神经网络模型。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 在Ubuntu 16.04中使用Anaconda安装TensorFlow
    本文详细介绍了如何在Ubuntu 16.04系统上通过Anaconda环境管理工具安装TensorFlow。首先,需要下载并安装Anaconda,然后配置环境变量以确保系统能够识别Anaconda命令。接着,创建一个特定的Python环境用于安装TensorFlow,并通过指定的镜像源加速安装过程。最后,通过一个简单的线性回归示例验证TensorFlow的安装是否成功。 ... [详细]
  • 本文详细介绍如何通过Anaconda 3.5.01快速安装TensorFlow,包括环境配置和具体步骤。 ... [详细]
  • 本文详细介绍了非极大值抑制(Non-Maximum Suppression, NMS)算法的原理及其在目标检测中的应用,并提供了C++语言的具体实现代码。NMS算法通过筛选出高得分的检测框并移除重叠度高的其他检测框,有效提高了检测结果的准确性和可靠性。 ... [详细]
  • 本文探讨了图像标签的多种分类场景及其在以图搜图技术中的应用,涵盖了从基础理论到实际项目实施的全面解析。 ... [详细]
  • 本文介绍了一个使用Keras框架构建的卷积神经网络(CNN)实例,主要利用了Keras提供的MNIST数据集以及相关的层,如Dense、Dropout、Activation等,构建了一个具有两层卷积和两层全连接层的CNN模型。 ... [详细]
  • TensorFlow 2.0 中的 Keras 数据归一化实践
    数据预处理是机器学习任务中的关键步骤,特别是在深度学习领域。通过将数据归一化至特定范围,可以在梯度下降过程中实现更快的收敛速度和更高的模型性能。本文探讨了如何使用 TensorFlow 2.0 和 Keras 进行有效的数据归一化。 ... [详细]
  • 本文详细介绍了如何在 Windows 环境下使用 node-gyp 工具进行 Node.js 本地扩展的编译和配置,涵盖从环境搭建到代码实现的全过程。 ... [详细]
author-avatar
手机用户2502905627_315
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有