这里,我们来介绍一下如何使用sagemaker训练一个图片分类模型。共分为以下几步:
在本教程中,我们将使用图像分类任务来说明如何使用 AutoGluon 的 API。
我们将图像和相应的标签加载到 AutoGluon 中,并使用这些数据获取可对新图像进行分类的神经网络。这与传统的机器学习不同,我们需要手动定义神经网络,然后在训练过程中指定超参数。相反,只需对 AutoGluon 的拟合函数fit进行一次调用,AutoGluon 就会自动训练许多具有不同超参数配置的模型,并返回实现最高精度的模型。
下载数据集
在本教程中,我们将使汽车图像数据集, 该数据集包含 196 类汽车的 16,185 张图像。这些数据分为 8,144 张训练图像和 8,041 张测试图像,其中每个班级大致被分割为 50-50 分。类别通常是在品牌、模型、年份等级,例如 2012 年特斯拉 S 型或 2012 年宝马 M3 轿跑车。
!wget http://imagenet.stanford.edu/internal/car196/cars_train.tgz
!wget http://imagenet.stanford.edu/internal/car196/cars_test.tgz
!wget http://ai.stanford.edu/~jkrause/cars/car_devkit.tgz
数据格式转换
解压缩数据集
if not os.path.exists("devkit"):
!tar xf car_devkit.tgz
if not os.path.exists("cars_train"):
!tar xf cars_train.tgz
if not os.path.exists("cars_test"):
!tar xf cars_test.tgz
读取标注数据
import scipy.io
cars_meta = scipy.io.loadmat('devkit/cars_meta.mat')
转换数据格式
meta = [m[0] for m in cars_meta['class_names'][0]]
for m in meta:
dirname = "data/train/{}".format(m)
if not os.path.exists(dirname):
os.mkdir(dirname)
dirname = "data/test/{}".format(m)
if not os.path.exists(dirname):
os.mkdir(dirname)
可视化数据中的样本
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("data/train/Jeep_Patriot_SUV_2012/00086.jpg")
img[:, :, (0, 1, 2)] = img[:, :, (2, 1, 0)]
ax = plt.imshow(img)
安装AutoGluon工具包
!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple autogluon==0.0.12 -t package
开始使用AutoGluon工具包,并定义任务
import autogluon as ag
from autogluon import ImageClassification as task
dataset = task.Dataset('data/train')
classifier = task.fit(dataset,
net='ResNet50_v1b',
batch_size=64,
epochs=20,
ngpus_per_trial=1,
num_trials=1,
verbose=True)
if not os.path.exists("models"):
os.makedirs("models")
classifier.save("models/resnet50_cars-0000.ag")
print('Top-1 val acc: %.3f' % classifier.results['best_reward'])
"Top-1 val acc: 0.724"
image_path = 'cars_test/00003.jpg'
img = cv2.imread(image_path)
clsidx, prob, _ = classifier.predict(image_path)
print(clsidx.asscalar(), prob.asscalar(), classes[clsidx.asscalar()])
img[:, :, (0, 1, 2)] = img[:, :, (2, 1, 0)]
ax = plt.imshow(img)
import sagemaker
from sagemaker import get_execution_role, local, Model, utils, fw_utils, s3
session = sagemaker.Session()
local_session = local.LocalSession()
bucket = session.default_bucket()
prefix = 'sagemaker/autogluon-image-classification'
region = session.boto_region_name
role = get_execution_role()
client = session.boto_session.client(
"sts", region_name=region, endpoint_url=utils.sts_regional_endpoint(region)
)
account = client.get_caller_identity()['Account']
ecr_uri_prefix = utils.get_ecr_image_uri_prefix(account, region)
registry_id = fw_utils._registry_id(region, 'mxnet', 'py3', account, '1.6.0')
registry_uri = utils.get_ecr_image_uri_prefix(registry_id, region)
inference_algorithm_name = 'autogluon-sagemaker-inference'
algorithm_name = inference_algorithm_name
fullname=f"{ecr_uri_prefix}/{algorithm_name}:latest"
sagemaker_model = MXNetModel(model_data=model_data,
image=fullname,
role=role,
sagemaker_session=session,
py_version='py3',
entry_point='docker/serve.py',
framework_version='1.6.0')
predictor = sagemaker_model.deploy(initial_instance_count=1, instance_type='ml.m5.xlarge')