为 TFX 设计 TensorFlow 建模代码

在为 TFX 设计 TensorFlow 建模代码时,有一些事项需要注意,包括建模 API 的选择。

  • 使用:来自 Transform 的 SavedModel 和来自 ExampleGen 的数据
  • 发出:SavedModel 格式的训练模型
  • 新的 TFX 流水线应通过通用 Trainer 将 TensorFlow 2.x 与 Keras 模型一起使用。
  • 对 TensorFlow 2.X 的全面支持(包括对 tf.distribute 的改进支持)将在接下来的版本中逐步添加。
  • 之前的 TFX 流水线可以继续使用 TensorFlow 1.15。要将它们切换到 TensorFlow 2.X,请参阅 TensorFlow 迁移指南

要随时掌握 TFX 版本的最新消息,请参阅 TFX OSS 路线图,阅读 TFX 博客并订阅 TensorFlow 简报

您的模型的输入层应使用由 Transform 组件创建的 SavedModel,并且应将 Transform 模型的层包含在您的模型中,以便在导出 SavedModel 和 EvalSavedModel 时,它们将包含由 Transform 组件创建的转换。

TFX 的典型 TensorFlow 模型设计如下所示:

def _build_estimator(tf_transform_dir,                      config,                      hidden_units=None,                      warm_start_from=None):   """Build an estimator for predicting the tipping behavior of taxi riders.    Args:     tf_transform_dir: directory in which the tf-transform model was written       during the preprocessing step.     config: tf.contrib.learn.RunConfig defining the runtime environment for the       estimator (including model_dir).     hidden_units: [int], the layer sizes of the DNN (input layer first)     warm_start_from: Optional directory to warm start from.    Returns:     Resulting DNNLinearCombinedClassifier.   """   metadata_dir = os.path.join(tf_transform_dir,                               transform_fn_io.TRANSFORMED_METADATA_DIR)   transformed_metadata = metadata_io.read_metadata(metadata_dir)   transformed_feature_spec = transformed_metadata.schema.as_feature_spec()    transformed_feature_spec.pop(_transformed_name(_LABEL_KEY))    real_valued_columns = [       tf.feature_column.numeric_column(key, shape=())       for key in _transformed_names(_DENSE_FLOAT_FEATURE_KEYS)   ]   categorical_columns = [       tf.feature_column.categorical_column_with_identity(           key, num_buckets=_VOCAB_SIZE + _OOV_SIZE, default_value=0)       for key in _transformed_names(_VOCAB_FEATURE_KEYS)   ]   categorical_columns += [       tf.feature_column.categorical_column_with_identity(           key, num_buckets=_FEATURE_BUCKET_COUNT, default_value=0)       for key in _transformed_names(_BUCKET_FEATURE_KEYS)   ]   categorical_columns += [       tf.feature_column.categorical_column_with_identity(           key, num_buckets=num_buckets, default_value=0)       for key, num_buckets in zip(           _transformed_names(_CATEGORICAL_FEATURE_KEYS),  #           _MAX_CATEGORICAL_FEATURE_VALUES)   ]   return tf.estimator.DNNLinearCombinedClassifier(       config=config,       linear_feature_columns=categorical_columns,       dnn_feature_columns=real_valued_columns,       dnn_hidden_units=hidden_units or [100, 70, 50, 25],       warm_start_from=warm_start_from)