ONNX Model Tunning


서론

이 장은 ONNX 모델이 가지고 있는 Graph(layer)에 대해서 수정하는 방법에 대해서 설명한다.

목차

  1. Input, output shape 변경
  2. graph.initializer
  3. Model Weight 수정하기
  4. Use GUI Tool

Input, output shape 변경

onnx를 먼저 설치

$ pip3 install onnx==1.10.0

onnx github에서 라이브러리 다운

$ git clone https://github.com/onnx/onnx.git
$ cd onnx/onnx/tools

tools라는 디렉토리에 와서 해당 함수를 import해 사용한다.

import onnx
from update_model_dims import update_inputs_outputs_dims

model = onnx.load("./mobilenetv2-12.onnx")
#해당 onnx모델 input, ouput노드 이름을 넣어줘야한다.
updated_model = update_inputs_outputs_dims(model, {"input":[1,3,224,224]}, {"output":[1, 1000]})
onnx.save(updated_model, 'out_model.onnx')

https://stackoverflow.com/questions/67718905/change-input-size-of-onnx-model

https://github.com/onnx/onnx/tree/main/onnx/tools

graph.initializer

모델에 속해있는 노드의 Category가 initializer를 갖는 노드에 대한 정보를 출력한다.

이 출력은 아래 이미지에 보이는 노드의 순서대로 나오지 않는다.

만약 단일 노드에 대해 접근 하고 싶은 경우 아래와 같이 인덱스로 접근 할 수 있다.

아래는 initializer 0번째 값을 출력한다(Convolution의 weight).

import onnx
om = onnx.load("test.onnx") # sample model load
print(om.graph.initializer[0])

인덱스가 1일 경우 첫번째 노드(Convolution) Bias의 weight 출력..

import onnx

om = onnx.load("test.onnx") # sample model load
print(om.graph.initializer[2])

Sample Model Download

https://github.com/onnx/models/tree/main/vision/classification/mobilenet/model

Model Weight 수정하기

import onnx
import numpy as np
import onnx.numpy_helper as numpy_helper

model = onnx.load("mobilenetv2-12.onnx") # sample model load
#print(model.graph.initializer) #graph 모든 initializer 출력하는 코드 

for index, layer in enumerate(model.graph.initializer):
    layer_name = layer.name
    if 'min' in layer_name:
        temp = np.array(0.0).astype(np.float32)
        copy_tensor = numpy_helper.from_array(temp, layer_name)
        model.graph.initializer[index].CopyFrom(copy_tensor)
    elif 'max' in layer_name:
        temp = np.array(6.0).astype(np.float32)
        copy_tensor = numpy_helper.from_array(temp, layer_name)
        model.graph.initializer[index].CopyFrom(copy_tensor)
onnx.save_model(model, 'end.onnx') # initializer update 후 저장

Use GUI Tool

아래 깃허브에서 GUI Tool을 사용하여 onnx graph를 조작할 수 있다.

https://github.com/ZhangGe6/onnx-modifier