iPhoneで初めての機械学習モデルを構築する方法

iPhoneで初めての機械学習モデルを構築する方法

導入

データサイエンティストとして、私は常に、トップテクノロジー企業が私と関係のある分野で新製品を発売し続けることを夢見てきました。

Apple の前回の iPhone X 発表イベントをご覧になった方は、iPhone X に FaceID、アニメーション表現、拡張現実など、機械学習を活用した非常に優れた機能がいくつか搭載されていることに気付くでしょう。私はハッカーなので、そのようなシステムを自分で構築する方法を探ることにしました。

さらに調査を進めていくと、興味深いツールが見つかりました。それは、Apple の開発者向け公式機械学習フレームワーク ツールである CoreML です。 iPhone、Macbook、Apple TV、Apple Watch など、あらゆる Apple デバイスで使用できます。

[[206275]]

もうひとつの興味深い発見は、Apple が最新の iPhone にカスタム GPU を設計したほか、機械学習を最適化するためのニューラル エンジンを搭載した A11 高度な Bionic プロセッシング チップも設計したことです。

コアコンポーネントのコンピューティングエンジンがますます強力になるにつれて、iPhone は機械学習の新たな道を切り開き、CoreML は将来ますます重要になるでしょう。

この記事を読めば、Apple CoreML とは何か、そしてなぜそれが勢いを増しているのかが分かるでしょう。また、iPhone 上でスパム SMS 分類アプリを開発することで、CoreML の実装の詳細を探ります。

同時に、CoreML の長所と短所を客観的に評価してこの記事を締めくくります。

記事ディレクトリ:

  1. CoreMLとは何ですか?
  2. システムを構築する
  3. ケーススタディ: iPhone でのスパム SMS 分類アプリの実装
  4. CoreML を使用するメリットとデメリット

01. CoreMLとは何ですか?

今年、Apple は毎年開催される世界開発者会議 (Google の I/O カンファレンスに類似) WWDC で CoreML を発表し、大きな話題を呼びました。 CoreML の機能をよりよく理解するには、いくつかの背景を理解する必要があります。

CoreMLの背景

興味深いことに、Apple がモバイル機械学習フレームワークをリリースするのは今回が初めてではありません。昨年、同じフレームワーク ライブラリがいくつかリリースされました。

  1. Accelerate Framework と Basic Neural Network Subroutines (BNNS) — CPU を効率的に利用し、畳み込みニューラル ネットワークを使用して予測を行います。
  2. Metal Performance Shaders CNN (MPSCNN) - GPU を効率的に利用し、畳み込みニューラル ネットワークを使用して予測を行います。

これら 2 つのフレームワーク ライブラリの違いは、一方が CPU 用に最適化され、もう一方が GPU 用に最適化されていることです。これは、推論中は CPU が GPU よりも高速になることがある一方で、トレーニング中は GPU がほぼ常に高速になるためです。

しかし、パフォーマンスを向上させるために、フレームワークは基盤となるハードウェアに非常に近づくため、これらのハイブリッド フレームワークは開発者にとってわかりにくく、プログラミングが困難になります。

CoreMLの登場

CoreML は、上記の 2 つのライブラリの上に抽象化レイヤーを提供し、同じ効率を実現するためのシンプルなインターフェースも提供します。もう 1 つの利点は、アプリの実行時に CoreML が CPU と GPU 間のコンテキスト切り替えを最大限に活用することです。

つまり、テキスト処理(自然言語処理)などのメモリを大量に消費するタスクの場合は、CoreML が自動的に CPU で実行され、画像認識などの計算負荷の高いタスクの場合は GPU が使用され、アプリに両方の機能が含まれている場合は、両方が最大限に活用されるように自動的に切り替わります。

CoreML は他に何を提供しますか?

CoreML にはさらに 3 つのライブラリが付属しています。

  1. ビジョン: このライブラリは、画像やビデオ内の顔認識、特徴検出、シーン認識のための高性能な画像分析とコンピューター ビジョン技術を提供します。
  2. Foundation(NLP): 名前の通り、自然言語処理のための機能を提供します。
  3. Gameplay Kit: AI も提供し、決定木を使用するゲーム開発用のライブラリ。

