3.3 TensorFlow Estimator

TensorFlow将Estimator作为高阶API,以提供可扩展且面向产品的解决方案。它们负责所有的幕后活动,例如创建计算图、初始化变量、训练模型、保存检查点和记录TensorBoard文件。TensorFlow提供两种类型的估算器:

  • Canned Estimator:TensorFlow估算器模块中提供的预制Estimator。这些是装在盒子里的模型,你只需将输入特征传递给它们即可使用。示例有线性分类器、线性回归器、DNN分类器等。
  • Custom Estimator(自定义估算器):用户还可以根据在TensorFlow Keras中构建的模型创建自己的估算器。这些是用户定义的Estimator。

在使用TensorFlow Estimator之前,让我们了解估算器流水线的两个重要组件:特征列与输入函数

3.3.1 特征列

TensorFlow 2.0的feature_column模块充当输入数据和模型之间的桥梁。用于估算器训练的输入参数作为特征列传递。它们在TensorFlow feature_column中定义,并指定模型如何解析数据。为了创建特征列,我们需要从tensorflow.feature_columns调用函数。特征列提供了9种函数:

  • categorical_column_with_identity:每个类目都是One-Hot(独热)编码的,因此具有唯一标识。它只适用于数字值。
  • categorical_column_with_vocabulary_file:当分类输入是字符串且类目在文件中给出时,使用此函数。字符串首先会转换为数字值,然后进行One-Hot编码。
  • categorical_column_with_vocabulary_list:当分类输入是字符串且类目在列表中明确定义时,使用此函数。字符串首先会转换为数字值,然后进行One-Hot编码。
  • categorical_column_with_hash_bucket:如果类目的数量非常大,且不可能进行One-Hot编码时,我们使用哈希。
  • crossed_column:当我们希望将两列合并成单个特征来使用时,使用此函数。例如,对基于地理位置的数据,将经度值和纬度值合并为一项特征是合理的。
  • numeric_column:当特征为数字时使用,它可以是单个值,甚至是矩阵。
  • indicator_column:我们不直接使用它。当且仅当类目数量有限并可由One-Hot编码表示时,将其与分类列一起使用。
  • embedding_column:我们不直接使用它。当且仅当类目数量非常大且不能由One-Hot编码表示时,将其与分类列一起使用。
  • bucketized_column:当我们根据数据本身的值(而不是特定的数值)将数据划分为不同的类别时,使用此函数。

前6个函数继承自Categorical Column类,后3个函数继承自Dense Column类,最后一个函数同时继承自这两个类。在以下示例中,我们将使用numeric_columncategorical_column_ with_vocabulary_list函数。

3.3.2 输入函数

用于训练、评估和预测的数据需要由输入函数提供。输入函数返回一个tf.data.Dataset对象,该对象返回一个包含特征和标签的元组。

3.3.3 使用TensorFlow Estimator API的MNIST

让我们用一个简单的数据集构建一个简单的TensorFlow估计器,以解决多元回归问题。继续刚才的房屋价格预测问题,但现在有了两个特征,即有两个自变量:房屋面积及其类型(平房或公寓):

1)导入必要的模块。我们需要TensorFlow及其feature_column模块。由于我们的数据集同时包含数字数据和分类数据,因此需要使用函数来处理这两种类型的数据:

092-01

2)定义将用于训练回归器的特征列。正如我们提到的那样,数据集包含两个特征:area表示房屋面积的数字值;type表示房屋是“平房”还是“公寓”:

093-01

3)定义一个输入函数以提供训练的输入。该函数返回一个包含特征和标签的元组:

093-02

4)使用预制的LinearRegressor估计器,并用训练数据集对其进行拟合:

093-03

5)现在估计器已经训练过,让我们看看预测的结果:

093-04

6)结果:

093-05