我很难在Objective-C中创建一个非常简单的使用苹果的Objective-C的例子。我已经使用python创建了一个模型文件,该文件现在非常简单:
coreml_model_svm = coremltools.models.MLModel("svm.mlmodel")
test_x = [1.0 for x in range(160)]
predictions_coreml_svm = coreml_model_svm.predict({"input":test_x})我想在Objective-C中复制以上三行。我知道我的数据必须是一个MLMultiArray,模型需要加载到MLModel中。我一直试图找到一些关于语法的信息,但是我似乎不明白文档是如何工作的,所有的例子都用Swift语言。到目前为止,这是我的密码。注释MLMultiArray会导致初始化MLModel的异常。当不评论MLMultiArray时,我得到了no known class method for selector 'initWithShape:dataType:error'。
#import <Foundation/Foundation.h>
#import <CoreML/CoreML.h>
//clang -framework Foundation coremltest.m -o coremltest
int main (int argc, const char * argv[])
{
NSLog(@"start");
NSArray * shape = [[NSArray alloc] init];
MLMultiArrayDataType dataType = MLMultiArrayDataTypeDouble;
NSError * error = nil;
MLMultiArray * input = [MLMultiArray initWithShape:(NSArray*) shape
dataType:(MLMultiArrayDataType ) dataType
error:(NSError **) error];
MLModel * mymodel = [[MLModel init] initWithContentsOfFile:@"svm.mlmodel"];
return 0;
}如果能帮忙,我会很感激的。
发布于 2017-12-04 07:16:08
首先,您需要导入模型类,在您的示例中,svm (将是更好的支持向量机,从大写字母开始):
#import "svm.h" 这个类定义包含输入和输出以及方法定义所需的所有信息。当选择左侧的mlmodel文件时,可以单击类名旁边的小箭头,在自动生成的类描述中找到此规范。在这类描述中

在您的示例中,输入是一个以160个双元素作为向量的MLMultiArray。因此,首先使用形状数组定义维度。
NSArray *shape = @[@1, @160];然后定义MLMultiArray,它将是预测过程的svmModelInput (再次由XCode自动定义):
MLMultiArrayDataType dataType = MLMultiArrayDataTypeDouble;
NSError *error = nil;
MLMultiArray *theMultiArray = [[MLMultiArray alloc] initWithShape:(NSArray*)shape
dataType:(MLMultiArrayDataType)dataType
error:&error] ;
for (int i = 0; i < 160; i++) {
[theMultiArray setObject:[NSNumber numberWithDouble:1.0] atIndexedSubscript:(NSInteger)i];
}用过
initWithShape
是苹果的MLMultiArray方法。我在数组中填充了"1“以供测试,但您必须稍后用真正的输入来替换它。
不需要获取模型,只需实例化svm,然后运行
predictionFromInput:
方法,该方法来自XCode再次构建的类:
svm *mySvm = [[svm alloc] init];
svmOutput * svmModelOutput = [(svm *)mySvm predictionFromInput:theMultiArray error:&error];
NSLog(@"SVM Model output = %lld -- %@", svmModelOutput.classLabel, svmModelOutput.classProbability );
if (!error)
{
NSLog(@"svm finished without error");
}
else
{
NSLog(@"Error: %@", error.localizedDescription);
}当您打印出svmModelOutput (由XCode为您创建)时,您可以将预测的classLabel检查为整数,并检查所有标签的概率,如下所示:
2017-12-04 07:32:45.765015+0100 CoreML_test[2634:877638] SVM Model output = 2 -- {
11 = "0.002656571278812773";
3 = "0.2121030282896462";
10 = "0.004570897664662783";
2 = "0.5825387375626612";
9 = "0.02911120023388797";
4 = "0.1690195649703292";
}https://stackoverflow.com/questions/47534758
复制相似问题