tensorflow数据集和估算器

  • 数据集:一种创建输入管道(即,将数据读入您的程序)的全新方式
  • 估算器:一种创建tensorflow模型的高级方式。估算器包括适用于常见机器学习任务的预制模型,不过,您也可以使用它们创建自己的自定义模型。
    下面是它们在tensorflow架构内的转配方式。

1.数据集介绍

数据集是一种我tensorflow模型创建输入管道的新方式。使用此API的性能要比使用feed_dict或队列式管道的性能高得多,而且此API更简洁,使用起来更容易。数据集在1.3版本中位于tf.contrib.data中,预计会在1.4版本中将此API移动到核心中。

从高层次而言,数据集由以下类组成:

tensorflow1 上采样_tensorflow1 上采样


其中:

  • 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

现在有了一个可以开始训练的估算器。