Tensorflow变换:如何在整个数据集中查找变量的均值

时间:2019-07-03 23:59:19

标签: python tensorflow

我经常在许多Tensorflow tutorials中看到以下文字:

  

要执行此计算,您需要列均值。你显然会   需要在现实生活中进行计算,但是对于本示例,我们将   提供它们。

对于中小型CSV数据集,计算平均值就像在数据帧上使用pandas方法或使用`scikit-learn

一样容易

但是,如果我们有大型数据集,比如说一个50GB的CSV文件,那么您如何计算均值或其他类似的统计数据。 Tensorflow Transform声称它可以计算全局摘要统计信息,但是他们并没有真正解释其工作原理或如何将其集成到工作流程中。

这是他们的getting started guide中的代码示例。

import tensorflow as tf
import tensorflow_transform as tft

def preprocessing_fn(inputs):
  x = inputs['x']
  y = inputs['y']
  s = inputs['s']
  x_centered = x - tft.mean(x)
  y_normalized = tft.scale_to_0_1(y)
  s_integerized = tft.compute_and_apply_vocabulary(s)
  x_centered_times_y_normalized = x_centered * y_normalized
  return {
      'x_centered': x_centered,
      'y_normalized': y_normalized,
      'x_centered_times_y_normalized': x_centered_times_y_normalized,
      's_integerized': s_integerized
  }

文档说此代码将在整个数据集上运行tft.mean(x),但是由于x仅限于批处理范围,因此尚不清楚如何执行?但是,这里是文档中的声明。

  

虽然在上面的示例中不明显,但用户定义了预处理   函数传递张量代表批次而不是单个   实例,例如在训练和使用TensorFlow服务期间发生的情况。上   另一方面,分析仪在整个范围内执行计算   返回单个值而不是一批值的数据集。 x是一个   张量为(batch_size,)的张量,而tft.mean(x)是张量   形状为()。

所以问题是

  1. tft.mean()是否首先在整个数据集中运行,并且只有在计算了全局均值之后才开始加载批次?

  2. 是否有在工作流程中使用tft.transforms的更详细或完整的示例?这些转换可以像在preprocessing调用中包含在单个批处理tf.data.Dataset.map()函数中一样吗?或者如何?

因此,如果我尝试编写一些代码来计算我的张量流数据集中个体的平均age。这是我到目前为止的代码。这是做这样的事情的最好方法,还是有更好的方法?

我使用了tensorflow-2.0 make_csv_dataset(),它负责将示例从CSV文件堆叠到列结构中。注意我从上面链接中引用的tensorflow网站上的新教程中获取了make_csv_dataset()的代码。

  dataset = tf.data.experimental.make_csv_dataset(
      file_path,
      batch_size=32, 
      label_name=LABEL_COLUMN,
      na_value="?",
      num_epochs=1,
      ignore_errors=True)

 ds_iter = dataset.make_one_shot_iterator()

 list_of_batch_means = []

 for ex_features, ex_labels in ds_iter:
    batch_length = len(ex_features)
    batch_sum = tf.reduce_sum(ex_features['age'])
    list_of_batch_means.append(batch_sum/len(ex_features)

 average_age = np.mean(list_of_batch_means)

需要说明的是,由于最终批次的大小不一定与其他批次相同,因此我将batch_sum/len(ex_features)进行了划分,因此我手动进行了计算,而不是使用tf.reduce_mean()。这可能是一个小批量,如果您有很多批次,但只是想尽可能准确。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

tf.transform最重要的概念是预处理功能。预处理功能是数据集转换的逻辑描述。预处理函数接受并返回张量字典。有两种用于定义预处理功能的函数(步骤):

  1. 分析步骤
  2. 转换步骤

分析步骤:遍历整个数据集并创建图形。因此,例如,为了计算均值,我们传递完整的数据集以计算该数据集特定列的平均值(此步骤需要数据集的完整传递)

转换步骤:它基本上使用在分析步骤中创建的图形并转换整个数据集。

因此,基本上,在分析步骤中计算出的常数用于“变换”步骤。

为了更好地理解,您实际上可以先阅读此video,然后再阅读此presentation,这可以巩固您对Tensorflow Transform内部工作方式的理解。

如果您认为答案有帮助,请投票。谢谢!