利用TFRecord和HDFS准备TensorFlow训练数据

摘要: 本文将介绍如何将数据转化为TFRecord格式,并且将生成TFRecord文件保存到HDFS中, 这里我们直接使用的是阿里云EMR(E-MapReduce)的HDFS服务。

本系列将利用阿里云容器服务的机器学习解决方案,帮助您了解和掌握TensorFlow,MXNet等深度学习库,开启您的深度学习之旅。

tensorflow-hdfs.jpg

数据准备和预处理是一个深度学习训练过程中扮演着非常重要的角色,它影响着模型训练的速度和质量。

而TensorFlow对于HDFS的支持,将大数据与深度学习相集成,完善了从数据准备到模型训练的完整链条。在阿里云容器服务深度学习解决方案中, 为TensoFlow提供了OSS,NAS和HDFS三种分布式存储后端的支持。

本文将介绍如何将数据转化为TFRecord格式,并且将生成TFRecord文件保存到HDFS中, 这里我们直接使用的是阿里云EMR(E-MapReduce)的HDFS服务。

创建EMR集群

阿里云 Elastic MapReduce(E-MapReduce) 是运行在阿里云平台上的一种大数据处理的系统解决方案。可以通过访问EMR介绍了解其中细节。

具体EMR集群创建过程,可以参考文档,创建过程中,请选择VPC下的EMR,请留意EMR对应的安全组名。

创建容器集群,并且打通两个集群间的网络。

在 同一个VPC 下创建GPU容器集群后,登录到EMR集群对应的安全组,点击管理实例将容器集群的节点添加进来。

为什么要使用TFRecord

TFRecord是TensorFlow内定的统一标准数据格式,可以支持多线程数据读取,并且可以通过batch size和epoch参数来控制训练时单次batch的大小和样本文件迭次数,同时能更好的利用内存和方便数据的复制和移动,所以是利用TensorFlow进行大规模深度学习训练的首选。

TFRecord生成程序示例

这段缩减的代码将MNIST数据集中所有的训练数据存储到一个TFRecord文件中,并且保存到EMR的HDFS中:hdfs://192.168.100.206:9000/mnist/output.tfrecords192.168.100.206是EMR的Master IP地址,9000是HDFS NameNode的端口。完整代码的地址是https://github.com/cheyang/mnist-examples/blob/master/convert_to_records.py

# 定义函数转化变量类型。
def _int64_feature(value):
    return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))

def _bytes_feature(value):
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))

# 读取mnist数据。
mnist = input_data.read_data_sets("./MNIST_data",dtype=tf.uint8, one_hot=True)
images = mnist.train.images
labels = mnist.train.labels
pixels = images.shape[1]
num_examples = mnist.train.num_examples

# 保存TFRecord到HDFS。
filename = "hdfs://192.168.100.206:9000/mnist/output.tfrecords"
writer = tf.python_io.TFRecordWriter(filename)
for index in range(num_examples):
    image_raw = images[index].tostring()

    example = tf.train.Example(features=tf.train.Features(feature={
        'pixels': _int64_feature(pixels),
        'label': _int64_feature(np.argmax(labels[index])),
        'image_raw': _bytes_feature(image_raw)
    }))
    writer.write(example.SerializeToString())
writer.close()

注意:TensoFlow虽然支持HDFS,但是需要额外的配置,否则直接调用会报Environment variable HADOOP_HDFS_HOME not set。如果在容器服务的深度学习解决方案中,您就无需为此劳心。

生成TFRecord数据

可以利用模型训练服务提供运行环境执行convert_to_records.py, 生成TFRecord数据,保存到HDFS中

这样,就可以看到一个表单。首先通过下拉框选择刚才创建的集群名称,点击训练框架 ,这时可以看到一系列深度学习框架的列表,其中包括TensorFlow, Keras和MXNet的不同版本, 还可以指定python2和python3的版本,这里选择tensorflow:1.0.0,并且配置其他选项,点击确定

以下为具体配置:

运行成功后,可以查看执行的日志, 显示TFRecord文件已经保存到了HDFS

登录到EMR机器上查看产生的TFRecord文件

# hdfs dfs -ls /mnist-tfrecord
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/apps/hadoop-2.7.2/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apps/tez-0.8.4/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Found 3 items
-rw-r--r--   3 root hadoop    8910000 2017-05-23 19:34 /mnist-tfrecord/test.tfrecords
-rw-r--r--   3 root hadoop   49005000 2017-05-23 19:33 /mnist-tfrecord/train.tfrecords
-rw-r--r--   3 root hadoop    4455000 2017-05-23 19:33 /mnist-tfrecord/validation.tfrecords

总结

数据准备是深度学习中非常重要的一环,而TensorFlow通过与Hadoop/Spark生态的集成,打通了大数据和深度学习之间关联。在阿里云的深度学习解决方案里,你能够很方便的使用OSS,NAS和HDFS等分布式存储保存和管理数据和模型。我们将在下一篇文章中向您介绍如何利用阿里云容器服务的深度学习解决方案在HDFS中加载TFRecord进行模型训练并保存Check point以及模型。

欢迎扫码加入钉钉群一起讨论:

code_1.jpg

本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至[email protected]

猜你喜欢

转载自1369049491.iteye.com/blog/2376092
今日推荐