使用Apple CoreMLTools构建可更新的微型绘图分类器模型
概述
本文将介绍如何使用Apple CoreMLTools构建一个可更新的微型绘图分类器模型。这个模型采用管道(Pipeline)架构,由绘图嵌入模型和最近邻分类器组成,能够根据用户提供的示例进行持续训练和更新。
模型架构
该分类器模型由两个主要组件构成:
- 绘图嵌入模型:将28×28的灰度绘图图像转换为128维的特征向量
- 最近邻分类器:基于特征向量进行最近邻分类
模型初始状态下不包含任何训练样本,所有输入都会被分类为"unknown"。随着用户提供更多训练样本,模型可以不断更新和改进其分类能力。
输入要求
模型输入需要满足以下规范:
- 28×28像素的灰度图像
- 背景应为黑色(像素值0)
- 绘图笔画应为白色(像素值255)
构建步骤详解
1. 获取嵌入模型
首先需要获取预训练的绘图嵌入模型,该模型作为特征提取器使用:
import coremltools
from coremltools.models import MLModel
embedding_path = './models/TinyDrawingEmbedding.mlmodel'
embedding_model = MLModel(embedding_path)
embedding_spec = embedding_model.get_spec()
该嵌入模型的特点:
- 输入:28×28灰度图像
- 输出:128维浮点向量
- 基于卷积神经网络构建,移除了最后的分类层
2. 创建最近邻分类器
接下来创建可更新的最近邻分类器:
from coremltools.models.nearest_neighbors import KNearestNeighborsClassifierBuilder
import coremltools.models.datatypes as datatypes
knn_builder = KNearestNeighborsClassifierBuilder(
input_name='embedding',
output_name='label',
number_of_dimensions=128,
default_class_label='unknown',
k=3,
weighting_scheme='inverse_distance',
index_type='linear'
)
# 设置元数据
knn_builder.author = 'Core ML Tools Example'
knn_builder.license = 'MIT'
knn_builder.description = '基于3个最近邻对128维向量进行分类'
knn_spec = knn_builder.spec
分类器参数说明:
k=3
:考虑3个最近邻weighting_scheme='inverse_distance'
:使用距离倒数作为权重index_type='linear'
:使用线性搜索算法
3. 构建可更新管道模型
将两个组件组合成可更新的管道模型:
# 创建基础spec并设置为可更新
pipeline_spec = coremltools.proto.Model_pb2.Model()
pipeline_spec.specificationVersion = coremltools._MINIMUM_UPDATABLE_SPEC_VERSION
pipeline_spec.isUpdatable = True
# 设置输入输出
pipeline_spec.description.input.extend(embedding_spec.description.input[:])
pipeline_spec.description.output.extend(knn_spec.description.output[:])
pipeline_spec.description.predictedFeatureName = knn_spec.description.predictedFeatureName
pipeline_spec.description.predictedProbabilitiesName = knn_spec.description.predictedProbabilitiesName
# 设置训练输入
pipeline_spec.description.trainingInput.extend([embedding_spec.description.input[0]])
pipeline_spec.description.trainingInput[0].shortDescription = '示例绘图'
pipeline_spec.description.trainingInput.extend([knn_spec.description.output[0]])
pipeline_spec.description.trainingInput[1].shortDescription = '示例绘图对应的真实标签'
# 添加元数据
pipeline_spec.description.metadata.author = 'Core ML Tools'
pipeline_spec.description.metadata.license = 'MIT'
pipeline_spec.description.metadata.shortDescription = '可更新的微型绘图分类器模型'
# 组合模型
pipeline_spec.pipelineClassifier.pipeline.models.add().CopyFrom(embedding_spec)
pipeline_spec.pipelineClassifier.pipeline.models.add().CopyFrom(knn_spec)
# 保存模型
mlmodel = MLModel(pipeline_spec)
output_path = './TinyDrawingClassifier.mlmodel'
mlmodel.save(output_path)
模型更新机制
该模型的可更新性体现在:
- 初始状态下分类器不包含任何样本
- 可以通过添加新的训练样本不断扩充分类器的知识库
- 采用最近邻算法,新样本可以立即影响分类结果
- 默认返回"unknown"类别,避免对未知样本做出错误判断
应用场景
这种可更新的微型绘图分类器非常适合以下场景:
- 移动设备上的手写识别
- 简单图形分类应用
- 需要持续学习的个性化识别任务
- 资源受限环境下的轻量级分类解决方案
总结
通过CoreMLTools,我们构建了一个灵活、可更新的微型绘图分类器管道模型。这种架构结合了深度学习的特征提取能力和传统机器学习算法的灵活性,特别适合需要持续学习和个性化定制的应用场景。开发者可以根据实际需求调整模型参数,如最近邻数量(k值)或距离权重方案,以获得最佳的分类性能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考