首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

心血来潮系列之一——利用spark将数据集转化为Tensorflow的tfrecords格式

在训练的时候,数据传入的方式有好几种:preloaded data,feeding,read from file,而当我们遇到训练集非常大的时候一般会选用read from file方式,从文件读的时候可以读入csv,text,tfrecords等,而tfrecords是TensorFlow支持很好的一种方式,将训练集转化成tfrecords的格式将加速训练的速度,这种格式方便传输,因为它是以protobuf的方式序列化的。

对于一般大小的文件,我们可以通过Python的方式直接来将训练集转化成tfrecords,再大一些我们也用python的多线程方式来转,但是如果遇到上亿条训练样本的时候,直接用Python来转效率上还是有些低的,所以考虑是否可以用spark这类分布式系统来进行转换,因为protobuf是跨语言的。在网上找了一些资料发现TensorFlow的源码中其实已经提供了对应的proto文件,我们可以将其转化成Java代码,所以这样一来就方便了许多,从Java到spark我们只需要增加一个outputformat的实现,我们就可以方便的将训练数据集用spark的方式转化成tfrecords了。

本篇文章就介绍一下具体的实现方式,有兴趣的小盆友可以跟着一起做哦!

第一步:下载TensorFlow的源码,下载protobuf工具,TensorFlow需求的版本是3.0的。源码下载下来之后,proto文件所在的位置为:tensorflow\tensorflow\core\example,主要是example.proto和feature.proto。

注:提供一个下载protobuf的工具——https://github.com/google/protobuf/releases

第二步:将proto文件转化成Java代码。利用protobuf将.proto文件转化成Java的代码,详细的命令可以查看一下使用文档。

第三步:实现一个outputformat。用Java实现一个outputformat,实现的方式其实跟TextOutputFormat非常的类似,需要修改对应的RecordWriter,这个主要就是写tfrecord的方式。主要要实现的是实现一个写Example的函数,然后修改writeObject和write方法。我这边在实现的时候直接忽略了key的存储,因为我只关系Example的内容。

第四步:编写spark程序,将数据集转化成tfrecords,包含了两个小的步骤:

第1小小步,将训练集转化成Example对象:

第2小小步,存储的时候调用刚实现的outputformat:

其中output就是你需要输出的路径,TFRecordsOutputFormat就是自定义的输出。

第五步:利用产生的tfrecords来进行训练。训练的时候是用Python来实现TensorFlow的代码的,我们需要从HDFS中将我们产生的tfrecords文件,下载下来,放到我们训练集的位置,因为我们用Spark存储的时候可以设定partition的数量,所以我们再训练过程中选择训练集、验证集、测试集的时候,只需要用不同的文件就行了,这样也非常的方便。

下面给出一个简单的读的例子:

数据读出来之后就可以愉快的训练模型啦。

想要完整代码的童鞋,请速速关注我吧!!!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180610G1H5LX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券