使用 CoreMLTools 3 beta 创建 KNearestNeighborsClassifier 时出错,并质疑如何正确设置维度

Error while creating KNearestNeighborsClassifier with CoreMLTools 3 beta and question how to set dimensions correctly

对于一个项目,我想创建一个 Core ML 3 模型,它正在接收一些文本(即来自邮件)并对其进行分类。此外,模型应该可以在设备上更新和训练。因此,我发现 KNearestNeighborsClassifier 可以更新,并想将它们用于我的方法。 但是,首先我得到一个错误

" RuntimeWarning: You will not be able to run predict() on this Core ML model. Underlying exception message was: Error compiling model: "Error reading protobuf spec. validator error: KNearestNeighborsClassifier requires k to be a positive integer."

同时使用脚本创建此类模型(见下文)。此外,我不确定如何正确使用 KNearestNeighborsClassifier 来解决我的问题。特别是,如果我想对一些文本进行分类,哪个维数是正确的?我将如何在应用程序中正确使用模型?也许你知道一些有用的指南,我还没有找到=

我创建 KNearestNeighborsClassifier 的脚本基于此指南:https://github.com/apple/coremltools/blob/master/examples/updatable_models/updatable_nearest_neighbor_classifier.ipynb 我已经安装并且正在使用 coremltools==3.0b6.

这是我创建模型的实际脚本:

number_of_dimensions = 128

from coremltools.models.nearest_neighbors import KNearestNeighborsClassifierBuilder

builder = KNearestNeighborsClassifierBuilder(input_name='input',
                                             output_name='output',
                                             number_of_dimensions=number_of_dimensions,
                                             default_class_label='defaultLabel',
                                             number_of_neighbors=3,
                                             weighting_scheme='inverse_distance',
                                             index_type='linear')

builder.author = 'Christian'
builder.license = 'MIT'
builder.description = 'Classifies {} dimension vector based on 3 nearest neighbors'.format(number_of_dimensions)

builder.spec.description.input[0].shortDescription = 'Input vector to classify'
builder.spec.description.output[0].shortDescription = 'Predicted label. Defaults to \'defaultLabel\''
builder.spec.description.output[1].shortDescription = 'Probabilities / score for each possible label.'

builder.spec.description.trainingInput[0].shortDescription = 'Example input vector'
builder.spec.description.trainingInput[1].shortDescription = 'Associated true label of each example vector'


#This lets the developer of the app change the number of neighbors at runtime from anywhere between 1 and 10, with a default of 3.
builder.set_number_of_neighbors_with_bounds(3, allowed_range=(1, 10))


# Let's set the index to kd_tree with leaf size of 30
builder.set_index_type('kd_tree', 30)


# By default an empty knn model is updatable
print(builder.is_updatable)

print(builder.number_of_dimensions)
print(builder.number_of_neighbors)
print(builder.number_of_neighbors_allowed_range())
print(builder.index_type)


mlmodel_updatable_path = './UpdatableKNN.mlmodel'

# Save the updated spec
from coremltools.models import MLModel
mlmodel_updatable = MLModel(builder.spec)
mlmodel_updatable.save(mlmodel_updatable_path)

我希望你能帮助我,告诉我我使用 KNearestNeighborsClassifier 进行文本分类的总体方法是否有意义,希望你能帮助我成功创建 CoreML 模型。

非常感谢。

不确定为什么会出现该错误,但请确保您使用的是最新(测试版)版本的 coremltools(目前为 3.0b6)。

至于维数,您需要以某种方式将文本转换为固定长度的向量。具体如何操作完全取决于您要解决的问题。

例如,您可以使用词袋技术将短语转换为此类向量。您可以为此使用词嵌入、神经网络或任何其他常用技术。

但是您需要一些方法将文本转换为特征向量。