서론
이 장은 ONNX 모델이 가지고 있는 Graph(layer)에 대해서 수정하는 방법에 대해서 설명한다.
목차
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를 조작할 수 있다.

Comment