上記のライブラリはすべて、いくつかのシンプルなインターフェースで簡単に使用でき、さまざまなタスクを実行するために使用できます。上記のライブラリを使用すると、CoreML の最終的なフレームワーク図は次のようになります。

上記の設計は、iOS アプリケーションに優れたモジュール構造を提供することに注意してください。さまざまなタスクにさまざまなレイヤーを使用し、それらをさまざまな方法で使用できます (たとえば、アプリでの画像分類に NLP を使用するなど)。詳細については、Vision、Foundation、GameplayKit をご覧ください。さて、理論は十分理解できたので、実践に移りましょう。

「WeChatのレイアウト制限により、コードが必要な学生は記事の最後にある元のリンクを調べて自分で見つけることができます。」

02. システムを確立する

CoreML を完全に使用するには、次の要件に従う必要があります。

1.OS: MacOS (Sierra 10.12以上)

2.Python 2.7 および pip: クリックして Mac に Python をダウンロードします。ターミナルを開き、次のコードを入力して pip をインストールします。

  1. sudo 簡単インストール pip

3.coremltools: このパッケージは、モデルを Python から CoreML が理解できる形式に変換するのに役立ちます。インストールするには、ターミナルに次のコードを入力します。

  1. sudo pip インストール -U coremltools

4.Xcode 9: これは、Apple デバイス上でアプリケーションを構築するためのデフォルトのソフトウェアです。ダウンロードするにはここをクリックしてください。 Xcode をダウンロードする前に、Apple ID でログインする必要があります。

ログイン後、Apple ID を確認する必要があります。 Apple ID が登録されているデバイスにも同じ通知が届きます。

「許可」をクリックし、Web サイトに表示された 6 桁のパスワードを入力します。

この手順を完了すると、ダウンロード オプションが表示されます。そこからXcodeをダウンロードできます。システムがセットアップされたので、準備ができたら実装部分に進みましょう。

03. ケーススタディ: iPhone でのスパム SMS 分類アプリの実装

この開発では、CoreML の機能を 2 つの重要な方法で使用することに重点を置きます。さあ始めましょう!

機械学習モデルをCoreML形式に変換する

CoreML の強みの 1 つ、あるいは作成者による賢明な決断の 1 つは、sklearn、caffe、xgboost などの他の一般的なフレームワークでトレーニングされた機械学習モデルの変換をサポートしていることです。

データ サイエンス コミュニティは、お気に入りの環境で実験し、モデルをトレーニングし、iOS/macOS 上のアプリに簡単にインポートして使用できるため、CoreML を試すことに躊躇しないでしょう。

CoreML がすぐにサポートするフレームワークは次のとおりです。

Mlmodel とは何ですか?

変換プロセスを容易にするために、Apple はクロスフレームワーク機械学習モデルを表す独自のオープン形式、つまり mlmodel を設計しました。このモデル ファイルには、モデルの各レイヤー、入力、出力、クラス ラベル、およびデータに対して実行する必要がある前処理の説明が含まれています。学習したパラメータ(重みとバイアス)も含まれます。

変換プロセスは次のとおりです。

  1. お気に入りのフレームワークでモデルをトレーニングする
  2. Pythonモジュールcoremltoolsを使用してモデルを.mlmodel形式に変換します。
  3. アプリでモデルを使用する

この例では、sklearn でスパム分類器をトレーニングし、モデルを CoreML に転送します。

スパムテキストメッセージデータセットについて

SMS スパム データセット v.1 は、モバイル スパム テキスト メッセージの調査に使用される、公開 SMS 注釈付きテキスト メッセージ データセットです。これには、正規(不自然なもの)またはスパムとしてマークされた、暗号化されていない実際の英語のテキスト メッセージが 5,574 件含まれています。

データセットはここからダウンロードできます。

