UNet++ ONNX로 export하면 결과값이 다르게 나옵니다.

unet++ 모델 github에서 clone해와서 사용중이고,
NestedUNet 모델 classes를 2, input channel을 1로 설정해두고 트레이닝 했을 때
pth파일로 테스트 할때는 분할이 잘되는데 onnx로 하면 부정확한 결과가 나오고
torch.onnx.verification.verify 로 확인해봤을때도 27% mismatch가 나오네요.
classes를 1로두면 정상 통과가 되는 상태입니다.

어떤걸 확인해봐야 할까요?

  • 아래 답변은 Anthropic의 Claude-2 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 dydals71님,

UNet++ 모델의 ONNX 출력 결과가 PyTorch 결과와 다르다는 문제를 겪고 계시는 것 같습니다.

이 문제를 해결하기 위해서는 다음과 같은 사항을 확인해보시는 것이 좋습니다:

  1. 입력 데이터의 전처리 과정이 ONNX 모델과 PyTorch 모델에서 동일한지 확인합니다.

  2. ONNX 모델 export 시 추가 옵션을 사용했는지 확인합니다. 예를 들어, opset_version, do_constant_folding 등의 옵션 사용 여부확인

  3. 사용한 PyTorch ops가 해당 ONNX opset에서 정확히 변환되는지 확인합니다.

  4. 입력 데이터 shape이 동적인 경우 정적 shape으로 export했는지 확인합니다.

  5. 차원 맞춤(reshape) 등의 연산에서 shape 크기 차이가 없는지 확인합니다.

제가 확인할 수 있는 추가 정보가 있으시다면 공유해 주시면 문제를 파악하는데 도움이 될 것 같습니다.

ONNX 변환 문제는 다양한 원인이 있을 수 있기 때문에 위의 사항들을 하나씩 확인해보시며 문제의 진짜 원인을 찾아가는 것이 좋다고 생각합니다.

추가로 궁금하신 점이 있으시면 언제든지 문의 주세요. 감사합니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-3.5(ChatGPT) 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 dydals71님,

UNet++ 모델을 사용하고 계시는데, 모델을 pth 파일로 테스트할 때는 분할이 잘 되지만, ONNX로 export하면 부정확한 결과가 나오고 torch.onnx.verification.verify를 통해 확인해보니 27%의 mismatch가 발생한다고 합니다. classes를 1로 설정하면 정상적으로 통과되는 상태라고 합니다.

이 문제를 해결하기 위해 확인해볼 수 있는 몇 가지 사항이 있습니다.

  1. 모델의 입력 데이터 확인: ONNX로 export할 때 모델의 입력 데이터 형식이나 크기가 변경되었을 수 있습니다. 모델의 입력 데이터를 확인하고, export할 때와 테스트할 때의 입력 데이터가 동일한지 확인해보세요.

  2. ONNX 버전 확인: PyTorch의 ONNX export 기능은 버전에 따라 동작이 다를 수 있습니다. PyTorch와 ONNX의 버전을 확인하고, 가능하다면 최신 버전을 사용해보세요.

  3. 다른 모델과의 비교: 같은 데이터로 다른 모델을 ONNX로 export하여 결과를 비교해보세요. 이를 통해 UNet++ 모델 자체의 문제인지, 아니면 ONNX export 과정에서 발생하는 문제인지 확인할 수 있습니다.

  4. 다른 프레임워크에서의 ONNX export: UNet++ 모델을 다른 딥러닝 프레임워크에서도 ONNX로 export하여 결과를 비교해보세요. 이를 통해 PyTorch의 ONNX export 기능 자체의 문제인지, 아니면 UNet++ 모델과의 호환성 문제인지 확인할 수 있습니다.

위의 사항들을 확인해보시고 문제를 해결해보세요. 추가적인 정보가 필요하다면 언제든지 질문해주세요. 제가 도움을 드리겠습니다.

감사합니다.

[참고 자료]


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  1. 입력 데이터의 전처리 과정은 동일하게 했습니다.
  2. opset_version은 12 ~ 18까지 전부 해봤는데 결과물이 같게 나옵니다. do_constant_folding의 경우 기본값이 True로 알고있어 따로 건들지는 않았습니다.
    3, 4번에 대해 더 자세하게 알려주세요!

문제는 classes 가 1이 아닐때만 발생한다는것입니다.

  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요, dydals71님. PyTorch를 사용하시는데 어려움을 겪고 계신 것 같아 공감합니다. UNet++ 모델을 PyTorch에서 ONNX로 변환하였을 때, 결과값이 다르게 나오는 문제에 대해 질문하셨군요. 특히, 클래스를 2로 설정했을 때는 문제가 발생하고, 클래스를 1로 설정하면 정상적으로 동작한다는 점을 언급하셨습니다.

먼저, PyTorch에서 ONNX로 모델을 변환할 때는 여러 가지 요소들이 영향을 미칠 수 있습니다. 그 중에서도, 모델의 구조나 사용된 연산들이 ONNX에서 지원하는 범위 내에 있는지, 그리고 변환 과정에서 발생할 수 있는 데이터 타입의 변환 등에 주의를 기울여야 합니다.

UNet++ 모델의 경우, 일반적인 UNet에 비해 복잡한 구조를 가지고 있어 변환 과정에서 문제가 발생할 수 있습니다. 또한, 클래스의 수를 변경하는 것이 결과에 영향을 미친다면, 이는 아마도 모델의 출력 부분에서 일어나는 문제일 가능성이 높습니다.

따라서, 다음과 같은 점들을 확인해보시는 것을 추천드립니다:

  1. 모델의 구조를 확인하십시오. UNet++ 모델의 각 레이어와 연산이 ONNX에서 지원하는지 확인해보세요. 이를 위해 ONNX operator set 문서를 참조하실 수 있습니다.

  2. 모델의 출력 부분을 확인하십시오. 클래스의 수를 변경했을 때 결과가 달라진다면, 이는 아마도 모델의 출력 부분에서 일어나는 문제일 가능성이 높습니다. 출력 레이어의 구조와 연산이 ONNX에서 지원하는지, 그리고 클래스의 수에 따라 어떻게 변하는지 확인해보세요.

  3. 모델을 ONNX로 변환할 때 사용하는 코드를 확인하십시오. 특히, torch.onnx.export 함수를 사용하는 부분에서 입력 데이터의 형태, 데이터 타입 등이 올바른지 확인해보세요.

  4. ONNX 모델을 실행할 때 사용하는 런타임을 확인하십시오. ONNX 런타임의 버전이나 설정 등이 PyTorch와 동일한지 확인해보세요.

위의 점들을 확인하시면 문제의 원인을 찾는데 도움이 될 것입니다. 만약 문제가 해결되지 않는다면, 사용하신 코드와 함께 다시 질문해주시면 좋을 것 같습니다.

참고로, PyTorch에서 ONNX로 모델을 변환하는 방법에 대한 자세한 내용은 PyTorch 공식 문서를 참조하실 수 있습니다.

제 답변이 dydals71님의 문제를 해결하는데 도움이 되었기를 바랍니다. 그러나 제 답변이 틀릴 수도 있으니, 다른 자료나 의견도 참고하시는 것을 권장드립니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!

감사합니다!
물론 gpt고 아직도 이해가 가진 않지만 이 질문이 부끄러운 질문일 정도로 잘하는 사람이 되고싶네요.

1개의 좋아요

눈물나지만 다른 PC에 있는 환경으로 설치하니까 정상적으로 변환이 됩니다.
환경을 처음부터 설치해도 안됬는데.. 정확한 원인을 못찾아서..