繁体   English   中英

使用 TF 2.0 为 Tensorflow/Keras model 提供嵌入层问题

[英]Issue with embedding layer when serving a Tensorflow/Keras model with TF 2.0

我按照TF 初学者教程之一中的步骤创建了一个简单的分类 model。 它们是:

from __future__ import absolute_import, division, print_function, unicode_literals
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import feature_column
from tensorflow.keras import layers
from sklearn.model_selection import train_test_split

URL = 'https://storage.googleapis.com/applied-dl/heart.csv'
dataframe = pd.read_csv(URL)
dataframe.head()

train, test = train_test_split(dataframe, test_size=0.2)
train, val = train_test_split(train, test_size=0.2)

def df_to_dataset(dataframe, shuffle=True, batch_size=32):
  dataframe = dataframe.copy()
  labels = dataframe.pop('target')
  ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
  if shuffle:
    ds = ds.shuffle(buffer_size=len(dataframe))
  ds = ds.batch(batch_size)
  return ds

batch_size = 5 # A small batch sized is used for demonstration purposes
train_ds = df_to_dataset(train, batch_size=batch_size)
val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)
test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)

feature_columns = []
for header in ['age', 'trestbps', 'chol', 'thalach', 'oldpeak', 'slope', 'ca']:
  feature_columns.append(feature_column.numeric_column(header))
thal_embedding = feature_column.embedding_column(thal, dimension=8)
feature_columns.append(thal_embedding)

feature_layer = tf.keras.layers.DenseFeatures(feature_columns)

batch_size = 32
train_ds = df_to_dataset(train, batch_size=batch_size)
val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)
test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)


model = tf.keras.Sequential([
  feature_layer,
  layers.Dense(128, activation='relu'),
  layers.Dense(128, activation='relu'),
  layers.Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'],
              run_eagerly=True)

model.fit(train_ds,
          validation_data=val_ds,
          epochs=5)

我保存了 model :

model.save("model/", save_format='tf')

然后,我尝试使用这个TF 教程来服务这个 model。 我执行以下操作:

docker pull tensorflow/serving
docker run -p 8501:8501 --mount type=bind,source=/path/to/model/,target=/models/model -e MODEL_NAME=mo

我尝试以这种方式调用 model:

curl -d '{"inputs": {"age": [0], "trestbps": [0], "chol": [0], "thalach": [0], "oldpeak": [0], "slope": [1], "ca": [0], "exang": [0], "restecg": [0], "fbs": [0], "cp": [0], "sex": [0], "thal": ["normal"], "target": [0] }}' -X POST http://localhost:8501/v1/models/model:predict

我收到以下错误:

{ "error": "indices = 1 is not in [0, 1)\n\t [[{{node StatefulPartitionedCall_51/StatefulPartitionedCall/sequential/dense_features/thal_embedding/thal_embedding_weights/GatherV2}}]]" }

它似乎与“thal”功能的嵌入层有关。 但我不知道“indices = 1 is not in [0, 1)”是什么意思以及为什么会发生。

发生错误时,TF docker 服务器记录的内容如下:

2019-09-23 12:50:43.921721:W external/org_tensorflow/tensorflow/core/framework/op_kernel.cc:1502] OP_REQUIRES 在lookup_table_op.cc:952 失败:前提条件失败:表已初始化。

知道错误来自哪里以及如何解决它吗?

Python 版本:3.6

tensorflow 版本:2.0.0-rc0

最新的 TensorFlow/serving(截至 20/09/2019)

Model 签名:

signature_def['__saved_model_init_op']:
  The given SavedModel SignatureDef contains the following input(s):
  The given SavedModel SignatureDef contains the following output(s):
    outputs['__saved_model_init_op'] tensor_info:
        dtype: DT_INVALID
        shape: unknown_rank
        name: NoOp
  Method name is: 

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['age'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 1)
        name: serving_default_age:0
    inputs['ca'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 1)
        name: serving_default_ca:0
    inputs['chol'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 1)
        name: serving_default_chol:0
    inputs['cp'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 1)
        name: serving_default_cp:0
    inputs['exang'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 1)
        name: serving_default_exang:0
    inputs['fbs'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 1)
        name: serving_default_fbs:0
    inputs['oldpeak'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: serving_default_oldpeak:0
    inputs['restecg'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 1)
        name: serving_default_restecg:0
    inputs['sex'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 1)
        name: serving_default_sex:0
    inputs['slope'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 1)
        name: serving_default_slope:0
    inputs['thal'] tensor_info:
        dtype: DT_STRING
        shape: (-1, 1)
        name: serving_default_thal:0
    inputs['thalach'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 1)
        name: serving_default_thalach:0
    inputs['trestbps'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 1)
        name: serving_default_trestbps:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['output_1'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: StatefulPartitionedCall:0
  Method name is: tensorflow/serving/predict

我也在尝试提供一个包含嵌入层、lstm 层等的 model,但我收到了一些其他错误。 我什至提出了一个关于 TF 的问题

无论如何,我在您的代码中看到的问题是您用于与 Docker 一起服务的已保存 model 的类型。 如果您在这里阅读,它会说以下几点-

to serve A SavedModel

which is not the keras model.save but is another TF API, here is the way describing to create SavedModel from keras trained model. 试一试,让我们知道结果。

问题似乎与您发送的格式有关。您可以发布 model 的签名吗? 由于声誉低,无法将其发布为评论。

我遇到了同样的问题。 更改为以下格式。

curl -d '{"inputs": {"age": [[0]], "trestbps": [[0]], "chol": [[0]], "thalach": [[0]], "oldpeak": [[0]], "slope": [[1]], "ca": [[0]], "exang": [[0]], "restecg": [[0]], "fbs": [[0]], "cp": [[0]], "sex": [[0]], "thal": [["normal"]], "target": [[0]] }}' -X POST http://localhost:8501/v1/models/model:predict

注:全部改为[["normal"]]或[[0]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM