ONNX (.onnx)

予備知識

    • ニューラルネットワークモデルのためのオープン形式.
    • モデルおよびさまざまなメタデータを保存する.
    • ONNXはOpen Neural Network Exchangeの頭字語である.
    • Protobufに基づくバイナリファイル形式.
    • 2017年にMicrosoftとFacebookによってリリースされた.

ImportとExport

  • Import["file.onnx"]は指定のファイルに保存されたネットワークをインポートし,それをNetChainNetGraph,またはそれに似た構造として返す.
  • Import["file.onnx",elem]は指定の要素 elem をインポートする.
  • インポート形式はImport["file","ONNX"]またはImport["file",{"ONNX",elem,}]で指定できる.
  • Export["file.onnx",net] net をONNXモデルとしてエキスポートする.
  • 以下の式がサポートされている:
  • NetChain[]層の鎖として表されるネットワーク
    NetGraph[]層のグラフとして表されるネットワーク
    layerLinearLayer等の任意のネットワーク層
  • 一般的な情報は,以下の関数ページを参照のこと.
  • Import, Exportファイルからインポートする,あるいはファイルへエキスポートする
    CloudImport, CloudExportクラウドオブジェクトからインポートする,あるいはクラウドオブジェクトへエキスポートする
    ImportString, ExportString文字列からインポートする,あるいは文字列へエキスポートする
    ImportByteArray, ExportByteArrayバイト配列からインポートする,あるいはバイト配列へエキスポートする

Import要素

  • 一般的なImport要素:
  • "Elements" ファイル中の有効な要素とオプションのリスト
    "Summary"ファイルの概要
    "Rules"使用可能なすべての要素の規則のリスト
  • Import要素:
  • "ArrayAssociation"連想として表されたパラメータ配列
    "ArrayList"リストとして表されたパラメータ配列
    "Description"モデルの可読の記述
    "ONNXGraph"ネットワークのONNX表現
    "ModelDomain"モデルの名前空間またはドメイン
    "ModelVersion"モデルの整数バージョン番号
    "Net"すべての初期化済み配列を含む,ネットワークのWolfram言語表現(デフォルト)
    "NetExternalObject"ネットワークのNetExternalObject 表現
    "IRVersion"モデルが使用する,ONNXの中間表現バージョン
    "OperatorSetVersion"モデルが対応する演算子セット
    "ProducerName"モデルの生成に使用されるツールの名前
    "ProducerVersion"生成ツールのバージョン
    "RawData"グラフ表現とすべてのメタデータを含む,ファイルの処理されていない完全な内容
    "UninitializedNet"配列を使わない,ネットワークのWolfram言語表現

オプション

  • Import オプション:
  • "Arrays"Noneネットワーク用の追加の配列を含む有効なONNXテンソルprotoファイルへのパスまたはパスのリスト
  • Export オプション:
  • "Description"NoneONNXメタデータのモデルドキュメント文字列
    "ExternalArrays"Automaticネット配列を別々のファイルにエキスポートする
    "GraphName"AutomaticONNXメタデータ内のグラフの名前
    "ModelVersion"0ONNXメタデータ内のモデルのバージョン
    "OperatorSetVersion"Automaticモデルで使用する標準ONNX演算子セットのバージョン
  • オプション"ExternalArrays" は次の設定ができる:
  • Automaticモデルサイズに依存するネット配列の外部ファイルを生成する
    Noneモデルファイルにネットワーク配列を含む
    Allネット配列を別々のファイル(一つの配列を一つのファイル)にエキスポートする
    "Single"すべてのネット配列を一つのファイルにエキスポートする
  • "ExternalArrays"Automatic に設定すると,モデルサイズの合計が2GB以下のときはNone,2GB以上のときは"Single"に相当する. All"Single"の設定の場合,配列ファイルが主要なモデルファイルと同じディレクトリに生成される.すべてのONNXインポータはこのようなファイルが同じ相対パスにあることを想定している.

