Pytouchモデル転送onnxモデルの例


以下の通りです

import io
import torch
import torch.onnx
from models.C3AEModel import PlainC3AENetCBAM

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

def test():
  model = PlainC3AENetCBAM()
 
  pthfile = r'/home/joy/Projects/models/emotion/PlainC3AENet.pth'
  loaded_model = torch.load(pthfile, map_location='cpu')
  # try:
  #   loaded_model.eval()
  # except AttributeError as error:
  #   print(error)

  model.load_state_dict(loaded_model['state_dict'])
  # model = model.to(device)

  #data type nchw
  dummy_input1 = torch.randn(1, 3, 64, 64)
  # dummy_input2 = torch.randn(1, 3, 64, 64)
  # dummy_input3 = torch.randn(1, 3, 64, 64)
  input_names = [ "actual_input_1"]
  output_names = [ "output1" ]
  # torch.onnx.export(model, (dummy_input1, dummy_input2, dummy_input3), "C3AE.onnx", verbose=True, input_names=input_names, output_names=output_names)
  torch.onnx.export(model, dummy_input1, "C3AE_emotion.onnx", verbose=True, input_names=input_names, output_names=output_names)

if __name__ == "__main__":
 test()
直接PlainC 3 AENetCBAMを変換するモデルに置き換え、pthfileを修正して、Onxモデルの名前を入力して実行すればいいです。
上のコードにコメントしたdummy_input 2,dummy_input 3は、toch.onx.exportに対応する複数の入力の例です。
変換中に発生した問題のまとめ
RuntimeError:Failed to export an ONX atribute、since it's not constant、please try to make things(e.g.kersnel size)static if possible
変換過程でRuntimeError:Failed to export an ONX atribute、since it's not constant、please try to make things(e.g.kersnel size)static if possibleのエラーに遭遇しました。
新聞のエラーログ情報によって開く/home/joy/tenssorflow/venv/lib/python 3.6/site-packages/touch/onnx/smbonic_helper.pyは、該当する位置にprintを追加した後、具体的などのopに問題があるかを特定できます。
たとえば:
該当位置に追加

print(v.node())
出力情報は以下の通りです。

%124 : Long() = onnx::Gather[axis=0](%122, %121), scope: PlainC3AENetCBAM/Bottleneck[cbam]/CBAM[cbam]/ChannelGate[ChannelGate] # /home/joy/Projects/models/emotion/WhatsTheemotion/models/cbam.py:46:0
原因はpytouchのtenssor.size(1)方式のonnxが識別できないので、定数に修正する必要があります。
以上のPytouchモデルがonnxモデルに転向した例は、小編集が皆さんに提供した内容の全てです。参考にしていただければと思います。どうぞよろしくお願いします。