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

2024-06-30 15:19:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here

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

enter image description here

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

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

enter image description here

再放大一点(在最右边)

enter image description here

正如您所看到的,它看起来一点也不像它应该做的那样。
此外,输入节点和输出节点不正确,因此它对ML.NET不起作用(我认为有问题)。
我正在使用TensorFlow中的recommended way来确定输入/输出节点:

enter image description here

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

enter image description here

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

  • 这与作为h5上传时的图表非常不同(在我看来这是正确的)
  • 正如您在前面看到的,我在整个过程中使用了1D卷积,这表明它会变为2D(并且保持这种方式)
  • 此文件大小为128MB,而TensorFlow to ML.NET示例中的文件大小仅为252KB。甚至Inception模型也只有56MB
  • 如果我在TensorFlow中加载Inception模型并将其保存为h5,它看起来与ML.NET资源中的相同,但是当我将其保存为冻结图时,它看起来不同如果我采用相同的模型并以推荐的SavedModel格式保存,它在Netron中会显示出所有的混乱。采用您想要的任何模型并以推荐的SavedModel格式保存,您将自己看到(我已经在许多不同的模型上试用过)

另外,在用它的图查看《盗梦空间》的model.summary()时,它与它的图类似,就像我的model.summary()与h5图一样

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

请证明您建议的解决方案是有效的:在您提供的答案中,请检查它是否有效(将pb模型[这还应该有一个Variables文件夹,以便为ML.NET工作]加载到Netron中,并显示它与h5模型相同,例如,屏幕截图)。所以我们都在尝试同样的事情,这里是一个MNIST ML速成班的例子。运行程序并生成名为my_model的模型只需不到30秒。从这里,您可以根据您的方法保存它,并将其上载到Netron上查看图形。以下是h5模型上载:

enter image description here


Tags: 方法模型示例netmodel节点tensorflow格式
1条回答
网友
1楼 · 发布于 2024-06-30 15:19:45

这个答案由三部分组成:

  • 通过其他程序
  • 不参加其他课程
  • 操作级图概念图之间的差异(以及为什么Netron显示不同的图)

1。参加其他课程:

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

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

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

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

2。但是您在询问“TensorFlow->;ML.NET而不通过其他程序”:

2.问题概述:

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

是否可以尝试使用将通过tf.saved_model.save生成的pb文件?它起作用了吗

关于这篇microsoft博客文章的思考:

this page我们可以看到:

In ML.NET you can load a frozen TensorFlow model .pb file (also called “frozen graph def” which is essentially a serialized graph_def protocol buffer written to disk)

以及:

That TensorFlow .pb model file that you see in the diagram (and the labels.txt codes/Ids) is what you create/train in Azure Cognitive Services Custom Vision then exporte as a frozen TensorFlow model file to be used by ML.NET C# code.

因此,这个pb文件是从Azure认知服务自定义Vision生成的一种文件类型。 佩哈普斯,你也可以这样试试吗

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

事实上,在TensorFlow 1.x中,您可以使用freeze_graph轻松地保存冻结图

但是TensorFlow 2.x不支持freeze_graphconverter_variables_to_constants

你也可以在这里阅读一些有用的信息:Tensorflow 2.0 : frozen graph support

一些用户想知道如何在TF2.x中实现:如何在TensorFlow2.0(https://github.com/tensorflow/tensorflow/issues/27614)中冻结图形

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

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

How to save Keras model as frozen graph?(尽管在您的问题中已链接)

操作级图概念图之间的差异(以及为什么Netron显示不同的图):

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

  • 如果加载h5文件,Netron将显示概念图
  • 如果加载pb文件,Netron将显示op级别图

op级别图和概念图之间的区别是什么

  • 在TensorFlow中,op级别图的节点表示操作(“op”),如tf.add、tf.matmul、tf.linalg.inv等
  • 概念图将显示模型的结构

那是完全不同的事情

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

所以,这就是为什么在Netron中加载pb fil时,会得到一个包含很多节点的非常大的图:可以看到图中的所有计算节点。 但是当你在Netron中加载h5文件时,你“只是”看到了你模型的结构,模型的设计

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

  • 默认情况下,TensorBoard显示op级别图
  • 要查看概念图,请在TensorBoard中选择“keras”标记

这里有一个Jupyter笔记本,非常清楚地解释了op级别图和概念图之间的区别:https://colab.research.google.com/github/tensorflow/tensorboard/blob/master/docs/graphs.ipynb

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

简言之:

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

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

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

相关问题 更多 >