简化TensorFlow工作流。
laminarflow的Python项目详细描述
层流
简化TensorFlow工作流。
安装
pip install laminarflow
用法
tfrecord数据集
层流有两个类用于写入和读取tfrecord数据集,DatasetWriter
和DatasetReader
。
使用DatasetWriter
创建数据集时,可以传入原始python或numpy数据,它将自动转换为tensorflow示例或sequenceexamples并写入tfrecord文件。
然后,当从tfrecord文件中读取时,DatasetReader
负责创建输入管道,该管道将解析存储的示例或序列示例,根据需要准备它们(批处理、填充、洗牌等),然后将它们传递给tensorflow估计器,实现tensorflow的Input Pipline Performance Guide中概述的推荐最佳实践。
为了演示,我们将创建一些数据集。
importlaminarflowaslftrain_writer=lf.DatasetWriter('data/train.tfrecord')test_writer=lf.DatasetWriter('data/test.tfrecord')train_writer.write({'input':[3.1,4.1,5.9],'label':2})train_writer.write({'input':[2.7,1.8,2.8],'label':1})test_writer.write({'input':[0.1,1.2,3.5],'label':8})train_writer.close()test_writer.close()
我们创建一个DatasetWriter
,然后对要添加到数据集的每个tensorflow示例或sequenceexample调用其上的write
方法。当我们调用write
方法时,我们传入一个字典,其中键是特征名,值是特征值。这些值可以是numpy数组,也可以是可以转换为numpy数组的任何值,例如python int、float或int或float列表。值的形状可以是多维的,但示例之间必须相同。下面讨论创建支持可变长度数据的sequenceexamples。
当我们用writer编写完数据后,我们会在上面调用close()
方法。
数据将写入tfrecord文件,功能的形状和数据类型将存储在单独的元数据json文件中,该文件与tfrecord文件具有相同的文件名,但扩展名将更改为“.json”。
data/
├── test.json
├── test.tfrecord
├── train.json
└── train.tfrecord
然后我们可以在我们的数据集上训练一个模型。
train_dataset=lf.DatasetReader('data/train.tfrecord')test_dataset=lf.DatasetReader('data/test.tfrecord')estimator=tf.estimator.Estimator(model_fn=model_fn,model_dir=MODEL_DIR,params=PARAMS)train_spec=tf.estimator.TrainSpec(input_fn=train_dataset.input_fn,max_steps=1000)eval_spec=tf.estimator.EvalSpec(input_fn=test_dataset.input_fn)tf.estimator.train_and_evaluate(estimator=estimator,train_spec=train_spec,eval_spec=eval_spec)
调用lf.DatasetReader('data/train.tfrecord')
将使用tfrecord文件及其相应的元数据json文件创建一个数据集。元数据json文件data/train.json
的路径是从tfrecord路径推断出来的。
创建的数据集有一个input_fn
方法,您可以将其作为输入函数传递给tensorflow估计器。input_fn
方法自动为数据集创建输入管道。
有关创建数据集、训练模型和使用该模型进行预测的更完整示例,请查看:xor.py
使用with
语句
也可以使用with
语句创建DatasetWriter
,在这种情况下,不需要调用close()
方法。
withlf.DatasetWriter('data/train.tfrecord')astrain_writer:train_writer.write({'input':[1.4,1.4,2.1],'label':3})
序列示例
write
方法的默认行为是编写tensorflow示例。要编写SequenceExample,请使用context_features
和sequence_features
参数传入特性,而不是将特性传递给write
方法的第一个参数。
train_writer.write(context_features={'category':7},sequence_features={'inputs':[[1.4,0.0],[1.4,0.0],[1.4,0.0]],'labels':[3,5,3]})train_writer.write(context_features={'category':5},sequence_features={'inputs':[[1.4,0.0],[1.4,0.0]],'labels':[3,5]})
传入context_features
是可选的,但是如果使用,它们的值在sequenceexamples之间必须具有相同的形状,类似于example特性。
sequence_features
值的形状必须具有至少1的秩。对于SequenceExample中的所有sequence_features
,第一个维度的长度必须相同,但SequenceExample之间的长度可以不同。其余维度的长度可以在不同的特征之间变化,但在SequenceExamples之间必须相同。
创建一批SequenceExamples时,任何短于最长序列的序列都将填充零。
从数据集读取时,每个序列的长度将作为输入管道中的一个步骤从数据中提取。序列的长度将作为传递到模型features['lengths']
的特征值之一提供。它将是一个int的批大小长度列表,即在可能用零填充该序列之前批中每个序列的长度。