Tensorflow 모델을 ML.NET으로 이동하도록 pb 파일 수정

Nov 12 2020

이제 .NET에 구현하고 싶은 TensorFlow 모델 (1D CNN)이 있습니다.
그렇게하려면 입력 및 출력 노드를 알아야합니다. Netron에
모델을 업로드했을 때 저장 방법에 따라 다른 그래프를 얻었으며 올바른 것으로 보이는 유일한 그래프는 h5 업로드에서 나옵니다. 다음은 다음과 같습니다 .model.summary()

모델을 h5로 저장하고 model.save("Mn_pb_model.h5")Netron에로드하여 그래프로 표시하면 모든 것이 올바르게 보입니다.

그러나 ML.NET은 h5 형식을 허용하지 않으므로 pb로 저장해야합니다.

ML.NET에서 TensorFlow를 채택하는 샘플을 살펴보면이 샘플 은 TensorFlow에서 권장 하는 SavedModel 형식 과 유사한 형식으로 저장된 TensorFlow 모델을 보여줍니다 (또한 여기 에서 ML.NET 에서 권장하는 "고정되지 않은 [저장된 모델 형식 다운로드]. ... "). 그러나 pb 파일을 Netron에 저장하고로드하면 다음과 같은 결과가 나타납니다.

그리고 조금 더 확대 (오른쪽 끝)

보시다시피, 그럴 것 같지 않습니다.
또한 입력 노드와 출력 노드가 올바르지 않아 ML.NET에서 작동하지 않습니다 (문제가 있다고 생각합니다). TensorFlow
에서 권장하는 방법 을 사용하여 입력 / 출력 노드를 결정합니다.

고정 된 그래프 를 얻고 Netron에로드 하려고하면 처음에는 정확 해 보이지만 다음과 같이 생각하지 않습니다.

이것이 옳지 않다고 생각하는 네 가지 이유가 있습니다.

  • h5로 업로드했을 때의 그래프와는 매우 다릅니다.
  • 아까 보시다시피, 저는 전체적으로 1D 컨볼 루션을 사용하고 있습니다. 이것은 그것이 2D로가는 것을 보여줍니다.
  • 이 파일 크기는 128MB이지만 TensorFlow to ML.NET 예제의 파일 크기는 252KB에 불과합니다. Inception 모델 조차도 56MB에 불과합니다.
  • TensorFlow에서 Inception 모델을로드하고 h5로 저장하면 ML.NET 리소스에서와 동일하게 보이지만 고정 그래프로 저장하면 다르게 보입니다. 동일한 모델을 권장 SavedModel형식으로 저장하면 Netron에서 모두 엉망으로 표시됩니다. 원하는 모델을 선택하여 권장 SavedModel형식으로 저장하면 직접 볼 수 있습니다 (여러 모델에서 시도해 보았습니다).

또한 model.summary()Inception의 그래프 model.summary()를 보면 h5 그래프 와 같은 방식으로 그래프와 유사합니다 .

ML.NET에서 사용할 수 있도록 TensorFlow 모델을 저장하는 더 쉬운 방법 (올바른 방법)이 있어야하는 것 같습니다.

제안 된 솔루션이 작동하는지 보여주십시오. 제공 한 답변에서 작동하는지 확인하십시오 ( pb모델 [ VariablesML.NET에서 작동하려면 폴더 도 있어야 함]를 Netron에로드하고 다음과 동일 함을 보여주십시오.) h5모델, 예를 들어,)를 스크린 샷. 그래서 우리 모두 같은 것을 시도하고 있습니다. 여기 에 MNIST ML 단기 집중 과정 예제에 대한 링크 가 있습니다. 프로그램을 실행하는 데 30 초도 걸리지 않고 my_model. 여기에서 방법에 따라 저장하고 업로드하여 Netron에서 그래프를 볼 수 있습니다. h5모델 업로드 는 다음과 같습니다 .

답변

2 Rivers Nov 22 2020 at 01:48

이 답변은 세 부분으로 구성됩니다.

  • 다른 프로그램 진행
  • 다른 프로그램을 거치지 않음
  • 차이 영업 이익 수준 그래프 및 개념 그래프 (그리고 왜 Netron은 서로 다른 그래프를 보여줍니다)

1. 다른 프로그램 진행 :

ML.net에는 pb 파일이 아닌 ONNX 모델이 필요합니다.

TensorFlow에서 ML.net에서로드 할 수있는 ONNX 모델로 모델을 변환하는 방법에는 여러 가지가 있습니다.

  • 와 WinMLTools의 도구 :https://docs.microsoft.com/en-us/windows/ai/windows-ml/convert-model-winmltools
  • 와 MMdnn :https://github.com/microsoft/MMdnn
  • 와 tf2onnx :https://github.com/onnx/tensorflow-onnx
  • Keras와 keras2onnx로 훈련 된 경우 : https://github.com/onnx/keras-onnx

이 SO 게시물도 도움이 될 수 있습니다. keras로 저장된 ML.NET으로 모델로드

여기에서 h5 및 pb 파일 형식, 포함 내용 등에 대한 자세한 정보를 찾을 수 있습니다. https://www.tensorflow.org/guide/keras/save_and_serialize#weights_only_saving_in_savedmodel_format

