利用Amazon SageMaker进行图像分类:使用CIFAR-10数据集的动手指南
#aws #开源 #python #machinelearning

Our friends, the Artificial Intelligence

动机

今天,我们正在深入研究一个令人兴奋的动手项目,我们将使用Amazon Sagemaker使用CIFAR-10数据集训练和部署图像分类模型。这样的项目为社区提供了强大的工具,尤其是对那些对深度学习和计算机愿景感兴趣的人。它利用亚马逊萨吉式制造商,提供了一种简化的方法,可以使用CIFAR-10数据集建立,训练和部署复杂的图像分类模型 - 计算机视觉社区中的主食,以基准确定新算法的性能。 AWS服务的利用封装了基础架构管理的繁重提升,使开发人员和数据科学家能够专注于培训强大模型的核心目标。此外,即使对于机器学习经验有限的人来说,在萨格马制造商中提供的预先构建算法的应用也使该项目高度访问。它为学习和实验创造了丰富的基础,可以轻松地操纵变量,例如神经网络中的层数或用于培训的实例类型,观察到不同的结果,也许是Garner的见解,这些见解有助于更广泛的知识人工智能领域的基础。

除了成为学习途径外,该项目还促进了现实解决方案的创新和开发。图像识别系统在各个领域中找到应用程序,包括自动驾驶汽车,医疗保健,安全和电子商务,仅举几例。通过展示从设置环境到对新数据进行预测的开始流程 - 它可以揭示与部署机器学习模型相关的复杂性。此外,它为可以建立更复杂的系统的基础奠定了基础。开发人员可以通过集成更高级的功能,尝试不同算法或利用较大的数据集进行培训,推动图像识别技术的进步来扩展这种基线模型。因此,该项目是社区的宝贵资源,在计算机愿景领域促进教育和创新。

此数据集在机器学习社区中众所周知,其中包含分布在10个不同类别的图像,为培训我们的模型提供了多样化的基础。

因此,不用更多的是,让我们深入研究!


什么是亚马逊射手制造商?

Amazon SageMaker是由Amazon Web Services(AWS)提供的全面管理的机器学习(ML)服务,旨在使开发人员和数据科学家能够快速和大规模地构建,培训和部署机器学习模型。它抽象并自动化机器学习管道中通常遇到的复杂过程,从而更容易开发高质量的模型。


技术要求

  1. Amazon SageMaker:这项完全管理的服务是该项目的核心,因为它促进了机器学习模型的建筑物,培训和部署。

  2. AWS身份和访问管理(IAM):设置允许SageMaker与其他AWS服务互动的必要权限至关重要。

  3. Amazon S3:该服务将用于存储数据集,并将其输出来自SageMaker培训工作。

  4. Python环境:您将需要一个Python环境来运行Jupyter笔记本,其中包括MXNET,OPENCV,BOTO3和TORCHVISION等PYTHON图书馆,这是各种任务所需的。

  5. python的AWS SDK(boto3):此SDK对于Python开发人员编写使用Amazon S3和Amazon EC2的服务的软件至关重要。

  6. Amazon EC2:该服务的实例在培训和部署阶段都使用;脚本中使用的特定实例是ML.p2.xlarge进行培训和ML.M4.XLARGE用于部署。

  7. mxnet和torchvision:使用神经网络并分别加载和准备数据集所需的这些框架。

  8. openCV:此库用于使用图像,包括读取和调整图像的正确格式。

  9. Runtime SageMaker:使用此端点来调用已部署的模型来对新数据进行预测。

  10. CIFAR-10数据集:此数据集是项目不可或缺的,为培训提供标准化的图像集合和验证图像分类模型。

  11. jupyter笔记本:理想情况下,您将在托管在Amazon Sagemaker笔记本上的Jupyter笔记本中运行此脚本。


培训和验证

Building, Training, and Validation

模型选择
在我们的项目中,我们利用了SageMaker的内置图像分类算法。但是,SageMaker支持各种算法和框架,使您能够选择最适合您任务的算法和框架。

