ONNXがサポートしている最適化 fuse_bn_into_conv を調べてみました。
結果から言うと、fuse_add_bias_into_conv と同じくこちらも動きませんでした。
自分でグラフを作っても、Kerasで作っても同じです。ONNXを1.5.0から1.6.0に上げても同じでした。
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
ONNXのバージョンアップまち。
一応、Kerasで作ったグラフはこれ。
ソースはこちら。
import numpy as np
import keras
import onnx
from onnx import optimizer
import keras2onnx
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)
bn = keras.layers.BatchNormalization(axis=1)(conv)
model = keras.models.Model(inputs=input, outputs=bn)
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_bn_into_conv.onnx")
# 最適化パスを指定
passes = ['fuse_bn_into_conv']
optimized_model = optimizer.optimize(onnx_model, passes)
onnx.save(optimized_model, 'onnx/fuse_bn_into_conv_optimized.onnx')