基本モデルの構築

基本モデルの構築には、sklearn の LinearSVC を使用します。同時に、SMS テキストの TF-IDF 値をモデル特徴として抽出します。 TF-IDF は、文書を一意に識別する単語に基づいて文書を分類する自然言語処理の手法です。 NLP と tf-idf について詳しく知りたい場合は、この記事をお読みください。コードは次のとおりです。

  1. import numpy as npi import pandas as pd #読み込み データを解析しますraw_data = open ( 'SMSSpamCollection.txt' , 'r' )sms_data = [] for line in raw_data: split_line = line.split( "\t" ) sms_data.append(split_line)
  2. # データをメッセージラベルトレーニングテスト分割ms_data = np.array(sms_data) X = sms_data[:, 1] y = sms_data[:, 0]  
  3. #LinearSVC モデルを構築するfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.svm import LinearSVC  
  4. #データtf-idf ベクトル表現を構築vectorizer = TfidfVectorizer()vectorized_text = vectorizer.fit_transform(X)text_clf = LinearSVC()text_clf = text_clf.fit(vectorized_text, y)

モデルが構築されたので、スパム メッセージでテストしてみましょう。

  1. #モデルをテストするprint text_clf.predict(vectorizer.transform([ "" "XXXMobileMovieClub: クレジットを使用するには、次のテキスト メッセージの WAP リンクをクリックするか、ここをクリックします>> http://wap. xxxmobilemovieclub.com?n=QJKGIGHJJGCBL" "" ]))

興味深いですね。私たちのモデルはかなりうまく機能しています。相互検証を追加してみましょう。

  1. #クロス検証from sklearn.model_selection import cross_val_scorecross_score = cross_val_score(text_clf, vectorized_text, y, cv=10)print cross_scoreprint "mean:" ,np.mean(cross_score)
  2. モデルが構築されたので、CoreML に適合させるために、.mlmodel 形式に変換する必要があります。これは、以前にインストールされた coremltools ツールキットを使用して実行されます。次のコードはモデルを .mlmodel 形式に変換できます。  
  3. coremltoolsをインポートする 
  4. 変換する  CoreMLモデル 
  5. coreml_model = coremltools.converters.sklearn.convert (text_clf、 "メッセージ" "spam_or_not" )  
  6. #モデルパラメータを設定する 
  7. coreml_model.short_description = "メッセージがスパムかどうかを分類する"    
  8. coreml_model.input_description[ "message" ] = "分類するメッセージのTFIDF"    
  9. coreml_model.output_description[ "spam_or_not" ] = "メッセージがスパムかどうか"    
  10. #モデルを保存する 
  11. coreml_model.save( "SpamMessageClassifier.mlmodel" )

これはどのように作動しますか?

まず、coremltools Python ツールキットを使用します。次に、モデルを変換するためのコンバーターを選択します。この例では、変換するモデルが sklearn ツールを使用して構築されているため、 converters.sklearn が使用されます。次に、.convert() 括弧内にモデル オブジェクト、入力変数名、および出力変数名を宣言します。次に、モデルパラメータを設定して入力と出力に関する詳細情報を追加し、最後に .save() を使用して CoreML 形式に変換されたモデルファイルを保存します。

モデル ファイルをダブルクリックすると、Xcode で開きます。

ご覧のとおり、モデル ファイルには、モデルのタイプ、その入力、出力、入力と出力のタイプなどに関する多くの情報が表示されます。上の写真では赤でマークしました。これらの説明を、.mlmodel に変換するときに提供されるものと 1 つずつ比較することができます。

独自のモデルを CoreML にインポートするのはとても簡単です。モデルが Apple エコシステムに組み込まれたので、本当の楽しみが始まります。

注: この手順の完全なコード ファイルはここにあります。 coremltools の詳細についてはここを、提供されているさまざまな種類のコンバーターの詳細についてはここを参照してください。

このモデルをアプリで使用する