例題

すべて開くすべて閉じる

  (2)

ネットワークをONNX形式でインポートする:

このファイルで利用できるImport要素を示す:

ネットワークをONNX形式でエキスポートする:

Import要素  (14)

ArrayAssociation  (1)

名前を指定のONNXネットワークの配列にマップする連想を取得する:

ArrayList  (1)

指定のONNXネットワークの配列のリストを取得する:

Description  (1)

指定のONNXネットワークについての説明を取得する:

ONNXGraph  (1)

指定のネットワークのONNX表現を取得する:

ModelDomain  (1)

指定のネットワークのONNXモデルドメインを取得する:

ModelVersion  (1)

指定のネットワークのONNXモデルのバージョンを取得する:

Net  (1)

ONNXモデルをWolfram言語ネットワークとしてインポートする:

これはデフォルトの要素である:

NetExternalObject  (1)

NetExternalObjectとしてONNXモデルをインポートする:

IRVersion  (1)

指定のネットワークのONNX中間表現のバージョンを取得する:

OperatorSetVersion  (1)

指定のネットワークで使用されるONNX演算子セットを取得する:

ProducerName  (1)

指定のネットワークの生成に使用されるツールの名前を取得する:

ProducerVersion  (1)

指定のネットワークの生成に使用されるツールのバージョンを取得する:

RawData  (1)

指定のONNXファイルの処理されていない完全な内容を取得する:

UninitializedNet  (1)

ONNXモデルを初期化されていないWolfram言語ネットワークとしてインポートする:

Importオプション  (1)

"Arrays"  (1)

ネットワークで使用される配列は,別のONNXテンソルprotoファイルに含むようにすることができる.初期化していないネットワークをインポートする:

配列ファイルを指定して,ネットワークをその配列とともにインポートする(複数の配列はリストで指定できる):

Exportオプション  (5)

"Description"  (1)

モデルを説明するメタデータを指定する:

説明を確認する:

"ExternalArrays"  (1)

単純なネットを作成し,それを複数の外部配列にエキスポートする:

ネットのすべての配列は,"1_Weights"等,配列にちなんで名付けられた個別のファイルにエキスポートされた:

主のモデルファイルはすべての配列ファイルの相対パスへの参照を保持するため,モデルがインポートされるときに配列が自動的に含まれる:

すべての外部配列を含むネットを1つのファイルにエキスポートする:

ネットのすべての配列を含む "Arrays"と呼ばれる一つのファイルが作成される:

主のモデルファイルは結合された配列ファイルの相対パスへの参照を保持するため,モデルがインポートされるときにその配列は自動的に含まれる:

モデルのサイズが2GBを超える場合,単一の外部配列ファイルが自動的に作成され,警告メッセージが表示される:

"GraphName"  (1)

グラフ名メタデータを指定する:

グラフ名を確認する:

"ModelVersion"  (1)

モデルバージョンメタデータを指定する:

モデルバージョンを確認する:

"OperatorSetVersion"  (1)

PaddingLayerを作成し,演算子セットを10でエキスポートする:

演算子セットのバージョンを確認する:

演算子セット10では,ONNXの "Pad" 演算子は一つの入力を取り,そのパディングサイズと値について静的な属性を持つ:

Import は演算子セット10をサポートするので,モデルファイルを変換して戻すことができる:

演算子セット11で同じレイヤーにエキスポートする:

演算子セットのバージョンを確認する:

演算子セット11では,"Pad"演算子のパディングサイズと値が属性から入力に移された.演算子には2つの入力が追加され,属性が2つ減った:

Import は演算子セット11をサポートするので,モデルファイルを変換して戻すことができる:

考えられる問題  (1)

NetEncoderまたは NetDecoderはONNXでサポートされないため,すべてExportによって自動的に削除される.NetEncoderNetDecoderを含むネットワークを作り,エキスポートする:

モデルをインポートし戻すと,NetEncoderNetDecoderも存在しない: