2017-11-28 44 views
1

Objective-CにAppleのCoreMLという非常に簡単な例を作成するのに問題があります。私はすでにかなり単純に機能するようになりましたpythonを使用してモデルファイルを作成しました:Object-Cでcoremlを実行しています

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に上記の3本のラインを再現したいと思います。私のデータは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; 
} 

私はこれに助けていただきありがとうございます。

+0

なぜObjective-Cを使いたいのか不思議です。上記のコードは有効なObj-Cではありません。これはあなたがその言語に堪能ではないと信じさせてくれます。それが事実なら、なぜそれを使うのですか?どのような場合でも、コードは次のようになります。 'MLMultiArray * input = [MLMultiArray initWithShape:@ [@ 10、@ 10] dataType:MLMultiArrayDataTypeDoubleエラー:&error];' MLModel * model = [[MLModel alloc] initWithContentsOfFile :@ "name"]; ' –

答えて

1

あなたのモデルクラスをインポートする必要がまず第一に、あなたのケースのSVM(大文字で始まるSVM方が良いでしょう)に:

#import "svm.h" 

このクラス定義はあなたが必要とするすべての情報が含まれています入力と出力、およびメソッド定義。 左のmlmodelファイルを選択したときに、クラス名のすぐ隣の小さな矢印をクリックすると、この仕様が自動的に生成されたクラスの説明に表示されます。あなたのケースでは、このクラスの説明

enter image description here

で入力がベクトルとして160個のダブル要素を持つMLMultiArrayです。

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]; 
    } 

使用:だから最初

NSArray *shape = @[@1, @160]; 

そして(自動的に再度XCodeのによって定義される)予測処理のためにあなたのsvmModelInputなりMLMultiArrayを定義形状アレイと大きさを定義します

initWithShape

は、MLMulアップルのtiArrayメソッド。私はテストのためだけに配列を "1"で埋めましたが、実際にあなたの実際の入力と置き換えなければなりません。

あなたのモデルを取得する必要はありませんが、もう一度XCodeので構築されたクラスからです

predictionFromInput:

方法実行し、あなたのSVMをインスタンス化:あなたはをプリントアウトしたよう

 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"; 
} 
関連する問題