0

我在 GCP AI Platform 上部署了一个 tensorflow 模型。该模型预测文本是讽刺(1)还是非讽刺(0)。

一个文本(使用给定的函数“ tokenize_text ”)表示为两个张量。这可能看起来像这样:

text = tokenize_text('This is a text')
print(text)


>>> <tf.Tensor: shape=(1, 512), dtype=int32, numpy=
array([[  101, 71284, 92947, 11962, 10168, 12830,   102,     0,...]],
array([[1, 1, 1, 1, 1, 1, 1, 0, 0, ...]]>

此外

model.predict(text)    #result: not sarcasm (4%)


>>> array([[0.04065517]], dtype=float32)

现在我想在同一个模型上但在 GCP AI 平台上做同样的事情。因此,输入(“ text ”)将被包裹在 JSON 中,因为该模型仅适用于 JSON 文件。但我收到以下错误:

TypeError:EagerTensor 类型的对象不是 JSON 可序列化的

我知道张量不能直接转换为 JSON。但是,在部署到 GCP 之前,我只使用张量进行预测。

你有什么想法/方法吗?

4

1 回答 1

0

我找到了解决这个问题的方法。如果您使用张量为您的模型进行预测,只需在训练之前命名您的模型输入。

例如:

 # First tensor 
 tf.keras.layers.Input(shape (max_length,),name='input_ids',dtype='int32')
 
 # Second Tensor
 tf.keras.layers.Input(shape (max_length,),name='attention_mask',dtype='int32')

现在我的两个张量需要命名为“input_ids”和“attention_mask”。如果您使用多个张量,命名张量是有意义的。例如,BERT 模型使用至少两个张量来表示文本。在 GCP Ai 平台中保存和部署您的模型。

现在你可以预测了。首先将您的张量更改为列表并将它们命名为 json 文件,如下所示:

instances = [{
      'input_ids': [int(v.numpy()) for v in list(text[0][0])],
      'attention_mask': [int(v.numpy()) for v in list(text[1][0])]}]

print({'instances': instances})

您的 json 文件应如下所示(对不起格式):

{
    'instances': [{'input_ids':[101,10216,10339,10299,58606,102,0,0,0,0],
                   'attention_mask': [1, 1, 1, 1, 1, 1, 0, 0, 0, 0]}]
}

您可以根据该输出直接测试您的模型,或使用示例函数来自动化您的请求,该请求已由 Google Ai 平台提供。为此,转到您的模型和相应的版本,然后转到测试和应用程序。现在单击使用提供的模型

如果有人遇到与我相同的问题,希望这会有所帮助。

于 2021-09-05T16:32:20.593 回答