- 深度学习实战:基于TensorFlow 2和Keras(原书第2版)
- (意)安东尼奥·古利 (印)阿米塔·卡普尔 (美)苏吉特·帕尔
- 1139字
- 2021-08-24 10:46:31
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_column
和categorical_column_ with_vocabulary_list
函数。
3.3.2 输入函数
用于训练、评估和预测的数据需要由输入函数提供。输入函数返回一个tf.data.Dataset
对象,该对象返回一个包含特征和标签的元组。
3.3.3 使用TensorFlow Estimator API的MNIST
让我们用一个简单的数据集构建一个简单的TensorFlow估计器,以解决多元回归问题。继续刚才的房屋价格预测问题,但现在有了两个特征,即有两个自变量:房屋面积及其类型(平房或公寓):
1)导入必要的模块。我们需要TensorFlow及其feature_column
模块。由于我们的数据集同时包含数字数据和分类数据,因此需要使用函数来处理这两种类型的数据:
2)定义将用于训练回归器的特征列。正如我们提到的那样,数据集包含两个特征:area
表示房屋面积的数字值;type
表示房屋是“平房”还是“公寓”:
3)定义一个输入函数以提供训练的输入。该函数返回一个包含特征和标签的元组:
4)使用预制的LinearRegressor
估计器,并用训练数据集对其进行拟合:
5)现在估计器已经训练过,让我们看看预测的结果:
6)结果: