tensorflow数据集和估算器
- 数据集:一种创建输入管道(即,将数据读入您的程序)的全新方式
- 估算器:一种创建tensorflow模型的高级方式。估算器包括适用于常见机器学习任务的预制模型,不过,您也可以使用它们创建自己的自定义模型。
下面是它们在tensorflow架构内的转配方式。
1.数据集介绍
数据集是一种我tensorflow模型创建输入管道的新方式。使用此API的性能要比使用feed_dict或队列式管道的性能高得多,而且此API更简洁,使用起来更容易。数据集在1.3版本中位于tf.contrib.data中,预计会在1.4版本中将此API移动到核心中。
从高层次而言,数据集由以下类组成:
其中:
- Dataset:基类,包括用于创建和转换数据集的函数。允许从内存中的数据或从python生成器初始化数据集。
- TextLineDataset:从文本文件中读取各行内容。
- TFRecordDataset:从TFRecord文件中读取记录。
- FixedLengthRecordDataset:从二进制文件中读取固定大小的记录。
- Iterator:提供了一种一次获取一个数据集元素的方法。
在训练模型时,需要一个可以读取输入文件并返回特征和标签数据的函数。估算器要求您创建一个具有以下格式的函数:
def input_fn():
...<code>...
return ({'SepalLength':[values], ..<etc>..,'PetalWidth':[values]},[IrisFlowerType])
#返回一个表示特征的字典列表和表示标签的列表
返回值必须是一个按照如下方式组织的两元素元组:
- 第一个元素必须是一个字典(其中的每一个输入特征都是一个键)
- 第二个元素是一个用于训练批次的标签列表
下面是使用Dataset API实现此函数的方式。我们会将它包装到一个“输入函数(my_input_fn)”中,这个输入函数用于为估算器模型提供数据:
def my_input_fn(file_path, perform_shuffle=False, repeat_count=1):
def decode_csv(line):
parsed_line = tf.decode_csv(line, [[0.], [0.], [0.], [0.], [0]])
label = parsed_line[-1:] # Last element is the label
del parsed_line[-1] # Delete last element
features = parsed_line # Everything (but last element) are the features
d = dict(zip(feature_names, features)), label
return d
dataset = (tf.contrib.data.TextLineDataset(file_path) # Read text file
.skip(1) # Skip header row
.map(decode_csv)) # Transform each elem by applying decode_csv fn
if perform_shuffle:
# Randomizes input using a window of 256 elements (read into memory)
dataset = dataset.shuffle(buffer_size=256)
dataset = dataset.repeat(repeat_count) # Repeats dataset this # times
dataset = dataset.batch(32) # Batch size to use
iterator = dataset.make_one_shot_iterator()
batch_features, batch_labels = iterator.get_next()
return batch_features, batch_labels
- TextLineDataset:在您使用Dataset API的文件式数据集时,它将为您执行大量的内存管理工作。例如,你可以读入比内存大得多的数据集文件,或者以参数形式指定列表,读入多个文件。
- shuffle:读取buffer_size记录,然后打乱(随机化)它们的顺序。
- map:调用decode_csv函数,并将数据集中的每个元素作为一个参数(由于我们使用的是TextLineDataset,每个元素都将是一行CSV文本)。然后,我们将向每一行应用decode_csv。
- decode_csv:将每一行拆分成各个字段,根据需要提供默认值。然后,返回一个包含字段键和字段值的字典。map函数将使用字典更新数据集中的每个元素(行)。
2.估算器介绍
估算器是一种高级API,使用这种API,您在训练tensorflow模型时就不在像之前那样需要编写大量的样板文件代码。估算器也非常灵活,如果你对模型有具体的要求,它允许你替换默认行为。
使用估算器,可以通过两种可能的方式构建模型:
- Pre-made Estimators(预制估算器):这些是预先定义的估算器,旨在生成特定类型的模型。
- Estimator(基类):允许你使用model_fn函数完全掌控模型的创建方式。
所有的估算器都使用input_fn,它为估算器提供输入数据。
下面的代码可以将预测鸢尾花类型的估算器实例化:
# Create the feature_columns, which specifies the input to our model.
# All our input features are numeric, so use numeric_column for each one.
feature_columns = [tf.feature_column.numeric_column(k) for k in feature_names]
# Create a deep neural network regression classifier.
# Use the DNNClassifier pre-made estimator
classifier = tf.estimator.DNNClassifier(
feature_columns=feature_columns, # The input features to our model
hidden_units=[10, 10], # Two layers, each with 10 neurons
n_classes=3,
model_dir=PATH) # Path to where checkpoints etc are stored
现在有了一个可以开始训练的估算器。