モデルをトレーニングして CoreML にインポートしたので、それを使用して iPhone スパム分類アプリを開発してみましょう。

シミュレータ上でアプリを実行します。シミュレーターは、実際に iPhone 上で動作するのと同じように、アプリのインターフェースと操作を表示するソフトウェアです。これにより、iPhone でアプリを実行する前にコードをテストしてデバッグできるため、多くの時間を節約できます。最終製品は次のようになります。

プロジェクトをダウンロード

私たちのアプリ用のシンプルな基本 UI を作成し、GitHub に公開しました。次のコマンドでロードして実行します。

  1. gitクローンhttps://github.com/mohdsanadzakirizvi/CoreML-on-iPhone.git  
  2. cd CoreML- on -iPhone/Practice\ App/  
  3. coreml\ test.xcodeproj/を開く

これにより、Xcode でプロジェクトが開きます。

Xcode ウィンドウで 3 つの重要な領域を赤で強調表示しました。

  1. 左上隅の再生ボタンは、シミュレーターでアプリの実行を開始するために使用されます。
  2. 再生ボタンのすぐ下に、プロジェクトに関連するファイルとフォルダーがリストされます。これはプロジェクト ナビゲーション バーであり、プロジェクト内のファイルやフォルダーを簡単に見つけることができます。
  3. 「再生」ボタンの横に「iPhone 8」と書かれており、シミュレーターでエミュレートするデバイスを示しています。それをクリックして、ドロップダウンリストから iPhone 7 を選択できます。

アプリを実行して何が起こるか見てみましょう。左上隅の再生ボタンをクリックして、シミュレーターでアプリを実行します。ボックスにテキストを入力して、「予測」ボタンをクリックするだけです。どうしたの?

これまでのところ、アプリはボックスに入力されたテキストをそのまま出力するだけです。

トレーニング済みのモデルをアプリに追加する

とても簡単です:

  • .mlmodel モデル ファイルを Xcode ウィンドウのプロジェクト ナビゲータにドラッグします。
  • 完了すると、いくつかのオプションを含むウィンドウがポップアップ表示されます。デフォルトのオプションを選択し、「完了」をクリックします。
  • このようにファイルを Xcode にドラッグすると、プロジェクト内にファイルへの参照パスが自動的に生成されます。こうすることで、コード内でファイルに簡単にアクセスできます。

モデルをコンパイルする

モデルを推論に使用する前に、ビルド フェーズ中に Xcode でモデルをコンパイルする必要があります。具体的な手順は次のとおりです。

プロジェクト ナビゲーション バーで青いアイコンの付いたファイルを選択します。

プロジェクト設定が右側に開きます。 「ソースのコンパイル」をクリックし、「+」アイコンを選択します。

表示される新しいウィンドウで、SpamMessageClassifier.mlmodel ファイルを選択し、「追加」をクリックします。

これで、アプリを実行するたびに、Xcode によって機械学習モデルがコンパイルされ、予測に使用できるようになります。

コードでモデルを作成する

Apple デバイス向けに開発されるアプリはすべて Swift でプログラムされています。 Swift を学ぶ必要はありませんが、後でさらに深く学びたい場合は、このチュートリアルに従ってください。

プロジェクトナビゲータで ViewController.swift を選択します。このファイルには、アプリの機能を制御するコードのほとんどが含まれています。

24 行目の predictSpam() 関数が最も多くの作業を実行します。 25 行目を削除し、関数に次のコードを追加します。

  1. enterMessage = messageTextField.text とします。  
  2. if (入力されたメッセージ != "" ){  
  3. spamLabel.text = ""    
  4. }  
  5. //テキストtfidf表現を取得する 
  6. vec = tfidf(sms: 入力されたメッセージ) とします。  
  7. する {  
  8. //テキスト予測を取得する 
  9. 予測 = 試しに SpamMessageClassifier().prediction(message: vec).spam_or_not を実行してください。  
  10. 印刷(予測)  
  11. if (予測 == "スパム" ){  
  12. spamLabel.text = "スパム!"  
  13.   }  
  14. そうでない場合(予測 == "ハム" ){  
  15. spamLabel.text = "スパムではありません"    
  16. }  
  17. }  
  18. キャッチ{  
  19. spamLabel.text = "予測なし"    
  20. }

