更正 pb 文件以将 Tensorflow 模型移动到 ML.NET

Jos*_*osh 8 .net python nodes tensorflow ml.net

我有一个我构建的 TensorFlow 模型(一个 1D CNN),我现在想将其实现到 .NET 中。
为此,我需要知道输入和输出节点。
当我将模型上传到Netron 时,根据我的保存方法,我得到了一个不同的图表,唯一看起来正确的图表来自 h5 上传。这是model.summary()

在此处输入图片说明

如果我将模型保存为 h5model.save("Mn_pb_model.h5")并将其加载到 Netron 中以绘制图形,一切看起来都是正确的:

在此处输入图片说明

但是,ML.NET 不接受 h5 格式,因此需要将其保存为 pb。

在查看在 ML.NET 中采用 TensorFlow 的示例时,该示例显示了一个 TensorFlow 模型,该模型以与SavedModel格式类似的格式保存- 由 TensorFlow 推荐(同时也是 ML.NET在此处推荐的“下载未冻结的 [SavedModel 格式] ……”)。但是,当将 pb 文件保存并加载到 Netron 时,我得到了这个:

在此处输入图片说明

再放大一点(在最右边),

在此处输入图片说明

正如你所看到的,它看起来不像它应该的那样。
此外,输入节点和输出节点不正确,因此它不适用于 ML.NET(我认为有些问题)。
我使用TensorFlow推荐的方法来确定输入/输出节点:

在此处输入图片说明

当我尝试获取冻结图并将其加载到 Netron 时,起初它看起来是正确的,但我不认为它是:

在此处输入图片说明

有四个原因我认为这是不正确的。

  • 它与作为 h5 上传时的图表大不相同(在我看来是正确的)。
  • 正如您从前面看到的,我始终使用 1D 卷积,这表明它变为 2D(并且保持这种方式)。
  • 此文件大小为 128MB,而 TensorFlow 到 ML.NET 示例中的文件大小仅为 252KB。即使是Inception模型也只有 56MB。
  • 如果我在 TensorFlow 中加载 Inception 模型并将其保存为 h5,它看起来与 ML.NET 资源中的相同,但是当我将其保存为冻结图时,它看起来不同。 如果我采用相同的模型并以推荐的SavedModel格式保存它,它会在 Netron 中显示为一团糟。 选择您想要的任何模型并以推荐的SavedModel格式保存它,您就会亲眼看到(我已经在很多不同的模型上尝试过)。

此外,在查看model.summary()Inception 的图表时,它与它的图表相似,就像我model.summary()与 h5 图表一样。

似乎应该有一种更简单的方法(和正确的方法)来保存 TensorFlow 模型,以便它可以在 ML.NET 中使用。

请证明您建议的解决方案有效: 在您提供的答案中,请检查它是否有效(将pb模型 [这也应该有一个Variables文件夹以适用于 ML.NET] 加载到 Netron 中,并表明它与该h5模型,例如,它截图)。为了让我们都在尝试同样的事情,这里有一个指向MNIST ML 速成课程示例的链接。运行该程序所需的时间不到 30 秒,并生成了一个名为my_model. 从这里您可以根据您的方法保存并上传它以查看 Netron 上的图表。这是h5模型上传:

在此处输入图片说明

Riv*_*ers 4

这个答案由 3 部分组成:

\n
    \n
  • 参加其他计划
  • \n
  • 不参加其他计划
  • \n
  • 操作级图概念图之间的区别(以及为什么 Netron 向您显示不同的图)
  • \n
\n

1. 办理其他项目:

\n

ML.net 需要 ONNX 模型,而不是 pb 文件。

\n

有多种方法可以将模型从 TensorFlow 转换为可在 ML.net 中加载的 ONNX 模型:

\n\n

这篇文章也可以帮助你:Load model with ML.NET saving with keras

\n

在这里您可以找到有关 h5 和 pb 文件格式、它们包含的内容等的更多信息:https: //www.tensorflow.org/guide/keras/save_and_serialize#weights_only_ saving_in_savedmodel_format

\n

2.但是你问的是“TensorFlow -> ML.NET而不通过其他程序”:

\n

