【问题标题】:TF2 Keras - Feature Engineering in Keras saved model via Tensorflow ServingTF2 Keras - Keras 中的特征工程通过 Tensorflow Serving 保存模型
【发布时间】:2023-03-15 18:12:01
【问题描述】:

基于 Keras 模型的预处理/特征工程的 Tensorflow 2 文档似乎很混乱,而且不是很友好。

目前我有一个简单的 Keras N 层模型,其中 TF 特征列作为密集层提供。对于培训,我使用tf.dataset API 读取了 CSV 文件,并且我编写了一个特征工程函数,该函数使用 dataset.map 函数创建新特征。

def feature_engg_features(features):
  #Add new features
  features['nodlgrbyvpatd'] = features['NODLGR'] / features['VPATD']

  return(features)

我可以使用tf.keras.models.save_model 方法轻松保存模型。但是,我无法弄清楚如何在服务函数中附加 feature_engineering 步骤。

要求:现在我想采用上述相同的特征工程功能并将其附加到我的serving function,以便在通过tensorflow_model_server 的 JSON 输入中应用相同的特征工程步骤。我知道 Keras 中的 lambda 层选项,但我想通过 saved_model 方法来执行此操作,但这里有很多困难。

例如,下面的代码给出错误:

def feature_engg_features(features):
  #Add new features
  features['nodlgrbyvpatd'] = features['NODLGR'] / features['VPATD']
  return(features)

@tf.function
def serving(data):
    data = tf.map_fn(feature_engg_features, data, dtype=tf.float32)

    # Predict
    predictions = m_(data)

version = "1"
tf.keras.models.save_model(
    m_,
    "./exported_model/" + version,
    overwrite=True,
    include_optimizer=True,
    save_format=None,
    signatures=serving,
    options=None
)

错误:

Only `tf.functions` with an input signature or concrete functions can be used as a signature.

上述错误是因为我没有提供我的 Keras 模型的 InputSignature,但我无法理解我有 13 个输入字段,这是预期的输入签名。

所以我想知道是否有人知道解决此问题的最短方法。这是一个非常基本的要求,Tensorflow 似乎让 Keras Tensorflow 模型服务变得相当复杂。

GIST:https://colab.research.google.com/gist/rafiqhasan/6abe93ac454e942317005febef59a459/copy-of-dl-e2e-structured-mixed-data-tf-2-keras-estimator.ipynb

编辑: 我修复了它,因此必须为每个特征生成和传递 TensorSpec,并且必须在服务函数中调用 model()。

@tf.function
def serving(WERKS, DIFGRIRD, SCENARIO, TOTIRQTY, VSTATU, EKGRP, TOTGRQTY, VPATD, EKORG, NODLGR, DIFGRIRV, NODLIR, KTOKK):
    ##Feature engineering
    nodlgrbyvpatd = tf.cast(NODLGR / VPATD, tf.float32)

    payload = {
        'WERKS': WERKS,
        'DIFGRIRD': DIFGRIRD,
        'SCENARIO': SCENARIO,
        'TOTIRQTY': TOTIRQTY,
        'VSTATU': VSTATU,
        'EKGRP': EKGRP,
        'TOTGRQTY': TOTGRQTY,
        'VPATD': VPATD,
        'EKORG': EKORG,
        'NODLGR': NODLGR,
        'DIFGRIRV': DIFGRIRV,
        'NODLIR': NODLIR,
        'KTOKK': KTOKK,
        'nodlgrbyvpatd': nodlgrbyvpatd,        
    }

    ## Predict
    ##IF THERE IS AN ERROR IN NUMBER OF PARAMS PASSED HERE OR DATA TYPE THEN IT GIVES ERROR, "COULDN'T COMPUTE OUTPUT TENSOR"
    predictions = m_(payload)
    return predictions

