注意:此自定义转换步骤是可选的,需要部署 Jumpstart 的图像嵌入模型
使用 Data Wrangler 中的图像准备功能,我们还可以调用另一个模型的端点。我们可以在搜索示例代码片段部分找到一些带有样板代码的示例脚本。
对于我们的示例,我们创建一个新的转换来删除异常值。请注意,此代码仅用于演示目的。我们可能需要修改代码以适应任何生产工作负载需求。
这是一个用 PySpark 编写的自定义代码段。该代码查询 SageMaker 模型端点以获取每个图像的嵌入。此示例使用 Sagemaker Jumpstart 预训练的 MobileNet 模型进行图像嵌入。
JumpStart 模型可解决常见的机器学习任务,如图像分类、目标检测、文本分类、句子对分类和问答,并可用于快速模型创建和部署。
在运行此步骤之前,我们需要有一个图像嵌入模型 mobile-net(例如,jumpstart-dft-mobilenet-v2-100-224-featurevector-4)。
要了解如何在 JumpStart 中创建图像嵌入模型,请参考 GitHub 仓库 。步骤与使用 Jumpstart 创建图像分类模型类似。
部署端点后,复制端点名称并替换下面的 get_embedding 函数。请参见以下代码:
# 表格可用作变量 'df'
# 要切断的异常值数量
n_outliers = 1
import json
import ast
import boto3
from pyspark.sql.functions import col, udf
import numpy as np
from sklearn.neighbors import NearestNeighbors
# 下面的 UDF 查询 Sagemaker 端点以获取每个图像的嵌入。
# 此示例使用 Sagemaker Jumpstart 预训练的 MobileNet 模型进行图像嵌入。
# 用我们自己的端点名称替换下面突出显示的端点名称
def get_embedding(image):
response = boto3.client('runtime.sagemaker',region_name='us-east-1').\
invoke_endpoint(EndpointName='jumpstart-dft-mobilenet-v2-130-224-featurevector-4', \
ContentType='application/x-image',Body=image.data)
return json.loads(response['Body'].read())["embedding"]
convertUDF = udf(lambda z: get_embedding(z))
df_pd = df.select("image_col.path", convertUDF(col("image_col")).alias("emb")).toPandas()
# 解析输出
df_np = []
for val in df_pd["emb"].to_list():
df_np.append(ast.literal_eval(val))
df_np = np.array(df_np)
# 设置最近邻树
knn_tree = NearestNeighbors(n_neighbors=10, metric='cosine')
knn_tree.fit(df_np)
# 根据与最近 10 个邻居在嵌入空间中的距离对所有图像进行评分
scores = knn_tree.kneighbors(df_np, n_neighbors=10, return_distance=True)[0][:,1:]
scores = np.mean(scores, axis = 1)
# 按分数排序,并将 n_outliers 个最异常的图像声明为异常值
scores_argsort = np.argsort(scores)
outliers = df_pd["path"][list(scores_argsort[-n_outliers:])].to_list()
# 接下来,让我们过滤掉异常值。我们可以在自定义转换的末尾使用以下代码段
df = df.filter(~ df.path.isin(outliers))
复制上述自定义函数并粘贴到自定义转换中。
选择"预览"并"添加"以保存更改。