

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Object2Vec 算法
<a name="object2vec"></a>

Amazon SageMaker AI Object2Vec 算法是一种高度可定制的通用神经嵌入算法。它可以学习高维对象的低维密集嵌入。将以某种方式学习嵌入，以便在嵌入空间中保留原始空间中的对象对之间的关系语义。例如，您可以使用学到的嵌入有效地计算对象的最近邻点，以及可视化低维空间中的相关对象的自然聚类。您还可以将嵌入用作下游指导式任务中相应对象的功能，例如分类或回归。

Object2Vec 概括了众所周知的 Word2Vec 嵌入技术，用于在人工智能中优化的单词。 SageMaker [BlazingText 算法](blazingtext.md)有关讨论如何将 Object2Vec 应用于一些实际用例的博客文章，请参阅[亚马逊 A](https://aws.amazon.com/blogs/machine-learning/introduction-to-amazon-sagemaker-object2vec/) I Object2Vec 简介。 SageMaker 

**Topics**
+ [Object2Vec 算法的 I/O 接口](#object2vec-inputoutput)
+ [Object2Vec 算法的 EC2 实例建议](#object2vec--instances)
+ [Object2Vec 示例笔记本](#object2vec-sample-notebooks)
+ [Object2Vec 工作原理](object2vec-howitworks.md)
+ [Object2Vec 超参数](object2vec-hyperparameters.md)
+ [优化 Object2Vec 模型](object2vec-tuning.md)
+ [Object2Vec 训练的数据格式](object2vec-training-formats.md)
+ [用于 Object2Vec 推理的数据格式](object2vec-inference-formats.md)
+ [Object2Vec 的编码器嵌入](object2vec-encoder-embeddings.md)

## Object2Vec 算法的 I/O 接口
<a name="object2vec-inputoutput"></a>

您可以在很多输入数据类型上使用 Object2Vec，包括以下示例。


| 输入数据类型 | 示例 | 
| --- | --- | 
|  语句-语句对  | “A soccer game with multiple males playing.” 和“Some men are playing a sport.” | 
|  标签-序列对  | “Titanic”电影的流派标签（如“Romance”和“Drama”）及其简短描述“James Cameron's Titanic is an epic, action-packed romance set against the ill-fated maiden voyage of the R.M.S. Titanic. She was the most luxurious liner of her era, a ship of dreams, which ultimately carried over 1,500 people to their death in the ice cold waters of the North Atlantic in the early hours of April 15, 1912.” | 
|  客户-客户对  |  Jane 的客户 ID 和 Jackie 的客户 ID。  | 
|  产品-产品对  |  足球的产品 ID 和篮球的产品 ID。  | 
|  项审查用户-项对  |  用户的 ID 以及她购买的商品，例如苹果、梨和橙子。  | 

要将输入数据转换为支持的格式，必须对其进行预处理。目前，Object2Vec 本身支持两种类型的输入：
+ 离散标记，它表示为单个 `integer-id` 的列表。例如 `[10]`。
+ 离散标记序列，它表示为 `integer-ids` 列表。例如 `[0,12,10,13]`。

每个对中的对象可以是不对称的。例如，这些对可以是 (标记, 序列)、(标记, 标记) 或 (序列, 序列)。对于标记输入，该算法支持简单嵌入作为兼容编码器。对于标记向量序列，该算法支持以下编码器：
+  平均池化嵌入
+  分层卷积神经网络 ()CNNs，
+  多层双向长短期记忆 (Bi) LSTMs 

每个对的输入标签可以是以下内容之一：
+ 分类标签，表示对中的对象之间的关系 
+ 分数，表示两个对象之间的相似性强度 

对于分类中使用的分类标签，该算法支持交叉熵损失函数。对于回归中使用的基于评级/分数的标签，该算法支持均方误差 (MSE) 损失函数。在创建模型训练作业时，请使用 `output_layer` 超参数指定这些损失函数。

## Object2Vec 算法的 EC2 实例建议
<a name="object2vec--instances"></a>

您使用的 Amazon Elastic Compute Cloud (Amazon EC2) 实例的类型取决于是训练还是运行推理。

在 CPU 上使用 Object2Vec 算法训练模型时，请从 ml.m5.2xlarge 实例开始。要在 GPU 上进行训练，请从 ml.p2.xlarge 实例开始。如果此实例的训练时间过长，则可以使用更大的实例。目前，Object2Vec 算法只能在单个机器上训练。但是，它确实提供了对多个的支持 GPUs。Object2Vec 支持使用 P2、P3、G4dn 和 G5 GPU 实例系列进行训练和推理。

对于使用经过训练的 Object2Vec 模型（具有深层神经网络）的推理，我们建议使用 ml.p3.2xlarge GPU 实例。由于 GPU 内存稀缺，可以指定 `INFERENCE_PREFERRED_MODE` 环境变量来优化是将 [GPU 优化：分类或回归](object2vec-inference-formats.md#object2vec-inference-gpu-optimize-classification)还是将 [GPU 优化：编码器嵌入](object2vec-encoder-embeddings.md#object2vec-inference-gpu-optimize-encoder-embeddings)推理网络加载到 GPU 中。

## Object2Vec 示例笔记本
<a name="object2vec-sample-notebooks"></a>
+ [使用 Object2Vec 将句子编码为固定长度嵌入](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/object2vec_sentence_similarity/object2vec_sentence_similarity.html)

# Object2Vec 工作原理
<a name="object2vec-howitworks"></a>

使用 Amazon SageMaker AI Object2Vec 算法时，您需要遵循标准工作流程：处理数据、训练模型和生成推论。

**Topics**
+ [步骤 1：处理数据](#object2vec-step-1-data-preprocessing)
+ [步骤 2：训练模型](#object2vec-step-2-training-model)
+ [步骤 3：生成推理](#object2vec-step-3-inference)

## 步骤 1：处理数据
<a name="object2vec-step-1-data-preprocessing"></a>

在预处理过程中，将数据转换为在[Object2Vec 训练的数据格式](object2vec-training-formats.md)中指定的 [JSON 行](http://jsonlines.org/)文本文件格式。要在训练期间获得最高的准确性，还需要在为模型提供数据之前将数据随机排序。如何生成随机排序取决于语言。对于 python，您可以使用 `np.random.shuffle`；对于 Unix，您可以使用 `shuf`。

## 步骤 2：训练模型
<a name="object2vec-step-2-training-model"></a>

 SageMaker AI Object2Vec 算法具有以下主要组成部分：
+ **两个输入通道** – 输入通道将一对相同或不同类型的对象作为输入，并将它们传递给独立的可自定义编码器。
+ **两个编码器** – 两个编码器（enc0 和 enc1）将每个对象转换为固定长度的嵌入向量。然后，将对中的对象的编码嵌入传递到比较器中。
+ **比较器** – 比较器以不同方式比较嵌入，并输出分数以表示成对对象之间的关系强度。例如，在句子对的输出分数中，1 表示句子对之间的关系较强，0 表示关系较弱。

在训练期间，该算法接受成对的对象及其关系标签或分数以作为输入。每个对中的对象可以具有不同的类型，如上所述。如果两个编码器的输入由相同的标记级单元组成，您可以在创建训练作业时将 `tied_token_embedding_weight` 超参数设置为 `True` 以使用共享标记嵌入层。例如，在比较两个具有单词标记级单元的句子时，可以执行该操作。要以指定的速率生成负样本，请将 `negative_sampling_rate` 超参数设置为所需的负样本/正样本比率。该超参数加快学习如何区分在训练数据中观察到的正样本和不太可能观察到的负样本。

对象对是通过独立的可自定义编码器传递的，这些编码器与相应对象的输入类型兼容。这些编码器将一个对中的每个对象转换为长度相等的固定长度嵌入向量。向量对传递到比较器运算符，该运算符使用 `comparator_list` 超参数中指定的值将向量合并为单个向量。然后，合并的向量通过多层感知机 (MLP) 层进行传递，该层生成输出，损失函数将输出与您提供的标签进行比较。这种比较评估对中的对象之间的关系强度，如模型中所预测的一样。下图显示了该工作流。

![\[从数据输入到分数的 Object2Vec 算法架构\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/object2vec-training-image.png)


## 步骤 3：生成推理
<a name="object2vec-step-3-inference"></a>

训练模型后，您可以使用经过训练的编码器来预处理输入对象或执行两种类型的推理：
+ 使用相应的编码器将单个输入对象转换为固定长度的嵌入
+ 预测一对输入对象之间的关系标签或分数

推理服务器根据输入数据自动确定请求哪种类型。要将嵌入作为输出，请仅提供一个输入。要预测关系标签或分数，请在该对中同时提供两个输入。

# Object2Vec 超参数
<a name="object2vec-hyperparameters"></a>

在 `CreateTrainingJob` 请求中，您可以指定训练算法。您也可以将特定于算法的超参数指定为地图。 string-to-string下表列出了 Object2Vec 训练算法的超参数。


| 参数名称 | 说明 | 
| --- | --- | 
| enc0\$1max\$1seq\$1len |  enc0 编码器的最大序列长度。 **必填** 有效值：1 ≤ 整数 ≤ 5000  | 
| enc0\$1vocab\$1size |  enc0 标记的词汇表大小。 **必填** 有效值：2 ≤ 整数 ≤ 3000000  | 
| bucket\$1width |  启用分桶时数据序列长度之间允许的差异。要启用分桶，请为该参数指定非零值。 **可选** 有效值：0 ≤ 整数 ≤ 100 默认值：0（不分桶）  | 
| comparator\$1list |  用于自定义比较两个嵌入的方式的列表。Object2Vec 比较器运算符层将来自两个编码器的编码作为输入，并输出单个向量。该向量是将子向量串联在一起的结果。传递到 `comparator_list` 的字符串值及其传递顺序决定了如何合并这些子向量。例如，如果 `comparator_list="hadamard, concat"`，则比较器运算符串联两个编码的 Hadamard 乘积和两个编码的串联以构造向量。另一方面，如果 `comparator_list="hadamard"`，则比较器运算符将向量构造为仅两个编码的 Hadamard 乘积。 **可选** 有效值：包含三个二元运算符名称的任意组合的字符串：`hadamard`、`concat` 或 `abs_diff`。Object2Vec 算法目前要求两个向量编码具有相同的维度。这些运算符生成子向量，如下所示： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object2vec-hyperparameters.html) 默认值：`"hadamard, concat, abs_diff"`  | 
| dropout |  网络层的丢弃概率。*丢弃法* 是神经网络中使用的一种正规化形式，通过修剪相关的神经元来减少过拟合。 **可选** 有效值：0.0 ≤ 浮点值 ≤ 1.0 默认值：0.0  | 
| early\$1stopping\$1patience |  在应用提前停止之前，允许的无改进的连续纪元数。改进是使用 `early_stopping_tolerance` 超参数定义的。 **可选** 有效值：1 ≤ 整数 ≤ 5 默认值：3  | 
| early\$1stopping\$1tolerance |  算法必须在连续纪元之间实现损失函数减少，以避免在 `early_stopping_patience` 超参数中指定的连续纪元数量结束之后提前停止。 **可选** 有效值：0.000001 ≤ 浮点值 ≤ 0.1 默认值：0.01  | 
| enc\$1dim |  嵌入层的输出的维。 **可选** 有效值：4 ≤ 整数 ≤ 10000 默认值：4096  | 
| enc0\$1network |  enc0 编码器的网络模型。 **可选** 有效值：`hcnn`、`bilstm` 或 `pooled_embedding` [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object2vec-hyperparameters.html) 默认值：`hcnn`  | 
| enc0\$1cnn\$1filter\$1width |  卷积神经网络 (CNN) enc0 编码器的滤波器宽度。 **条件** 有效值：1 ≤ 整数 ≤ 9 默认值：3  | 
| enc0\$1freeze\$1pretrained\$1embedding |  是否冻结 enc0 预训练嵌入权重。 **条件** 有效值：`True` 或 `False` 默认值：`True`  | 
| enc0\$1layers  |  enc0 编码器中的层数。 **条件** 有效值：`auto` 或 1 ≤ 整数 ≤ 4 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object2vec-hyperparameters.html) 默认值：`auto`  | 
| enc0\$1pretrained\$1embedding\$1file |  辅助数据通道中的预训练 enc0 标记嵌入文件的文件名。 **条件** 有效值：包含字母数字字符、下划线或句点的字符串。[A-Za-z0-9\$1.\$1\$1]  默认值：""（空字符串）  | 
| enc0\$1token\$1embedding\$1dim |  enc0 令牌嵌入层的输出维度。 **条件** 有效值：2 ≤ 整数 ≤ 1000 默认值：300  | 
| enc0\$1vocab\$1file |  用于将预训练的 enc0 标记嵌入向量映射到数值词汇的词汇文件。 IDs **条件** 有效值：包含字母数字字符、下划线或句点的字符串。[A-Za-z0-9\$1.\$1\$1]  默认值：""（空字符串）  | 
| enc1\$1network |  enc1 编码器的网络模型。如果您希望 enc1 编码器使用与 enc0 相同的网络模型（包括超参数值），请将该值设置为 `enc0`。  即使 enc0 和 enc1 编码器网络具有对称的架构，您也无法在这些网络中共享参数值。  **可选** 有效值：`enc0`、`hcnn`、`bilstm` 或 `pooled_embedding` [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object2vec-hyperparameters.html) 默认值：`enc0`  | 
| enc1\$1cnn\$1filter\$1width |  CNN enc1 编码器的滤波器宽度。 **条件** 有效值：1 ≤ 整数 ≤ 9 默认值：3  | 
| enc1\$1freeze\$1pretrained\$1embedding |  是否冻结 enc1 预训练嵌入权重。 **条件** 有效值：`True` 或 `False` 默认值：`True`  | 
| enc1\$1layers  |  enc1 编码器中的层数。 **条件** 有效值：`auto` 或 1 ≤ 整数 ≤ 4 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object2vec-hyperparameters.html) 默认值：`auto`  | 
| enc1\$1max\$1seq\$1len |  enc1 编码器的最大序列长度。 **条件** 有效值：1 ≤ 整数 ≤ 5000  | 
| enc1\$1pretrained\$1embedding\$1file |  辅助数据通道中的 enc1 预训练标记嵌入文件的名称。 **条件** 有效值：包含字母数字字符、下划线或句点的字符串。[A-Za-z0-9\$1.\$1\$1]  默认值：""（空字符串）  | 
| enc1\$1token\$1embedding\$1dim |  enc1 标记嵌入层的输出维度。 **条件** 有效值：2 ≤ 整数 ≤ 1000 默认值：300  | 
| enc1\$1vocab\$1file |  用于将预训练的 enc1 标记嵌入映射到词汇表的词汇文件。 IDs **条件** 有效值：包含字母数字字符、下划线或句点的字符串。[A-Za-z0-9\$1.\$1\$1]  默认值：""（空字符串）  | 
| enc1\$1vocab\$1size |  enc0 标记的词汇表大小。 **条件** 有效值：2 ≤ 整数 ≤ 3000000  | 
| epochs |  要运行用于训练的纪元数。 **可选** 有效值：1 ≤ 整数 ≤ 100 默认值：30  | 
| learning\$1rate |  训练的学习率。 **可选** 有效值：1.0E-6 ≤ 浮点值 ≤ 1.0 默认值：0.0004  | 
| mini\$1batch\$1size |  在训练期间将 `optimizer` 的数据集拆分成的批次大小。 **可选** 有效值：1 ≤ 整数 ≤ 10000 默认值：32  | 
| mlp\$1activation |  多层感知机 (MLP) 层的激活函数的类型。 **可选** 有效值：`tanh`、`relu` 或 `linear` [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object2vec-hyperparameters.html) 默认值：`linear`  | 
| mlp\$1dim |  MLP 层的输出维度。 **可选** 有效值：2 ≤ 整数 ≤ 10000 默认值：512  | 
| mlp\$1layers |  网络中的 MLP 层数。 **可选** 有效值：0 ≤ 整数 ≤ 10 默认值：2  | 
| negative\$1sampling\$1rate |  为帮助训练算法而生成的负样本与用户提供的正样本的比率。负样本表示实际不太可能出现的数据，并在训练时标记为不正确的样本。它们有助于训练模型，以区分观察到的正样本和未观察到的负样本。要指定用于训练的负样本与正样本的比率，请将该值设置为正整数。例如，如果在所有样本都是正样本的输入数据上训练算法，并将 `negative_sampling_rate` 设置为 2，则 Object2Vec 算法在内部为每个正样本生成两个负样本。如果您不希望在训练期间生成或使用负样本，请将该值设置为 0。 **可选** 有效值：0 ≤ 整数 默认值：0 (关闭)  | 
| num\$1classes |  用于分类训练的分类数。对于回归问题， SageMaker Amazon AI 会忽略这个超参数。 **可选** 有效值：2 ≤ 整数 ≤ 30 默认值：2  | 
| optimizer |  优化程序类型。 **可选** 有效值：`adadelta`、`adagrad`、`adam`、`sgd` 或 `rmsprop`。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object2vec-hyperparameters.html) 默认值：`adam`  | 
| output\$1layer |  输出层的类型，您可以在其中指定任务是回归还是分类。 **可选** 有效值：`softmax` 或 `mean_squared_error` [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object2vec-hyperparameters.html) 默认值：`softmax`  | 
| tied\$1token\$1embedding\$1weight |  是否将共享嵌入层用于两个编码器。如果两个编码器的输入使用相同的标记级单元，请使用共享标记嵌入层。例如，对于文档集合，如果一个编码器对句子进行编码，另一个编码器对整个文档进行编码，则可以使用共享标记嵌入层。这是因为，句子和文档都是由同一词汇表中的单词标记组成的。 **可选** 有效值：`True` 或 `False` 默认值：`False`  | 
| token\$1embedding\$1storage\$1type |  在训练期间使用的梯度更新模式：在使用 `dense` 模式时，优化程序计算标记嵌入层的完整梯度矩阵，即使梯度的大多数行的值为零。在使用 `sparse` 模式时，优化程序仅存储实际在小批次中使用的梯度行。如果您希望算法执行延迟梯度更新（仅计算非零行中的梯度并加速训练），请指定 `row_sparse`。如果将该值设置为 `row_sparse`，则会限制其他超参数的可用值，如下所示： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object2vec-hyperparameters.html) **可选** 有效值：`dense` 或 `row_sparse` 默认值：`dense`  | 
| weight\$1decay |  用于优化的权重衰减参数。 **可选** 有效值：0 ≤ 浮点值 ≤ 10000 默认值：0（无衰减）  | 

# 优化 Object2Vec 模型
<a name="object2vec-tuning"></a>

*自动模型优化*（也称作超参数优化）通过运行很多在数据集上测试一系列超参数的作业来查找模型的最佳版本。您可以选择可优化超参数、每个超参数的值范围和一个目标指标。对于目标指标，您可以使用该算法计算的指标之一。自动模型优化将搜索所选超参数以找到导致优化目标指标的模型的值组合。

有关模型优化的更多信息，请参阅[使用 SageMaker AI 自动调整模型](automatic-model-tuning.md)。

## Object2Vec 算法计算的指标
<a name="object2vec-metrics"></a>

该 Object2Vec 算法同时具有分类和回归指标。`output_layer` 类型确定可用于自动模型优化的指标。

### Object2Vec 算法计算的回归量指标
<a name="object2vec-regressor-metrics"></a>

该算法报告均方误差回归量指标，该指标在测试和验证期间计算。在为回归任务优化模型时，请选择此指标作为目标。


| 指标名称 | 说明 | 优化方向 | 
| --- | --- | --- | 
| test:mean\$1squared\$1error | 均方根误差 | 最小化 | 
| validation:mean\$1squared\$1error | 均方根误差 | 最小化 | 

### Object2Vec 算法计算的分类指标
<a name="object2vec-classification-metrics"></a>

Object2Vec 算法报告在测试和验证期间计算的准确度和交叉熵分类指标。在为分类任务优化模型时，请选择其中之一作为目标。


| 指标名称 | 说明 | 优化方向 | 
| --- | --- | --- | 
| test:accuracy | 准确性 | 最大化 | 
| test:cross\$1entropy | 交叉熵 | 最小化 | 
| validation:accuracy | 准确性 | 最大化 | 
| validation:cross\$1entropy | 交叉熵 | 最小化 | 

## 可优化 Object2Vec 超参数
<a name="object2vec-tunable-hyperparameters"></a>

您可为 Object2Vec 算法优化以下超参数。


| 超参数名称 | 超参数类型 | 建议的范围和值 | 
| --- | --- | --- | 
| dropout | ContinuousParameterRange | MinValue: 0.0， MaxValue: 1.0 | 
| early\$1stopping\$1patience | IntegerParameterRange | MinValue: 1, MaxValue: 5 | 
| early\$1stopping\$1tolerance | ContinuousParameterRange | MinValue: 0.001， MaxValue: 0.1 | 
| enc\$1dim | IntegerParameterRange | MinValue: 4, MaxValue: 4096 | 
| enc0\$1cnn\$1filter\$1width | IntegerParameterRange | MinValue: 1, MaxValue: 5 | 
| enc0\$1layers | IntegerParameterRange | MinValue: 1, MaxValue: 4 | 
| enc0\$1token\$1embedding\$1dim | IntegerParameterRange | MinValue: 5, MaxValue: 300 | 
| enc1\$1cnn\$1filter\$1width | IntegerParameterRange | MinValue: 1, MaxValue: 5 | 
| enc1\$1layers | IntegerParameterRange | MinValue: 1, MaxValue: 4 | 
| enc1\$1token\$1embedding\$1dim | IntegerParameterRange | MinValue: 5, MaxValue: 300 | 
| epochs | IntegerParameterRange | MinValue: 4, MaxValue: 20 | 
| learning\$1rate | ContinuousParameterRange | MinValue: 1e-6， MaxValue: 1.0 | 
| mini\$1batch\$1size | IntegerParameterRange | MinValue: 1, MaxValue: 8192 | 
| mlp\$1activation | CategoricalParameterRanges |  [`tanh`, `relu`, `linear`]  | 
| mlp\$1dim | IntegerParameterRange | MinValue: 16, MaxValue: 1024 | 
| mlp\$1layers | IntegerParameterRange | MinValue: 1, MaxValue: 4 | 
| optimizer | CategoricalParameterRanges | [`adagrad`, `adam`, `rmsprop`, `sgd`, `adadelta`] | 
| weight\$1decay | ContinuousParameterRange | MinValue: 0.0， MaxValue: 1.0 | 

# Object2Vec 训练的数据格式
<a name="object2vec-training-formats"></a>

使用 Object2Vec 算法进行训练时，请确保请求中的输入数据采用 JSON 行格式，其中每一行代表一个数据点。

## 输入：JSON 行请求格式
<a name="object2vec-in-training-data-jsonlines"></a>

Content-type：application/jsonlines

```
{"label": 0, "in0": [6, 17, 606, 19, 53, 67, 52, 12, 5, 10, 15, 10178, 7, 33, 652, 80, 15, 69, 821, 4], "in1": [16, 21, 13, 45, 14, 9, 80, 59, 164, 4]}
{"label": 1, "in0": [22, 1016, 32, 13, 25, 11, 5, 64, 573, 45, 5, 80, 15, 67, 21, 7, 9, 107, 4], "in1": [22, 32, 13, 25, 1016, 573, 3252, 4]}
{"label": 1, "in0": [774, 14, 21, 206], "in1": [21, 366, 125]}
```

“in0”和“in1”分别是 encoder0 和 encoder1 的输入。相同的格式对分类和回归问题都有效。对于回归，字段 `"label"` 可以接受实际值输入。

# 用于 Object2Vec 推理的数据格式
<a name="object2vec-inference-formats"></a>

下一页描述了用于从 Amazon A SageMaker I Object2Vec 模型中获取评分推断的输入请求和输出响应格式。

## GPU 优化：分类或回归
<a name="object2vec-inference-gpu-optimize-classification"></a>

由于 GPU 内存稀缺，可以指定 `INFERENCE_PREFERRED_MODE` 环境变量来优化是将分类或回归还是将 [输出：编码器嵌入](object2vec-encoder-embeddings.md#object2vec-out-encoder-embeddings-data)推理网络加载到 GPU 中。如果您的大多数推理适用于分类或回归，请指定 `INFERENCE_PREFERRED_MODE=classification`。以下是使用 4 个 p3.2xlarge 实例来优化推理的 Batch Transform 示例： classification/regression 

```
transformer = o2v.transformer(instance_count=4,
                              instance_type="ml.p2.xlarge",
                              max_concurrent_transforms=2,
                              max_payload=1,  # 1MB
                              strategy='MultiRecord',
                              env={'INFERENCE_PREFERRED_MODE': 'classification'},  # only useful with GPU
                              output_path=output_s3_path)
```

## 输入：分类或回归请求格式
<a name="object2vec-in-inference-data"></a>

Content-type：application/json

```
{
  "instances" : [
    {"in0": [6, 17, 606, 19, 53, 67, 52, 12, 5, 10, 15, 10178, 7, 33, 652, 80, 15, 69, 821, 4], "in1": [16, 21, 13, 45, 14, 9, 80, 59, 164, 4]},
    {"in0": [22, 1016, 32, 13, 25, 11, 5, 64, 573, 45, 5, 80, 15, 67, 21, 7, 9, 107, 4], "in1": [22, 32, 13, 25, 1016, 573, 3252, 4]},
    {"in0": [774, 14, 21, 206], "in1": [21, 366, 125]}
  ]
}
```

Content-type：application/jsonlines

```
{"in0": [6, 17, 606, 19, 53, 67, 52, 12, 5, 10, 15, 10178, 7, 33, 652, 80, 15, 69, 821, 4], "in1": [16, 21, 13, 45, 14, 9, 80, 59, 164, 4]}
{"in0": [22, 1016, 32, 13, 25, 11, 5, 64, 573, 45, 5, 80, 15, 67, 21, 7, 9, 107, 4], "in1": [22, 32, 13, 25, 1016, 573, 3252, 4]}
{"in0": [774, 14, 21, 206], "in1": [21, 366, 125]}
```

对于分类问题，分数向量的长度对应于 `num_classes`。对于回归问题，长度为 1。

## 输出：分类或回归响应格式
<a name="object2vec-out-inference-data"></a>

Accept：application/json

```
{
    "predictions": [
        {
            "scores": [
                0.6533935070037842,
                0.07582679390907288,
                0.2707797586917877
            ]
        },
        {
            "scores": [
                0.026291321963071823,
                0.6577019095420837,
                0.31600672006607056
            ]
        }
    ]
}
```

Accept：application/jsonlines

```
{"scores":[0.195667684078216,0.395351558923721,0.408980727195739]}
{"scores":[0.251988261938095,0.258233487606048,0.489778339862823]}
{"scores":[0.280087798833847,0.368331134319305,0.351581096649169]}
```

在分类和回归格式中，分数应用于单个标签。

# Object2Vec 的编码器嵌入
<a name="object2vec-encoder-embeddings"></a>

下一页列出了用于从 Amazon A SageMaker I Object2Vec 模型中获取编码器嵌入推理的输入请求和输出响应格式。

## GPU 优化：编码器嵌入
<a name="object2vec-inference-gpu-optimize-encoder-embeddings"></a>

嵌入是从离散对象（例如单词）到实数向量的映射。

由于 GPU 内存稀缺，可以指定 `INFERENCE_PREFERRED_MODE` 环境变量来优化是将[用于 Object2Vec 推理的数据格式](object2vec-inference-formats.md)还是将编码器嵌入推理网络加载到 GPU 中。如果您的绝大多数推理用于进行编码器嵌入，则指定 `INFERENCE_PREFERRED_MODE=embedding`。下面是一个批量转换示例，用于说明如何使用 4 个针对编码器嵌入推理进行优化的 p3.2xlarge 实例：

```
transformer = o2v.transformer(instance_count=4,
                              instance_type="ml.p2.xlarge",
                              max_concurrent_transforms=2,
                              max_payload=1,  # 1MB
                              strategy='MultiRecord',
                              env={'INFERENCE_PREFERRED_MODE': 'embedding'},  # only useful with GPU
                              output_path=output_s3_path)
```

## 输入：编码器嵌入
<a name="object2vec-in-encoder-embeddings-data"></a>

Content-type: application/json; infer\$1max\$1seqlens=<FWD-LENGTH>,<BCK-LENGTH>

其中 <FWD-LENGTH> 和 <BCK-LENGTH> 是 [1,5000] 范围内的整数，并定义向前和向后编码器的最大序列长度。

```
{
  "instances" : [
    {"in0": [6, 17, 606, 19, 53, 67, 52, 12, 5, 10, 15, 10178, 7, 33, 652, 80, 15, 69, 821, 4]},
    {"in0": [22, 1016, 32, 13, 25, 11, 5, 64, 573, 45, 5, 80, 15, 67, 21, 7, 9, 107, 4]},
    {"in0": [774, 14, 21, 206]}
  ]
}
```

Content-type: application/jsonlines; infer\$1max\$1seqlens=<FWD-LENGTH>,<BCK-LENGTH>

其中 <FWD-LENGTH> 和 <BCK-LENGTH> 是 [1,5000] 范围内的整数，并定义向前和向后编码器的最大序列长度。

```
{"in0": [6, 17, 606, 19, 53, 67, 52, 12, 5, 10, 15, 10178, 7, 33, 652, 80, 15, 69, 821, 4]}
{"in0": [22, 1016, 32, 13, 25, 11, 5, 64, 573, 45, 5, 80, 15, 67, 21, 7, 9, 107, 4]}
{"in0": [774, 14, 21, 206]}
```

在这两种格式中，您可以仅指定一种输入类型：`“in0”` 或 `“in1.”`。然后，推理服务调用相应的编码器，并输出每个实例的嵌入。

## 输出：编码器嵌入
<a name="object2vec-out-encoder-embeddings-data"></a>

Content-type：application/json

```
{
  "predictions": [
    {"embeddings":[0.057368703186511,0.030703511089086,0.099890425801277,0.063688032329082,0.026327300816774,0.003637571120634,0.021305780857801,0.004316598642617,0.0,0.003397724591195,0.0,0.000378780066967,0.0,0.0,0.0,0.007419463712722]},
    {"embeddings":[0.150190666317939,0.05145975202322,0.098204270005226,0.064249359071254,0.056249320507049,0.01513972133398,0.047553978860378,0.0,0.0,0.011533712036907,0.011472506448626,0.010696629062294,0.0,0.0,0.0,0.008508535102009]}
  ]
}
```

Content-type：application/jsonlines

```
{"embeddings":[0.057368703186511,0.030703511089086,0.099890425801277,0.063688032329082,0.026327300816774,0.003637571120634,0.021305780857801,0.004316598642617,0.0,0.003397724591195,0.0,0.000378780066967,0.0,0.0,0.0,0.007419463712722]}
{"embeddings":[0.150190666317939,0.05145975202322,0.098204270005226,0.064249359071254,0.056249320507049,0.01513972133398,0.047553978860378,0.0,0.0,0.011533712036907,0.011472506448626,0.010696629062294,0.0,0.0,0.0,0.008508535102009]}
```

推理服务输出的嵌入的向量长度等于在训练时指定的以下超参数之一的值：`enc0_token_embedding_dim`、`enc1_token_embedding_dim` 或 `enc_dim`。