我经常在许多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)是张量 形状为()。
所以问题是
tft.mean()
是否首先在整个数据集中运行,并且只有在计算了全局均值之后才开始加载批次?
是否有在工作流程中使用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()
。这可能是一个小批量,如果您有很多批次,但只是想尽可能准确。
任何建议将不胜感激。
答案 0 :(得分:2)
tf.transform最重要的概念是预处理功能。预处理功能是数据集转换的逻辑描述。预处理函数接受并返回张量字典。有两种用于定义预处理功能的函数(步骤):
分析步骤:遍历整个数据集并创建图形。因此,例如,为了计算均值,我们传递完整的数据集以计算该数据集特定列的平均值(此步骤需要数据集的完整传递)
转换步骤:它基本上使用在分析步骤中创建的图形并转换整个数据集。
因此,基本上,在分析步骤中计算出的常数用于“变换”步骤。
为了更好地理解,您实际上可以先阅读此video,然后再阅读此presentation,这可以巩固您对Tensorflow Transform内部工作方式的理解。
如果您认为答案有帮助,请投票。谢谢!