2.A问题概述:

\n

首先,pl从您所说的来看,您使用您提供的代码创建的文件格式似乎与您在评论中提到的示例中使用的文件格式不同(https://learn.microsoft.com/en-us /dotnet/machine-learning/tutorials/text-classification-tf

\n

可以尝试使用pb将通过生成的文件tf.saved_model.save吗?有效吗?

\n

关于这篇微软博客文章的想法:

\n

这个页面我们可以读到:

\n
\n

在 ML.NET 中,您可以加载冻结的 TensorFlow 模型 .pb 文件(也称为\n\xe2\x80\x9cfrozen graph def\xe2\x80\x9d,本质上是写入磁盘的序列化 graph_def\n协议缓冲区)

\n
\n

和:

\n
\n

您在图表中看到的 TensorFlow .pb 模型文件(以及\nlabels.txt 代码/Id)是您在 Azure 认知\n服务自定义视觉中创建/训练的文件,然后导出为冻结的 TensorFlow 模型文件\n以供 ML 使用.NET C# 代码。

\n
\n

因此,此pb文件是从 Azure 认知服务自定义视觉生成的一种文件。\nPerharps 您也可以尝试这种方式吗?

\n

2.B 现在,我们将尝试提供解决方案:

\n

事实上,在 TensorFlow 1.x 中,您可以使用freeze_graph.

\n

但 TensorFlow 2.x 不支持freeze_graphconverter_variables_to_constants.

\n

您也可以在这里阅读一些有用的信息:Tensorflow 2.0:冻结图支持

\n

一些用户想知道如何在 TF 2.x 中执行操作:how to freeze graph in tensorflow 2.0 ( https://github.com/tensorflow/tensorflow/issues/27614 )

\n

但是,有一些解决方案可以创建您可以根据需要pb加载的文件:ML.net

\n

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

\n

如何将 Keras 模型保存为冻结图?(虽然已经链接到你的问题中)

\n

操作级图概念图之间的区别(以及为什么 Netron 向您显示不同的图):

\n

正如 @mlneural03 在对您的问题的评论中所说,Netron 根据您提供的文件格式显示不同的图表:

\n
    \n
  • 如果加载 h5 文件,Netron 将显示概念图
  • \n
  • 如果加载 pb 文件,Netron 将显示操作级图
  • \n
\n

操作级图和概念图有什么区别?

\n
    \n
  • 在 TensorFlow 中,操作级图的节点代表操作(“ops”),例如 tf.add 、 tf.matmul 、 tf.linalg.inv 等。
  • \n
  • 概念图将向您显示模型的结构。
  • \n
\n

那是完全不同的事情。

\n

“ops”是“操作”的缩写。\n操作是执行计算的节点。

\n

因此,这就是为什么当您在 Netron 中加载 pb fil 时会得到一个包含大量节点的非常大的图:您会看到该图的所有计算节点。\n但是当您在 Netron 中加载 h5 文件时,您“只需“查看模型的结构、模型的设计。

\n

在 TensorFlow 中,您可以使用 TensorBoard 查看图形:

\n
    \n
  • 默认情况下,TensorBoard 显示操作级图。
  • \n
  • 要查看概念图,请在 TensorBoard 中选择“keras”标签。
  • \n
\n

有一个 Jupyter Notebook 非常清楚地解释了操作级图和概念图之间的区别:https://colab.research.google.com/github/tensorflow/tensorboard/blob/master/docs/graphs.ipynb

\n

您也可以在 TensorFlow Github 上阅读与您的问题相关的这个“问题”:https://github.com/tensorflow/tensorflow/issues/39699

\n

简而言之:

\n

事实上没有问题,只是有点误解(没关系,我们不可能知道一切)。

\n

您希望在加载该文件时看到h5pbNetron 中的文件相同的图形,但它必须不成功,因为这些文件不包含相同的图形。这些图表是显示同一模型的两种方式。

\n

使用我们描述的方法创建的 pb 文件将是加载 ML.NET 的正确 pb 文件,如我们讨论的 Microsoft 教程中所述。因此,如果您按照这些教程中的描述加载正确的pb文件,您将加载真实/真实的模型。

\n