上記のコードは、ユーザーがボックスに情報を入力したかどうかを確認します。はいの場合は、tfidf() 関数を呼び出してテキストの tfidf 値を計算します。次に、SpamMessageClassifier オブジェクト インスタンスを作成し、.prediction() 関数を呼び出します。これは、sklearn の .predict() 関数と同じです。そして、予測に基づいて適切な情報を表示します。

しかし、なぜ tfidf() が必要なのでしょうか?

モデルはテキストの tf-idf 表現でトレーニングされるため、モデルには同じ形式の入力が必要であることに注意してください。テキスト ボックスに情報を入力したら、tfidf() 関数を呼び出して同じことを行います。このステップのコードを書いてみましょう。次のコードをコピーして、predictSpam() 関数の後に配置します。

  1. //MARK: 機能コード 
  2. 関数tfidf(sms: String) -> MLMultiArray{  
  3. //ファイルパスを取得 
  4. wordsFile を Bundle.main.path(forResource: "wordlist" 、 ofType: "txt" )とします。  
  5. smsFile = Bundle.main.path(forResource: "SMSSpamCollection" 、ofType: "txt" )とします。  
  6. する {  
  7. //単語ファイルを読み取る 
  8. wordsFileText = try String(contentsOfFile: wordsFile!, encoding: String.Encoding.utf8) とします。  
  9. var wordsData = wordsFileText.components(区切り文字: .newlines)  
  10. wordsData.removeLast() // 末尾の改行。  
  11. //スパム収集ファイルを読み取る 
  12. smsFileText = try String(contentsOfFile: smsFile!, encoding: String.Encoding.utf8) とします。  
  13. var smsData = smsFileText.components(区切り文字: .newlines)  
  14. smsData.removeLast() // 末尾の改行。  
  15. wordsInMessage = sms.split(セパレーター: " " )とします。
  16.   //多次元配列を作成する 
  17. ベクトル化して、MLMultiArray(shape: [NSNumber(integerLiteral: wordsData.count )], dataType : MLMultiArrayDataType.double )を試します。  
  18. iが 0場合...  
  19. 単語 = wordsData[i]とする 
  20. sms.contains (単語) {  
  21. var 単語数 = 0  
  22. wordsInMessage{内のsubstrについて 
  23. substr.elementsEqual(word{  
  24. 単語数 += 1  
  25. }  
  26. }
  27.   tf = Double (wordCount) / Double ( wordsInMessage.count )とします。  
  28. var ドキュメント数 = 0  
  29. smsData{内のsmsの場合 
  30. sms.contains (単語) {  
  31. ドキュメント数 += 1  
  32. }
  33. }  
  34. idf = log( Double (smsData.count ) / Double (docCount))とします。  
  35. ベクトル化された[i] = NSNumber(値: tf * idf)
  36.   }それ以外{  
  37. ベクトル化[i] = 0.0  
  38. }  
  39. }  
  40. ベクトル化された戻り値 
  41. } キャッチ {  
  42. MLMultiArray()を返す 
  43. }  
  44. }

上記のコードは、テキスト ボックスに入力された情報の tfidf 表現を取得します。これを行うには、SMSSpamCollection.txt の元のデータベースを読み取り、同じ情報を返します。プロジェクトを保存してシミュレーターを再度実行すると、アプリは正常に実行されるはずです。

4. CoreMLのメリットとデメリット

すべての開発ライブラリと同様に、CoreML にも長所と短所があります。はっきりさせておきましょう。