2. 그러나 "TensorFlow-> 다른 프로그램을 거치지 않고 ML.NET"을 요청합니다.

2.A 문제 개요 :

첫째, pl제공 한 코드를 사용하여 만든 파일 형식은 의견에서 언급 한 예제에서 사용한 것과 동일하지 않은 것 같습니다 (https://docs.microsoft.com/en-us/dotnet/machine-learning/tutorials/text-classification-tf)

pb를 통해 생성 될 파일 을 사용해 볼 수 tf.saved_model.save있습니까? 작동 되나요 ?

이 Microsoft 블로그 게시물에 대한 생각 :

에서 이 페이지 우리는 읽을 수 있습니다 :

ML.NET에서는 고정 된 TensorFlow 모델 .pb 파일 (기본적으로 디스크에 기록 된 직렬화 된 graph_def 프로토콜 버퍼 인 "고정 그래프 정의"라고도 함)을로드 할 수 있습니다.

과:

다이어그램에 표시되는 TensorFlow .pb 모델 파일 (및 labels.txt 코드 / Id)은 Azure Cognitive Services Custom Vision에서 만들고 학습 한 다음 ML.NET C #에서 사용할 고정 된 TensorFlow 모델 파일로 내보내는 파일입니다. 암호.

따라서이 pb파일은 Azure Cognitive Services Custom Vision에서 생성 된 파일 유형입니다. Perharps도 이런 식으로 시도 할 수 있습니까?

2.B 이제 솔루션을 제공하려고합니다.

실제로 TensorFlow 1.x에서는 freeze_graph.

그러나 TensorFlow 2.x는 freeze_graph및 converter_variables_to_constants.

여기에서도 유용한 정보를 읽을 수 있습니다. Tensorflow 2.0 : 고정 그래프 지원

일부 사용자는 TF 2.x에서 수행하는 방법에 대해 궁금해합니다. tensorflow 2.0에서 그래프를 고정하는 방법 (https://github.com/tensorflow/tensorflow/issues/27614)

그러나 원하는대로 pb로드 할 수 있는 파일 을 만드는 몇 가지 솔루션이 있습니다 ML.net.

https://leimao.github.io/blog/Save-Load-Inference-From-TF2-Frozen-Graph/

Keras 모델을 동결 그래프로 저장하는 방법은 무엇입니까? (이미 귀하의 질문에 연결되어 있음)

차이 영업 이익 수준 그래프 및 개념 그래프 (그리고 왜 Netron 당신에게 다른 그래프를 보여줍니다)

@ mlneural03이 질문에 대한 의견에서 말했듯이 Netron은 제공하는 파일 형식에 따라 다른 그래프를 표시합니다.

  • h5 파일을로드하면 Netron이 개념 그래프를 표시합니다.
  • pb 파일을로드하면 Netron이 작업 수준 그래프를 표시합니다.

연산 수준 그래프와 개념 그래프의 차이점은 무엇입니까?

  • TensorFlow에서 작업 수준 그래프의 노드는 tf.add, tf.matmul, tf.linalg.inv 등과 같은 작업 ( "ops")을 나타냅니다.
  • 개념 그래프는 모델의 구조를 보여줍니다.

그것은 완전히 다른 것입니다.

"ops"는 "operations"의 약어입니다. 연산은 계산을 수행하는 노드입니다.

따라서 Netron에서 pb fil을로드 할 때 노드가 많은 매우 큰 그래프가 표시됩니다. 그래프의 모든 계산 노드가 표시됩니다. 그러나 Netron에서 h5 파일을로드하면 모델의 구조, 모델 디자인을 "그냥"볼 수 있습니다.

TensorFlow에서 TensorBoard를 사용하여 그래프를 볼 수 있습니다.

  • 기본적으로 TensorBoard는 연산 수준 그래프를 표시합니다.
  • coneptual 그래프를 보려면 TensorBoard에서 "keras"태그를 선택하십시오.

여기 op-level 그래프와 coneptual 그래프의 차이점을 매우 명확하게 설명하는 Jupyter Notebook이 있습니다. https://colab.research.google.com/github/tensorflow/tensorboard/blob/master/docs/graphs.ipynb

질문과 관련된 TensorFlow Github에서도이 "문제"를 읽을 수 있습니다. https://github.com/tensorflow/tensorflow/issues/39699

간단히 말해서 :

사실 문제는 없습니다. 약간의 오해 만 있습니다 (괜찮습니다. 모든 것을 알 수는 없습니다).

당신은로드 할 때 같은 그래프를보고 싶은 h5파일과 pbNetron에서 파일을하지만, 하는 파일이 동일하지 그래프를 포함 않기 때문에 실패합니다. 이 그래프는 동일한 모델을 표시하는 두 가지 방법입니다.

설명한 방법으로 만든 pb 파일은 앞서 설명한 Microsoft의 자습서에서 설명한대로 ML.NET에서로드 할 올바른 pb 파일입니다. 따라서이 pb튜토리얼에 설명 된대로 올바른 파일 을로드하면 실제 / 진정한 모델을로드하게됩니다.