LoginSignup
0
0

More than 3 years have passed since last update.

ONNXで fuse_add_bias_into_conv 最適化(駄目でした)

Posted at

ONNXがサポートしている最適化 fuse_add_bias_into_conv を調べてみました。

ソースはここ。
https://github.com/onnx/onnx/blob/master/onnx/optimizer/passes/fuse_add_bias_into_conv.h

自力でONNXのグラフを作ったところ、optimizer.optimize()の呼び出しで、このようなエラーが出てしまいました。

  File "C:\Anaconda3\lib\site-packages\onnx\optimizer.py", line 55, in optimize
    optimized_model_str = C.optimize(model_str, passes)
IndexError: invalid unordered_map<K, T> key

C++で記述されているところで、期待されれているkeyとvalueの組み合わせが無い感じですが、これ以上わからず。

issueでは同じような症状が報告されていますが、特に解決策はなさそうです。もう少しエラーの詳細を知りたいですね。
https://github.com/onnx/onnx/issues/1385

自力でONNX作ったからなにかまずいのかと思い、Kerasでやってみました。

fuse_add_bias_into_conv.onnx.png

上手くconv2dの後にAddが入った気がします。しかし、ここからoptimizer.optimize()を呼び出すと同じエラー。

  File "C:\home\app\anaconda3\lib\site-packages\onnx\optimizer.py", line 55, in optimize
    optimized_model_str = C.optimize(model_str, passes)
IndexError: invalid unordered_map<K, T> key

Kerasでやってみたソースはこれです。

import numpy as np
import tensorflow as tf
import keras
import onnx
from onnx import optimizer
import keras2onnx


def add_const(x):
    _b = np.ones((10, 3, 3))
    B = keras.backend.variable(_b)
    x = x + B
    return x

input = keras.layers.Input(shape=(1, 5, 5))
conv = keras.layers.Conv2D(10, (3, 3), input_shape=(1, 5, 5), use_bias=False, data_format='channels_first')(input)
add = keras.layers.Lambda(add_const)(conv)

model = keras.models.Model(inputs=input, outputs=add)

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

onnx_model = keras2onnx.convert_keras(model, model.name)
onnx.save_model(onnx_model, "onnx/fuse_add_bias_into_conv.onnx")

# 最適化パスを指定
passes = ['fuse_add_bias_into_conv']

optimized_model = optimizer.optimize(onnx_model, passes)
onnx.save(optimized_model, 'onnx/fuse_add_bias_into_conv_optimized.onnx')

0
0
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
0
0