使用 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)。
至于维数,您需要以某种方式将文本转换为固定长度的向量。具体如何操作完全取决于您要解决的问题。
例如,您可以使用词袋技术将短语转换为此类向量。您可以为此使用词嵌入、神经网络或任何其他常用技术。
但是您需要一些方法将文本转换为特征向量。
对于一个项目,我想创建一个 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)。
至于维数,您需要以某种方式将文本转换为固定长度的向量。具体如何操作完全取决于您要解决的问题。
例如,您可以使用词袋技术将短语转换为此类向量。您可以为此使用词嵌入、神经网络或任何其他常用技术。
但是您需要一些方法将文本转换为特征向量。