

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

# 用于推理的常见数据格式
<a name="cdf-inference"></a>

Amazon SageMaker AI 算法接受并生成用于检索在线和小批量预测的 HTTP 有效负载的几种不同的 MIME 类型。在运行推理之前，您可以使用多个 AWS 服务来转换或预处理记录。您至少需要将数据转换为以下内容：
+ 推理请求序列化 (由您处理) 
+ 推理请求反序列化 (由算法处理) 
+ 推理响应序列化 (由算法处理) 
+ 推理响应反序列化 (由您处理) 

**Topics**
+ [转换用于推理请求序列化的数据](#ir-serialization)
+ [转换用于推理响应反序列化的数据](#ir-deserialization)
+ [所有算法的常见请求格式](#common-in-formats)
+ [将批量转换和内置算法结合使用](#cm-batch)

## 转换用于推理请求序列化的数据
<a name="ir-serialization"></a>

Amazon A SageMaker I 算法推断请求的内容类型选项包括：`text/csv``application/json`、和。`application/x-recordio-protobuf`不支持所有这些类型的算法可以支持其他类型。 XGBoost，例如，仅支持`text/csv`此列表中的内容，但也支持`text/libsvm`。

对于 `text/csv`，`invoke_endpoint` 的 Body 参数的值应为一个字符串，其中使用逗号分隔各个特征的值。例如，具有 4 个特征的模型的记录可能类似于 `1.5,16.0,14,23.0`。在获得推理结果之前，还应对数据执行已对训练数据执行的任何转换。特征的顺序很重要，并且必须保持不变。

`application/json` 更为灵活，并为开发人员提供多种可能的格式以便在应用程序中使用。在较高的层面上 JavaScript，有效载荷可能如下所示：

```
let request = {
  // Instances might contain multiple rows that predictions are sought for.
  "instances": [
    {
      // Request and algorithm specific inference parameters.
      "configuration": {},
      // Data in the specific format required by the algorithm.
      "data": {
         "<field name>": dataElement
       }
    }
  ]
}
```

对于指定 `dataElement`，您可使用以下选项：

**协议缓冲区等效**

```
// Has the same format as the protocol buffers implementation described for training.
let dataElement = {
  "keys": [],
  "values": [],
  "shape": []
}
```

**简单数值向量**

```
// An array containing numeric values is treated as an instance containing a
// single dense vector.
let dataElement = [1.5, 16.0, 14.0, 23.0]

// It will be converted to the following representation by the SDK.
let converted = {
  "features": {
    "values": dataElement
  }
}
```

**对于多个记录**

```
let request = {
  "instances": [
    // First instance.
    {
      "features": [ 1.5, 16.0, 14.0, 23.0 ]
    },
    // Second instance.
    {
      "features": [ -2.0, 100.2, 15.2, 9.2 ]
    }
  ]
}
```

## 转换用于推理响应反序列化的数据
<a name="ir-deserialization"></a>

亚马逊 SageMaker AI 算法以多种布局返回 JSON。从较高的层面上说，结构为：

```
let response = {
  "predictions": [{
    // Fields in the response object are defined on a per algorithm-basis.
  }]
}
```

对于各种算法而言，预测中包含的字段是不同的。以下是 k-means 算法的输出示例。

**单记录推理** 

```
let response = {
  "predictions": [{
    "closest_cluster": 5,
    "distance_to_cluster": 36.5
  }]
}
```

**多记录推理**

```
let response = {
  "predictions": [
    // First instance prediction.
    {
      "closest_cluster": 5,
      "distance_to_cluster": 36.5
    },
    // Second instance prediction.
    {
      "closest_cluster": 2,
      "distance_to_cluster": 90.3
    }
  ]
}
```

**具有 protobuf 输入的多记录推理**

```
{
  "features": [],
  "label": {
    "closest_cluster": {
      "values": [ 5.0 ] // e.g. the closest centroid/cluster was 1.0
    },
    "distance_to_cluster": {
      "values": [ 36.5 ]
    }
  },
  "uid": "abc123",
  "metadata": "{ "created_at": '2017-06-03' }"
}
```

SageMaker 人工智能算法还支持 JSONLINES 格式，其中每条记录的响应内容与 JSON 格式的响应内容相同。多记录结构是用换行符分隔的每个记录响应对象的集合。2 个输入数据点的内置 KMeans 算法的响应内容为：

```
{"distance_to_cluster": 23.40593910217285, "closest_cluster": 0.0}
{"distance_to_cluster": 27.250282287597656, "closest_cluster": 0.0}
```

在运行批量转换时，建议通过将 `CreateTransformJobRequest` 中的 `Accept` 字段设置为 `application/jsonlines` 来使用 `jsonlines` 响应类型。

## 所有算法的常见请求格式
<a name="common-in-formats"></a>

大多数算法使用以下推理请求格式中的很多格式。

### JSON 请求格式
<a name="cm-json"></a>

**内容类型**：application/JSON

**密集格式**

```
let request =   {
    "instances":    [
        {
            "features": [1.5, 16.0, 14.0, 23.0]
        }
    ]
}


let request =   {
    "instances":    [
        {
            "data": {
                "features": {
                    "values": [ 1.5, 16.0, 14.0, 23.0]
                }
            }
        }
    ]
}
```

**稀疏格式**

```
{
	"instances": [
		{"data": {"features": {
					"keys": [26, 182, 232, 243, 431],
					"shape": [2000],
					"values": [1, 1, 1, 4, 1]
				}
			}
		},
		{"data": {"features": {
					"keys": [0, 182, 232, 243, 431],
					"shape": [2000],
					"values": [13, 1, 1, 4, 1]
				}
			}
		},
	]
}
```

### JSONLINES 请求格式
<a name="cm-jsonlines"></a>

**内容类型：**application/JSONLINES

**密集格式**

密集格式的单个记录可以表示为：

```
{ "features": [1.5, 16.0, 14.0, 23.0] }
```

或者：

```
{ "data": { "features": { "values": [ 1.5, 16.0, 14.0, 23.0] } }
```

**稀疏格式**

稀疏格式的单个记录表示为：

```
{"data": {"features": { "keys": [26, 182, 232, 243, 431], "shape": [2000], "values": [1, 1, 1, 4, 1] } } }
```

多个记录表示为单记录表示的集合（用换行符分隔）：

```
{"data": {"features": { "keys": [0, 1, 3], "shape": [4], "values": [1, 4, 1] } } }
{ "data": { "features": { "values": [ 1.5, 16.0, 14.0, 23.0] } }
{ "features": [1.5, 16.0, 14.0, 23.0] }
```

### CSV 请求格式
<a name="cm-csv"></a>

**内容类型：**text/CSV；label\$1size=0

**注意**  
因子分解机不提供 CSV 支持。

### RECORDIO 请求格式
<a name="cm-recordio"></a>

内容类型：应用程序/ x-recordio-protobuf

## 将批量转换和内置算法结合使用
<a name="cm-batch"></a>

在运行批量转换时，如果算法支持，建议使用 JSONLINES 响应类型而不是 JSON。为此，请将 `CreateTransformJobRequest` 中的 `Accept` 字段设置为 `application/jsonlines`。

在创建转换作业时，必须根据输入数据的 `ContentType` 来设置 `SplitType`。同样，必须根据 `CreateTransformJobRequest` 中的 `Accept` 字段来相应地设置 `AssembleWith`。使用下表设置这些字段：


| ContentType | 推荐 SplitType | 
| --- | --- | 
| application/x-recordio-protobuf | RecordIO | 
| text/csv | Line | 
| application/jsonlines | Line | 
| application/json | None | 
| application/x-image | None | 
| image/\$1 | None | 


| Accept | 推荐 AssembleWith | 
| --- | --- | 
| application/x-recordio-protobuf | None | 
| application/json | None | 
| application/jsonlines | Line | 

有关特定算法的响应格式的更多信息，请参阅以下内容：
+ [DeepAR 推理格式](deepar-in-formats.md)
+ [因子分解机响应格式](fm-in-formats.md)
+ [IP 洞察推理数据格式](ip-insights-inference-data-formats.md)
+ [K-Means 响应格式](km-in-formats.md)
+ [k-NN 请求和响应格式](kNN-inference-formats.md)
+ [线性学习器响应格式](LL-in-formats.md)
+ [NTM 响应格式](ntm-in-formats.md)
+ [用于 Object2Vec 推理的数据格式](object2vec-inference-formats.md)
+ [Object2Vec 的编码器嵌入](object2vec-encoder-embeddings.md)
+ [PCA 响应格式](PCA-in-formats.md)
+ [RCF 响应格式](rcf-in-formats.md)