amazon-sagemaker - 如何使用内置算法语义分割在 AWS SageMaker 上训练的模型在本地 PC 上进行推理?
问题描述
类似于训练好的模型可以在不依赖 sagemaker 或 aws 服务的情况下部署在其他平台上的问题?.
我使用内置算法Semantic Segmentation在 AWS SageMaker 上训练了一个模型。这个名为 asmodel.tar.gz
的训练模型存储在 S3 上。所以我想从 S3 下载这个文件,然后用它在我的本地 PC 上进行推理,而不再使用 AWS SageMaker。由于内置算法语义分割是使用MXNet Gluon 框架和 Gluon CV 工具包构建的,所以我尝试参考mxnet和gluon -cv的文档在本地 PC 上进行推理。
从S3下载这个文件很容易,然后我解压这个文件得到三个文件:
- hyperparams.json:包括网络架构、数据输入和训练的参数。请参阅语义分割超参数。
- model_algo-1
- model_best.params
model_algo -1和model_best.params都是经过训练的模型,我认为它是net.save_parameters
(请参阅训练神经网络)的输出。我也可以用函数加载它们mxnet.ndarray.load
。
请参阅使用预训练模型进行预测。我发现有两个必要的东西:
- 重构网络以进行推理。
- 加载训练好的参数。
至于重构网络进行推理,由于我在训练中使用过PSPNet,所以我可以使用类gluoncv.model_zoo.PSPNet
来重构网络。而且我知道如何使用 AWS SageMaker 的一些服务(例如批量转换作业)进行推理。我想在我的本地 PC 上重现它。如果我使用该类gluoncv.model_zoo.PSPNet
来重建网络,我无法确定该网络的参数是否与 AWS SageMaker 在推理时使用的参数相同。因为我看不到501404015308.dkr.ecr.ap-northeast-1.amazonaws.com/semantic-segmentation:latest
详细的图像。
至于加载训练好的参数,我可以使用load_parameters
. 但是对于model_algo-1和model_best.params,我不知道应该使用哪个。
解决方案
以下代码对我来说效果很好。
import mxnet as mx
from mxnet import image
from gluoncv.data.transforms.presets.segmentation import test_transform
import gluoncv
# use cpu
ctx = mx.cpu(0)
# load test image
img = image.imread('./img/IMG_4015.jpg')
img = test_transform(img, ctx)
img = img.astype('float32')
# reconstruct the PSP network model
model = gluoncv.model_zoo.PSPNet(2)
# load the trained model
model.load_parameters('./model/model_algo-1')
# make inference
output = model.predict(img)
predict = mx.nd.squeeze(mx.nd.argmax(output, 1)).asnumpy()
推荐阅读
- java - 从维基百科信息框获取特定信息
- python-3.x - 两段 python 代码创建 zip 存档 两个之一被破坏
- linux - 使用 sed 替换行块
- c# - 使用 __ANDROID__ 在跨平台库中编写的代码不会在 Xamarin 表单应用程序中执行
- vue.js - b-输入模型具有字符串类型的值
- android - 构建我的 apk 时如何减小 xml 资产的大小
- arduino - ESP32 或 Arduino 上的 I2C:使用 BMP388 传感器的最大从机数量是多少
- rust - Supertrait 仅当 Self : Sized
- java - 如何将 java 文件编译为使用其他 .class 的 .class。(如果它是可能的)
- python - Keras 模型未能减少损失