アドバンテージ:

  • モバイル デバイスのパフォーマンスを最適化し、メモリとエネルギーの消費を最小限に抑えます。
  • モバイル デバイス上で実行することでユーザーのプライバシーが確保され、予測のためにデータをサーバーに送信する必要がなくなります。
  • モバイル デバイス上で実行すると、インターネットに接続していないときでも予測を行うことができ、ユーザーへの応答時間が大幅に短縮されます。
  • CPU または GPU (あるいはその両方) で実行するかどうかを決定する機能。

CPU を使用できる為、iOS シミュレータ上で実行できます (iOS シミュレータは GPU をサポートしていません)。

他の主流の機械学習フレームワークからモデルをインポートできるため、多くのモデルが提供されます。

  • サポートベクターマシン (SVM)
  • ランダムフォレストやブーストツリーなどのツリーアンサンブル
  • 線形回帰とロジスティック回帰
  • ニューラル ネットワーク: フィードフォワード、畳み込み、再帰

欠点:

  • 教師ありモデルのみがサポートされており、教師なしモデルや強化学習はサポートされていません。
  • デバイス上でのモデルの再トレーニングはサポートされておらず、予測のみ実行できます。
  • CoreML が特定のレイヤーをサポートしていない場合、そのレイヤーは使用できません。現在、独自のレイヤーを使用して CoreML を拡張することはできません。
  • CoreML ツールは、少数のトレーニング ツールの特定のバージョンのみをサポートしています (Tensorflow もサポートしていません)。
  • 中間層の出力は表示されず、予測結果のみを取得できます。
  • 回帰と分類のみがサポートされます (クラスタリング、ソート、次元削減などはサポートされません)。

結論

この記事では、CoreML について学び、それを iPhone 機械学習アプリの開発に適用しました。 CoreML は新しいライブラリであるため、独自の長所と短所があります。非常に便利な利点は、ローカル デバイス上で実行されるため、高速でデータのプライバシーが保証されることです。しかし同時に、それは包括的ではなく、データ サイエンティストのニーズを十分に考慮していません。今後のバージョンでは改善が期待されます。

途中で行き詰まった場合は、この記事のすべてのコードを GitHub で入手できます。

<<:  AI(ディープラーニング)の簡単な分析:AIはあなたの仕事を奪うでしょうか?

>>:  Weibo ディープラーニング プラットフォームのアーキテクチャと実践

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

チャットボット vs モバイルアプリ: 未来はどちらの手に?

[[272171]]チャットボットとモバイルアプリの戦いは、常に業界で最も議論されているトピックの...

人工知能はどのような通信分野に応用されていますか?

1. 異常なネットワークトラフィックの検出コンピュータネットワークは現代人の生活に欠かせないもので...

...

...

3つの主要な要因の影響を受けて、自動運転トラックの開発は加速し続けています

近年、自動運転は幅広い注目を集め、熱い議論を呼んでいます。自動運転は自動車産業の将来のトレンドである...

ロボットは「赤ちゃんを作る」こともできる:世界初の生きたロボットが生命の新たな繁殖方法を生み出す

[[437620]]彼らは何百もの自由細胞を集めて、「パックマン」の形をした「口」の中に「次世代」を...

システムアーキテクト、アルゴリズムエンジニア、人工知能エンジニアはどの程度の数学を学ぶ必要がありますか?

オリンピック数学を勉強したことがない彼に、システム アーキテクトになれるかと誰かが尋ねました。他にも...

...

新参者と大企業が直接会うとき、研究室なしではやっていけないことがよくある | T Guanhai

インタビューゲスト | アンジー・チュー、ロージー・チャン編集者 | ユン・チャオ海を観察する人は、...

Googleの新しい研究により、ロボット犬が速歩することが可能になった

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

...

技術革新により、AI人材が全国各地で活躍できるようになった

人力の60倍の速さで作業する送電線検査画像「認識者」、ベテラン並みの監視ビデオ「品質検査員」、さまざ...

声を上げてください! MakeItTalkの魔法でモナリザと会話できる

最近、マサチューセッツ大学アマースト校のヤン・チョウ博士とそのチームは、「MakeItTalk」と呼...

...

見逃しているかもしれない 3 つの重要な AI トレンド

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...