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でやってみました。
上手く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')