Tensorflow 在SERVICE的Keras模型中包含波束预处理图

Tensorflow 在SERVICE的Keras模型中包含波束预处理图,tensorflow,keras,apache-beam,google-cloud-ml,Tensorflow,Keras,Apache Beam,Google Cloud Ml,简短问题: 由于Tensorflow正朝着Keras而远离估计器,我们如何将预处理管道(例如使用tf.Transform和build\u service\u input\u fn()(用于估计器)纳入我们的tf.Keras模型 根据我的理解,整合这个预处理图的唯一方法是首先使用Keras构建模型。训练它。然后使用tf.keras.estimator.model\u to\u estimator将其导出为估计器。然后创建一个服务输入\u fn并将估计器导出为一个保存的模型,连同此服务输入\u f

简短问题:

由于Tensorflow正朝着Keras而远离估计器,我们如何将预处理管道(例如使用
tf.Transform
build\u service\u input\u fn()
(用于估计器)纳入我们的
tf.Keras
模型


根据我的理解,整合这个预处理图的唯一方法是首先使用Keras构建模型。训练它。然后使用
tf.keras.estimator.model\u to\u estimator
将其导出为估计器。然后创建一个
服务输入\u fn
并将估计器导出为一个保存的模型,连同此
服务输入\u fn
一起在服务时使用

对我来说,这似乎很乏味,而且不是正确的做事方式。相反,我想直接从Keras转到保存的模型


问题 我希望能够在Keras保存的模型中包含APAHCE光束预处理图

我希望提供经过培训的Keras模型,因此我使用SavedModel导出它。给定一个经过训练的模型,我想应用以下逻辑来预测结果

raw_features = { 'feature_col_name': [100] } # features to transform
working_dir = 'gs://path_to_transform_fn' 

# transform features
transformed_features = tf_transform_output.transform_raw_features(raw_features)

model = load_model('model.h5')
model.predict(x=transformed_features)
当我定义模型时,我使用函数API,模型具有以下输入:

for i in numerical_features:
    num_inputs.append(tf.keras.layers.Input(shape=(1,), name=i))
这就是问题所在,因为张量不是从tf.Dataset直接输入到keras中的,而是使用
Input()
层链接的

当我使用
tf.contrib.saved\u model.save\u keras\u model(model=model,saved\u model\u path=saved\u model\u path)
导出模型时,如果我在单独的脚本中处理预处理,我可以很容易地提供预测。这个的输出看起来像

这是通常发生的情况吗?例如,我会将特征作为一些外部脚本的一部分进行预处理,然后将
转换的_特征
发送到模型进行预测

理想情况下,这一切都将发生在Keras模型/单个图形的一部分中。目前,我似乎正在使用一个图形的输出作为另一个图形的输入。相反,我希望能够使用单个图形

如果使用估计器,我们可以构建一个服务于输入的
,\u fn()
,它可以作为估计器的参数,这允许我们将预处理逻辑合并到图中

我也想听听你关于使用Cloud ML服务模型的Keras+SavedModel+预处理想法,这是Google Clouds机器学习的一种方式

使用他们的文档对UI进行测试和培训非常简单:

在本地开发并验证您的培训应用程序

在云中运行培训应用程序之前,先让它运行 在当地。本地环境提供了高效的开发和 验证工作流,以便您可以快速迭代。你也不会 调试应用程序时产生云资源费用 在当地。获取您的培训数据

相关数据文件成人.data和成人.test托管在 公共云存储桶。对于本示例,请使用 云存储上的版本经过了一些琐碎的清理, 而不是原始源数据。有关更多信息,请参见下文 关于数据

您可以直接从云存储读取数据文件或复制它们 到您当地的环境。就本样本而言,您将 下载用于本地培训的示例,然后将其上载到您的 拥有用于云培训的云存储桶。 将数据下载到文件夹:

然后,只需将TRAIN_数据和EVAL_数据变量设置为本地文件路径。例如,以下命令将变量设置为本地路径

TRAIN_DATA=$(pwd)/data/adult.data.csv
EVAL_DATA=$(pwd)/data/adult.test.csv
然后您有一个TSV文件,如下所示:

39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K
38, Private, 215646, HS-grad, 9, Divorced, Handlers-cleaners, Not-in-family, White, Male, 0, 0, 40, United-States, <=50K
53, Private, 234721, 11th, 7, Married-civ-spouse, Handlers-cleaners, Husband, Black, Male, 0, 0, 40, United-States, <=50K
更像你的问题所说:

开展培训工作

云机器学习引擎提供模型训练作为 异步(批处理)服务。本页介绍如何配置和 通过运行gcloud ml engine jobs submit training提交培训作业 从命令行或通过向API发送请求 项目。工作。创造。在你开始之前

在提交培训工作之前,您必须打包 应用程序,并将其和任何不寻常的依赖项上载到云 存储桶。注意:如果使用gcloud命令行工具 提交您的作业,您可以打包申请并在中提交作业 同样的步骤。配置作业

通过设置 作业资源的成员,其中包括 培训投入资源

如果您使用gcloud命令行工具提交培训作业, 你可以:

Specify the most common training parameters as flags of the gcloud ml-engine jobs submit training command.
Pass the remaining parameters in a YAML configuration file, named config.yaml by convention. The configuration file mirrors the
作业资源的JSON表示的结构。你通过考试 gcloud的--config标志中配置文件的路径 ml引擎作业提交训练命令。那么,如果你的 配置文件为config.yaml,必须设置--config=config.yaml

收集作业配置数据

以下属性用于定义作业

作业名称(作业ID) 作业使用的名称(仅限大小写混合字母、数字和下划线,以字母开头)。群集配置 (斯卡利蒂埃) 指定要在其上运行作业的处理群集类型的扩展层。这可以是自定义比例层,在这种情况下,您还可以 明确指定要使用的计算机的数量和类型。训练 应用程序包(PackageURI) 在云存储位置暂存的打包培训应用程序。如果您使用的是gcloud命令行工具,则 应用程序打包步骤基本上是自动化的。请参阅中的详细信息 打包应用程序的指南。模块名称(pythonModule) 包中主模块的名称。主模块是启动应用程序所调用的Python文件。如果你使用 gcloud命令要提交作业,请指定主
gcloud ml-engine local train \
    --module-name trainer.task \
    --package-path trainer/ \
    --job-dir $MODEL_DIR \
    -- \
    --train-files $TRAIN_DATA \
    --eval-files $EVAL_DATA \
    --train-steps 1000 \
    --eval-steps 100
Specify the most common training parameters as flags of the gcloud ml-engine jobs submit training command.
Pass the remaining parameters in a YAML configuration file, named config.yaml by convention. The configuration file mirrors the
The Cloud ML Engine version to use for the job. If you don't specify a runtime version, the training service uses the default Cloud
The Python version to use for the job. Python 3.5 is available with Cloud ML Engine runtime version 1.4 or greater. If you don't
With command-line flags.
In a YAML file representing the Job resource. You can name this file whatever you want. By convention the name is config.yaml.
Job configuration parameters. Cloud ML Engine needs these values to set up resources in the cloud and deploy your application on each
TRAINER_PACKAGE_PATH="/path/to/your/application/sources"
now=$(date +"%Y%m%d_%H%M%S")
JOB_NAME="your_name_$now"
MAIN_TRAINER_MODULE="trainer.task"
JOB_DIR="gs://your/chosen/job/output/path"
PACKAGE_STAGING_PATH="gs://your/chosen/staging/path"
REGION="us-east1"
RUNTIME_VERSION="1.13"
gcloud ml-engine jobs submit training $JOB_NAME \
        --scale-tier basic \
        --package-path $TRAINER_PACKAGE_PATH \
        --module-name $MAIN_TRAINER_MODULE \
        --job-dir $JOB_DIR \
        --region $REGION \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value
gcloud ml-engine jobs submit training $JOB_NAME \
        --package-path $TRAINER_PACKAGE_PATH \
        --module-name $MAIN_TRAINER_MODULE \
        --job-dir $JOB_DIR \
        --region $REGION \
        --config config.yaml \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value
If you specify an option both in your configuration file (config.yaml) and as a command-line flag, the value on the command