記事

カスタムレイヤの作成

Core MLモデル用のカスタムレイヤを作成します。

概要

ニューラルネットワークレイヤがCore MLによってサポートされていない場合、モデル内のレイヤをCore MLに変換し、そのレイヤのコンピューティング動作を定義するバッキングクラスを実装することによって、カスタムレイヤを作成できます。

ネットワークをCore MLに変換する

標準のCore ML Tools(英語)を使用して、カスタムレイヤを含むネットワークをCore MLに変換します。コンバータが認識しないレイヤ(カスタムレイヤ)に遭遇した時に失敗しないように、コンバージョンコールでadd_custom_layersフラグを有効にします。変換プロセスの一環として、「custom」という名前のプレースホルダレイヤが挿入されます。リスト1は、スクリプト呼び出しのサンプルです。

リスト1

Core ML変換でのカスタムレイヤの有効化

coreml_model = keras_converter.convert(keras_model, add_custom_layers=True, ...

ネットワークのパラメータとウェイトの移行

ネットワークのパラメータは、カスタムレイヤのparametersフィールドに保存されるディクショナリです。実装したクラスを初期化すると、初期化をカスタマイズするために、これらのパラメータがカスタムクラスの実装に渡されます。

ウェイトを移行するには、カスタムレイヤに新しいウェイトの配列を作成し、元のソースレイヤから新しく作成した配列にウェイトをコピーします。

リスト2

ソースレイヤからカスタムレイヤへのウェイトのコピー

custom_weights = layer.custom.weights
# For each weight parameter in the Keras model, copy them into the custom layer
for weights in k_weights:
	migrated_weights = custom_weights.add()
	migrated_weights.floatValue.extend(map(float, weights.flatten().tolist()))

ウェイトは、大量のデータを最適に処理するためにバイナリ形式で保存されます。パラメータディクショナリはその反対で、アクセスは便利ですが、大量のデータには適していません。このことを念頭に置いて、カスタムレイヤのデータをパラメータとして表現するか、ウェイトとして表現するかを判断してください。

レイヤ名の定義

モデルを保存する前に、カスタムレイヤの名前を定義します。これは、カスタムレイヤの動作を実装するSwiftまたはOvjective-Cクラスの名前にもなります。

リスト3

レイヤをプロジェクト内のクラスにマッピングする、カスタムレイヤでのclassNameフィールドの設定

layer.custom.className = "MyCustomLayer"

変換されたモデルの保存

変換されたモデルを保存し、.mlmodelファイルを作成します。モデルのXcodeビューでは、カスタムレイヤの統合に示されているように、モデルの依存関係のセットが表示されます。このリストは、.mlmodelファイルに追加したカスタムレイヤクラス名と一致します。

レイヤの実装

依存関係のリストは、モデルを変換する際に定義したclassNameを含む必要があります。リスト3では、クラス名はMyCustomLayerです。クラスを作成し、以下で説明するメソッドを実装することによって、MLCustomLayer(英語)プロトコルに適合させます。

  • init(parameters:)(英語)を実装して、レイヤを適切に初期化します。このメソッドは、.mlmodelファイルからのパラメータを使用して、読み込み時に一度呼び出されます。

  • setWeightData(_:)(英語)を実装して、レイヤの結合のウェイトを設定します。このメソッドは、初期化後の読み込み時に一度、.mlmodelファイルに移行したウェイトを使用して呼び出されます。

  • outputShapes(forInputShapes:)(英語)を実装して、レイヤへの入力シェイプ(入力の数)に対する出力シェイプ(出力の数)を宣言します。このメソッドは、モデルの読み込み時に呼び出され、レイヤへの入力シェイプが変わるたびに再度呼び出されます。

  • evaluate(inputs:outputs:)(英語)を実装し、カスタムレイヤのコンピューティング動作を定義します。このメソッドは、CPUでモデルが予測を行うたびに呼び出されます。

  • オプションで、レイヤがGPUで動作できるようにするには、encode(commandBuffer:inputs:outputs:)(英語)を実装します。このメソッドは、GPU上での実行を保証するものではありません。

レイヤの統合

予測ワークフローは、カスタムレイヤを含まないモデルの場合と同じです。MLCustomLayerプロトコルが実装された状態で、同じprediction(from:)(英語)メソッドがモデルで動作します。精度については、カスタムのCore MLモデルを元の実装と比較してください。ネットワークの作成時に使ったテストケースを使って、Core MLモデルの動作を検証します。

関連項目

カスタマイズ

カスタムレイヤの統合

カスタムのニューラルネットワークレイヤをCore ML Appに統合します。

protocol MLCustomLayer(英語)

ニューラルネットワークモデルのカスタムレイヤの動作を定義するインターフェイスです。

protocol MLCustomModel(英語)

カスタムモデルの動作を定義するインターフェイスです。