LoginSignup
3
3

More than 3 years have passed since last update.

ONNXに埋め込むopsetを設定する

Posted at

ONNXのopsetとは

ONNXファイルには、ファイル作成時のバージョンとしてopsetを指定する機能があります。opsetの値に応じて、使用できるオペレータやその機能(オペレータのプロパティ)が変わります。特に指定が無い場合は最新のopsetとして扱います。

Deep Learning系のツールによってはONNXファイルのopsetの値を確認し、自分自身が処理できるかどうかを確認するルーチンが含まれています。そこの確認ルーチンではじかれた場合は、opsetを下げて再度ONNXファイルを作る必要があります。

ここを見るとそれぞれのオペレータが対応しているバージョンを確認出来ます。例えば、ABSではバージョンとして1,6,13が存在し、13ではABSで使える型としてbfloat16が追加されていることが分かります。

Kerasでopsetを指定してONNXファイルを作る

opsetの指定方法はコンバーターによって違いますが、大抵は引数にopsetのバージョンを指定できます。
keras2onnxを使う場合の指定方法です。

import tensorflow
import onnx
import keras2onnx

model_file = 'foo.h5'

#opsetを設定して保存
keras_model = tensorflow.keras.models.load_model(model_file)
onnx_model = keras2onnx.convert_keras(keras_model, 'foo1', target_opset=9)

target_opsetを指定することで、opset=9のONNXファイルが生成されます。

直接ONNXファイルを修正する

使われているオペレータが明らかに古いオペレータと互換性があることが分かっている場合(新しい機能を使っていない場合)、単にコンバータのチェックを通すためだけにONNXファイルのopsetの値を指定したい時もあります。この場合はONNXファイルを直接編集してopsetを変更することも出来ます。

上のソースの続きとして

onnx_model.opset_import[0].version = 10
with open("op10.onnx", 'wb') as f:
    f.write(onnx_model.SerializeToString())

onnxファイルのopset_import[0].versionに直接値を指定しています。保存されるときには10がopsetとして使われます。

opsetの確認方法

てっとり早い方法としてはprint(onnx_model)で直接onnxを文字列として出力すると、最後の方にopset_importとして値が表示されます。

opset_import {
  domain: ""
  version: 10
}

opsetは10に設定されています。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3