超参数调整
为算法设置必要的超参数。在我们的脚本中,将层数设置为18个,并且该模型接受了10个时代的培训。微调这些超参数可以帮助实现更好的准确性。

培训
通过定义训练输入并使用SageMaker估算器拟合模型来启动训练过程。该模型利用培训和验证数据集学习基础模式并优化其参数。

在培训期间,萨吉人会自动管理基础架构,并根据需要进行扩展,以确保培训过程既快速又具有成本效益。

验证
训练后,必须使用验证数据集验证您的模型,以确保它可以很好地推广到新的,看不见的数据。在我们的脚本中,我们将CIFAR-10数据集的一部分分开,以验证培训过程。


是时候对其进行编码了!

步骤1:设置
确保您拥有启用SageMaker和S3服务的AWS帐户。旋转萨吉人笔记本并准备输入代码。通过运行:
,将必要的Python包装安装在Sagemaker上的Jupyter笔记本中
!pip install mxnet opencv-python boto3 torchvision

然后,我们可以导入我们在此实用中使用的所有依赖项。

import os
import boto3
import sagemaker
import numpy as np
import mxnet as mx
from sagemaker import get_execution_role
from sagemaker.amazon.amazon_estimator import get_image_uri
from sagemaker.inputs import TrainingInput
from mxnet.gluon.data.vision import datasets, transforms
from mxnet import recordio
from PIL import Image
from torchvision import datasets, transforms
import io

首先,调用get_execution_role()函数以检索与当前SageMaker Notebook实例相关的AWS身份和访问管理(IAM)角色,并确定SageMaker访问其他AWS服务的权限。接下来,使用sagemaker.session()启动了SageMaker会话,该会话将存储配置状态并促进与SageMaker服务的互动,并体现了将发生诸如培训和部署之类的SageMaker环境。最后,通过boto3.session()。

role = get_execution_role()
sess = sagemaker.Session()
region = boto3.Session().region_name

步骤2:获取并转换CIFAR-10数据集
获取CIFAR-10数据集并将其转换为Recordio格式,利用MXNET和TORCHVISION进行数据转换。 Recordio是SageMaker的首选格式,因为它在存储和流中的效率。

我们可以使用此脚本下载和转换CIFAR10数据并将其保存在笔记本上。

def fetch_and_convert_to_recordio():
    training_dataset = datasets.CIFAR10(root='data', train=True, transform=transforms.ToTensor(), download=True)
    validation_dataset = datasets.CIFAR10(root='data', train=False, transform=transforms.ToTensor())

    os.makedirs('data/train', exist_ok=True)
    os.makedirs('data/validation', exist_ok=True)

    # Convert Training Dataset to RecordIO
    record = recordio.MXRecordIO('data/train/train.rec', 'w')
    for i in range(len(training_dataset)):
        data, label = training_dataset[i]
        data = (data.numpy() * 255).astype(np.uint8).transpose(1, 2, 0)  # Convert to numpy array
        header = recordio.IRHeader(0, label, i, 0)
        s = recordio.pack_img(header, data, quality=100)
        record.write(s)
    record.close()

    # Convert Validation Dataset to RecordIO
    record = recordio.MXRecordIO('data/validation/validation.rec', 'w')
    for i in range(len(validation_dataset)):
        data, label = validation_dataset[i]
        data = (data.numpy() * 255).astype(np.uint8).transpose(1, 2, 0)  # Convert to numpy array
        header = recordio.IRHeader(0, label, i, 0)
        s = recordio.pack_img(header, data, quality=100)
        record.write(s)
    record.close()

fetch_and_convert_to_recordio()

之后,我们可以将数据上传到Amazon S3。在这种情况下,我们不会指定特定的S3存储桶,并让SageMaker上传到默认存储桶。

# Upload the data to S3
training_data = sess.upload_data(path='data/train', key_prefix='data/cifar10/train')
validation_data = sess.upload_data(path='data/validation', key_prefix='data/cifar10/validation')

