首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在目标C中运行coreml

在目标C中运行coreml
EN

Stack Overflow用户
提问于 2017-11-28 15:07:05
回答 1查看 2.3K关注 0票数 3

我很难在Objective-C中创建一个非常简单的使用苹果的Objective-C的例子。我已经使用python创建了一个模型文件,该文件现在非常简单:

代码语言:javascript
复制
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'

代码语言:javascript
复制
#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;
}

如果能帮忙,我会很感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-04 07:16:08

首先,您需要导入模型类,在您的示例中,svm (将是更好的支持向量机,从大写字母开始):

代码语言:javascript
复制
#import "svm.h" 

这个类定义包含输入和输出以及方法定义所需的所有信息。当选择左侧的mlmodel文件时,可以单击类名旁边的小箭头,在自动生成的类描述中找到此规范。在这类描述中

在您的示例中,输入是一个以160个双元素作为向量的MLMultiArray。因此,首先使用形状数组定义维度。

代码语言:javascript
复制
NSArray *shape = @[@1, @160];

然后定义MLMultiArray,它将是预测过程的svmModelInput (再次由XCode自动定义):

代码语言:javascript
复制
    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再次构建的类:

代码语言:javascript
复制
        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检查为整数,并检查所有标签的概率,如下所示:

代码语言:javascript
复制
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";
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47534758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档