1 回答
TA贡献1786条经验 获得超13个赞
在模型转换的情况下提供最小的可重现示例当然很困难,但是这些问题将受益于更好的指针。
如果你有一个“冻结图”(其中
tf.Graph
变量已变成常量)
(粗体突出部分是我的)。显然,您的图表包含VarHandleOp
(这同样适用于Variable
和VariableV2
节点),并且根据此定义并未“冻结”。您的一般方法是有意义的,但您需要一个图表,其中包含节点形式的变量的实际训练值Const
。您在训练时需要变量,但在推理时需要变量,并且应该将其烘焙到图中。TFLite 作为推理时间框架,不支持变量。
你的其余想法似乎不错。TFLiteConverter.from_concrete_functions
目前正好需要 1 concrete_function
,但这就是您通过包装图表得到的结果。如果运气足够好,它可能会起作用。
有一个实用程序tensorflow/python/tools/freeze_graph.py
会尽力用从最新检查点文件中获取的常量替换 Graph.pb 中的变量。如果您查看其代码,可以使用保存的元图 ( checkpoint_name .meta ) 文件或将工具指向训练目录,从而消除大量猜测;另外,我认为提供模型目录是获得单个冻结图和分片模型的唯一方法。
我注意到您在示例中input
使用了 just 。tf.nest.map_structure(import_graph.as_graph_element, inputs)
您可能有其他原因,但如果您这样做是因为as_graph_element
抱怨数据类型/形状,则可以通过正确冻结图形来解决这个问题。从冻结图中获得的具体函数将对其输入形状和数据类型有一个很好的了解。一般来说,需要手动设置它们是出乎意料的,而且你这样做的事实对我来说似乎很奇怪(但我并不声称对 TF 的这个黑暗角落有广泛的经验)。
map_structure
有一个关键字参数来跳过检查。
添加回答
举报