步骤3:训练模型
我们将SageMaker的内置图像分类算法用于此项目。设置超参数,例如根据需要进行的图层,图像形状和时期的数量。

现在,我们使用get_image_uri函数来检索包含SageMaker图像分类算法的预构建的Docker映像的URI(统一资源标识符)。区域参数指定托管Docker图像所在的Amazon弹性容器注册表(ECR)所在的AWS区域。第二个参数“图像分类”表示应检索与SageMaker内置图像分类算法相对应的Docker映像。 repo_version ='最新'参数表示应检索此Docker映像的最新版本。 URI存储在Traine_image变量中,稍后可以在设置SageMaker培训工作时将其用于引用此Docker映像。此功能是SageMaker Python SDK的一部分,它通过允许开发人员轻松访问ECR中托管的预构建算法容器来帮助简化设置培训作业的过程。

training_image = get_image_uri(region, 'image-classification', repo_version="latest")

现在,我们让SageMaker估算器使用sagemaker.stimator.stimator类创建,该类可用于配置和启动AWS SageMaker中的培训作业。 Training_image参数指定要用于训练的Docker映像的URI,其中包含算法(在这种情况下为图像分类算法)。角色参数是AWS IAM角色,授予SageMaker权限访问AWS帐户中的资源。 instance_count和instance_type参数规定训练作业将在一个ml.p2.xlarge实例上运行,指定要用于培训的硬件。最后,SageMaker_Session参数用于传递包含会话的配置和凭据的SageMaker会话对象SES。此image_classifier对象稍后可用于设置超参数,将模型适合训练数据,并将模型部署到生产端点。

image_classifier = sagemaker.estimator.Estimator(training_image,
                                                 role,
                                                 instance_count=1,
                                                 instance_type='ml.p2.xlarge',
                                                 sagemaker_session=sess)

现在,我们在Image_Classifier对象上调用SET_HYPERPARAMETERS方法,该方法是SageMaker的估算器类的一个实例,以指定培训工作的超参数。 NUM_LAYERS参数设置为18,定义神经网络中的层数。 Image_Shape参数设置为“ 3,32,32”,表明输入图像的深度为3(颜色图像),大小为32x32像素。 NUM_CLASSES参数设置为10,指定模型应识别的不同类或类别的数量。 num_training_samples参数设置为50,000,表示可用的培训样本数量。最后,时期参数设置为10,确定整个培训数据集中的通行次数将完成机器学习算法的完成。这种配置从本质上微调训练过程,可能会影响最终模型的性能和准确性。

image_classifier.set_hyperparameters(num_layers=18,
                                     image_shape='3,32,32',
                                     num_classes=10,
                                     num_training_samples=50000,
                                     epochs=10)

然后,我们创建两个训练工具对象,以指定用于在SageMaker培训工作中使用的培训和验证数据集的配置。 training_data和validation_data参数指向相应数据集的S3 URI。分布参数设置为“完全复制”,这意味着每个培训实例将接收整个数据集。 content_type参数设置为“应用程序/x-recordio”,指示数据的MIME类型。 S3_DATA_TYPE参数设置为“ S3Prefix”,表明S3 URI指向S3中的前缀。在指定培训和验证数据输入后,使用键“火车”和“验证”创建了名为data_channels的字典来持有它们。最后,在Image_classifier对象(sagemaker估算器的实例)上调用了拟合方法,该拟合方法将通过data_channels字典作为输入参数传递,以启动培训作业,并将将参数设置为true设置为true以启用记录。该方法从定义的数据渠道和超级参数开始了模型培训过程,实时日志可提供有关培训过程的见解。

train_data = TrainingInput(training_data, distribution='FullyReplicated', 
                           content_type='application/x-recordio', s3_data_type='S3Prefix')
validation_data = TrainingInput(validation_data, distribution='FullyReplicated', 
                                 content_type='application/x-recordio', s3_data_type='S3Prefix')

data_channels = {'train': train_data, 'validation': validation_data}

