ONNX (.onnx)
予備知識
-
- ニューラルネットワークモデルのためのオープン形式.
- モデルおよびさまざまなメタデータを保存する.
- ONNXはOpen Neural Network Exchangeの頭字語である.
- Protobufに基づくバイナリファイル形式.
- 2017年にMicrosoftとFacebookによってリリースされた.
ImportとExport
- Import["file.onnx"]は指定のファイルに保存されたネットワークをインポートし,それをNetChain,NetGraph,またはそれに似た構造として返す.
- Import["file.onnx",elem]は指定の要素 elem をインポートする.
- インポート形式はImport["file","ONNX"]またはImport["file",{"ONNX",elem,…}]で指定できる.
- Export["file.onnx",net] は net をONNXモデルとしてエキスポートする.
- 以下の式がサポートされている:
-
NetChain[…] 層の鎖として表されるネットワーク NetGraph[…] 層のグラフとして表されるネットワーク layer LinearLayer等の任意のネットワーク層 - 一般的な情報は,以下の関数ページを参照のこと.
-
Import, Export ファイルからインポートする,あるいはファイルへエキスポートする CloudImport, CloudExport クラウドオブジェクトからインポートする,あるいはクラウドオブジェクトへエキスポートする ImportString, ExportString 文字列からインポートする,あるいは文字列へエキスポートする ImportByteArray, ExportByteArray バイト配列からインポートする,あるいはバイト配列へエキスポートする
要素
- 一般的な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" None ONNXメタデータのモデルドキュメント文字列 "ExternalArrays" Automatic ネット配列を別々のファイルにエキスポートする "GraphName" Automatic ONNXメタデータ内のグラフの名前 "ModelVersion" 0 ONNXメタデータ内のモデルのバージョン "OperatorSetVersion" Automatic モデルで使用する標準ONNX演算子セットのバージョン - オプション"ExternalArrays" は次の設定ができる:
-
Automatic モデルサイズに依存するネット配列の外部ファイルを生成する None モデルファイルにネットワーク配列を含む All ネット配列を別々のファイル(一つの配列を一つのファイル)にエキスポートする "Single" すべてのネット配列を一つのファイルにエキスポートする - "ExternalArrays" をAutomatic に設定すると,モデルサイズの合計が2GB以下のときはNone,2GB以上のときは"Single"に相当する. All と "Single"の設定の場合,配列ファイルが主要なモデルファイルと同じディレクトリに生成される.すべてのONNXインポータはこのようなファイルが同じ相対パスにあることを想定している.
例題
すべて開く すべて閉じる例 (2)
Import["ExampleData/onnx_example.onnx"]このファイルで利用できるImport要素を示す:
Import["ExampleData/onnx_example.onnx", "Elements"]net = NetInitialize@NetGraph[{LinearLayer[2], Ramp, LinearLayer[3], Tanh, CatenateLayer[]}, {NetPort["Input1"] -> 1 -> 2, NetPort["Input2"] -> 3 -> 4, {2, 4} -> 5}, "Input1" -> 6, "Input2" -> 7]Export["onnx_model.onnx", net]Import要素 (14)
ArrayAssociation (1)
ArrayList (1)
Description (1)
ONNXGraph (1)
ModelDomain (1)
ModelVersion (1)
Net (1)
NetExternalObject (1)
NetExternalObjectとしてONNXモデルをインポートする:
Import["ExampleData/onnx_example.onnx", "NetExternalObject"]IRVersion (1)
OperatorSetVersion (1)
ProducerName (1)
ProducerVersion (1)
Importオプション (1)
"Arrays" (1)
ネットワークで使用される配列は,別のONNXテンソルprotoファイルに含むようにすることができる.初期化していないネットワークをインポートする:
Import["ExampleData/onnx_uninitialized_model.onnx"]配列ファイルを指定して,ネットワークをその配列とともにインポートする(複数の配列はリストで指定できる):
Import["ExampleData/onnx_uninitialized_model.onnx", "Arrays" -> "ExampleData/onnx_array.pb"]Exportオプション (5)
"Description" (1)
"ExternalArrays" (1)
単純なネットを作成し,それを複数の外部配列にエキスポートする:
net = NetInitialize@NetChain[{LinearLayer[2, "Biases" -> None], Ramp, LinearLayer[2, "Biases" -> None]}, "Input" -> 2]Export["onnx_model.onnx", net, "ExternalArrays" -> All]ネットのすべての配列は,"1_Weights"等,配列にちなんで名付けられた個別のファイルにエキスポートされた:
Information[net, "Arrays"]FileExistsQ["onnx_model-Arrays-1_Weights"]主のモデルファイルはすべての配列ファイルの相対パスへの参照を保持するため,モデルがインポートされるときに配列が自動的に含まれる:
imported = Import["onnx_model.onnx"]Information[imported, "Arrays"]すべての外部配列を含むネットを1つのファイルにエキスポートする:
Export["onnx_model.onnx", net, "ExternalArrays" -> "Single"]ネットのすべての配列を含む "Arrays"と呼ばれる一つのファイルが作成される:
FileExistsQ["onnx_model-Arrays"]主のモデルファイルは結合された配列ファイルの相対パスへの参照を保持するため,モデルがインポートされるときにその配列は自動的に含まれる:
imported = Import["onnx_model.onnx"]Information[imported, "Arrays"]モデルのサイズが2GBを超える場合,単一の外部配列ファイルが自動的に作成され,警告メッセージが表示される:
l = NetInitialize@EmbeddingLayer[600, 1000000, "Input" -> {10}]ByteCount[l]Export["onnx_model.onnx", l]"GraphName" (1)
"ModelVersion" (1)
"OperatorSetVersion" (1)
PaddingLayerを作成し,演算子セットを10でエキスポートする:
pad = PaddingLayer[{{1, 1}, {2, 2}}, "Input" -> {2, 3}]Export["onnx_model.onnx", pad, "OperatorSetVersion" -> 10]Import["onnx_model.onnx", "OperatorSetVersion"][[1, "version"]]演算子セット10では,ONNXの "Pad" 演算子は一つの入力を取り,そのパディングサイズと値について静的な属性を持つ:
rawData = Import["onnx_model.onnx", "RawData"];rawData[["graph", "node", 1, "input"]]rawData[["graph", "node", 1, "attribute", All, "name"]]Import は演算子セット10をサポートするので,モデルファイルを変換して戻すことができる:
Import["onnx_model.onnx"]Export["onnx_model.onnx", pad, "OperatorSetVersion" -> 11]Import["onnx_model.onnx", "OperatorSetVersion"][[1, "version"]]演算子セット11では,"Pad"演算子のパディングサイズと値が属性から入力に移された.演算子には2つの入力が追加され,属性が2つ減った:
rawData = Import["onnx_model.onnx", "RawData"];rawData[["graph", "node", 1, "input"]]rawData[["graph", "node", 1, "attribute", All, "name"]]Import は演算子セット11をサポートするので,モデルファイルを変換して戻すことができる:
Import["onnx_model.onnx"]考えられる問題 (1)
NetEncoderまたは NetDecoderはONNXでサポートされないため,すべてExportによって自動的に削除される.NetEncoderとNetDecoderを含むネットワークを作り,エキスポートする:
net = ConvolutionLayer[2, 3, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]Export["onnx_model.onnx", net]モデルをインポートし戻すと,NetEncoderもNetDecoderも存在しない:
Import["onnx_model.onnx"]