serving = serving.get_concrete_function(WERKS=tf.TensorSpec([None,], dtype= tf.string, name='WERKS'), 
                                        DIFGRIRD=tf.TensorSpec([None,], name='DIFGRIRD'),
                                        SCENARIO=tf.TensorSpec([None,], dtype= tf.string, name='SCENARIO'), 
                                        TOTIRQTY=tf.TensorSpec([None,], name='TOTIRQTY'),
                                        VSTATU=tf.TensorSpec([None,], dtype= tf.string, name='VSTATU'), 
                                        EKGRP=tf.TensorSpec([None,], dtype= tf.string, name='EKGRP'),
                                        TOTGRQTY=tf.TensorSpec([None,], name='TOTGRQTY'), 
                                        VPATD=tf.TensorSpec([None,], name='VPATD'),
                                        EKORG=tf.TensorSpec([None,], dtype= tf.string, name='EKORG'), 
                                        NODLGR=tf.TensorSpec([None,], name='NODLGR'),
                                        DIFGRIRV=tf.TensorSpec([None,], name='DIFGRIRV'),
                                        NODLIR=tf.TensorSpec([None,], name='NODLIR'),
                                        KTOKK=tf.TensorSpec([None,], dtype= tf.string, name='KTOKK')
                                        )

version = "1"
tf.saved_model.save(
    m_,
    "./exported_model/" + version,
    signatures=serving
)

【问题讨论】:

    标签: tensorflow keras tensorflow2.0 tensorflow-serving feature-engineering


    【解决方案1】:

    所以正确的方法就在这里,特征工程和预处理可以通过下面的选项在serving_default 方法中完成。我通过 Tensorflow 服务对其进行了进一步测试。

    @tf.function
    def serving(WERKS, DIFGRIRD, SCENARIO, TOTIRQTY, VSTATU, EKGRP, TOTGRQTY, VPATD, EKORG, NODLGR, DIFGRIRV, NODLIR, KTOKK):
        ##Feature engineering
        nodlgrbyvpatd = tf.cast(NODLGR / VPATD, tf.float32)
    
        payload = {
            'WERKS': WERKS,
            'DIFGRIRD': DIFGRIRD,
            'SCENARIO': SCENARIO,
            'TOTIRQTY': TOTIRQTY,
            'VSTATU': VSTATU,
            'EKGRP': EKGRP,
            'TOTGRQTY': TOTGRQTY,
            'VPATD': VPATD,
            'EKORG': EKORG,
            'NODLGR': NODLGR,
            'DIFGRIRV': DIFGRIRV,
            'NODLIR': NODLIR,
            'KTOKK': KTOKK,
            'nodlgrbyvpatd': nodlgrbyvpatd,        
        }
    
        ## Predict
        ##IF THERE IS AN ERROR IN NUMBER OF PARAMS PASSED HERE OR DATA TYPE THEN IT GIVES ERROR, "COULDN'T COMPUTE OUTPUT TENSOR"
        predictions = m_(payload)
        return predictions
    
    serving = serving.get_concrete_function(WERKS=tf.TensorSpec([None,], dtype= tf.string, name='WERKS'), 
                                            DIFGRIRD=tf.TensorSpec([None,], name='DIFGRIRD'),
                                            SCENARIO=tf.TensorSpec([None,], dtype= tf.string, name='SCENARIO'), 
                                            TOTIRQTY=tf.TensorSpec([None,], name='TOTIRQTY'),
                                            VSTATU=tf.TensorSpec([None,], dtype= tf.string, name='VSTATU'), 
                                            EKGRP=tf.TensorSpec([None,], dtype= tf.string, name='EKGRP'),
                                            TOTGRQTY=tf.TensorSpec([None,], name='TOTGRQTY'), 
                                            VPATD=tf.TensorSpec([None,], name='VPATD'),
                                            EKORG=tf.TensorSpec([None,], dtype= tf.string, name='EKORG'), 
                                            NODLGR=tf.TensorSpec([None,], name='NODLGR'),
                                            DIFGRIRV=tf.TensorSpec([None,], name='DIFGRIRV'),
                                            NODLIR=tf.TensorSpec([None,], name='NODLIR'),
                                            KTOKK=tf.TensorSpec([None,], dtype= tf.string, name='KTOKK')
                                            )
    
    version = "1"
    tf.saved_model.save(
        m_,
        "./exported_model/" + version,
        signatures=serving
    )
    

    【讨论】:

      猜你喜欢
      • 2017-09-24
      • 2018-10-31
      • 1970-01-01
      • 2019-04-12
      • 2019-04-21
      • 1970-01-01
      • 2019-12-27
      • 2018-02-01
      • 2019-11-01
      相关资源
      最近更新 更多