image_classifier.fit(inputs=data_channels, logs=True)

步骤4:部署模型
训练模型后,将其部署在sagemaker端点上。您可以根据您的偏好和要求使用各种实例类型。

predictor = image_classifier.deploy(instance_type='ml.m4.xlarge', initial_instance_count=1)

步骤5:进行预测
部署模型后,是时候做出预测了。设置确保端点要加强输入图像并根据类概率接收预测结果。

使用cv2.imread()方法从指定的文件路径加载狗的图像,并调整到32x32像素,以匹配预训练的模型预期的输入大小。然后将图像编码为字节数组,该字节阵列是一种适合通过网络发送的格式。此后,boto3 sagemaker运行时客户端被实例化以调用sagemaker上托管的端点,该端点很可能托管已部署的图像分类模型。调整大小和编码的图像使用请求中的二进制有效载荷(由“应用程序/X-Image”内容类型指定)发送到此端点,并且在端点处托管的模型将处理此输入并在响应中返回预测。调用的特定sagemaker端点被其名称确定,这似乎是在创建时生成的时间戳标识符。该代码本质上是通过向其发送单个图像并等待收到响应中的分类预测来测试SageMaker端点。

import cv2
import boto3
import ast
import numpy as np

# Load image
img = cv2.imread('data/images/dog.jpg')
img = cv2.resize(img, (32, 32)) # Resize the image to the expected size

# Convert image to byte array
_, img_encoded = cv2.imencode('.jpg', img)
img_bytes = img_encoded.tostring()

# Use boto3 to send request
client = boto3.client('runtime.sagemaker')
response = client.invoke_endpoint(
    EndpointName='image-classification-2023-08-31-13-46-20-134',
    Body=img_bytes,
    ContentType='application/x-image',
)

最后,我们定义CIFAR-10类使用端点的响应来预测其属于哪个类。

# Define the CIFAR-10 classes
classes = ['Airplane', 'Automobile', 'Bird', 'Cat', 'Deer', 'Dog', 'Frog', 'Horse', 'Ship', 'Truck']

# Assume response is the response from the SageMaker endpoint
response_body = response['Body'].read()
print(response_body)
response_string = response_body.decode('utf-8')
probabilities = ast.literal_eval(response_string)

# Get the index with the maximum probability
predicted_class_index = np.argmax(probabilities)

# Get the name of the predicted class
predicted_class_name = classes[predicted_class_index]

# Print the predicted class
print(f"The model predicts the image belongs to class: {predicted_class_name} ({predicted_class_index})")

步骤6:清理
切记在实验之后删除端点和萨格人笔记本以避免不必要的费用。

与其他算法进行比较

内置图像分类算法提供了一种快速简便的方法来设置分类模型,但还有其他算法,例如VGG,Resnet和Custom CNN体系结构,尽管可能会以较高的计算成本提供更好的性能。您可能会探索这些可能在模型上获得更高的准确性。


未来发展方向

展望未来,有许多增强该项目的途径:

超参数调整:利用萨吉人的超参数调谐功能可以帮助查找最佳的超参数集,增强模型性能。
转移学习:您可以考虑使用转移学习来利用预训练的模型并为您的特定任务进行微调。
增强的预处理:通过更复杂的技术来增强数据预处理步骤,以改善模型的概括。
部署选项:探索不同的部署选项,例如使用AWS lambda和API网关部署模型作为微服务,以提供更可扩展和可维护的解决方案。


结论

总而言之,该项目展示了亚马逊射手制造商在构建和部署机器学习模型中的易用性和强大功能。它为希望潜入AWS机器学习的开发人员提供了一个绝佳的起点。

我们鼓励开发人员通过尝试不同的算法,优化和部署策略来进一步采取该项目。让我们继续推动我们可以通过AWS实现的界限!

随时在下面的评论部分中分享您的经验,见解或提出问题。


代码

对于代码,您可以在https://github.com/renaldig/image-recognition/blob/master/Image%20Recognition%20Notebook.ipynb上找到Jupyter笔记本。