2

我想使用 tensorflow hub,在我的图中重新训练它的一个模块,然后使用该模块,但我的问题是当我设置trainable = Truetags = {"train"}创建模块时,由于批量标准化层,我无法进行评估。所以当我读到这个问题时,我发现我还应该创建另一个图表来进行评估而不设置tags = {"train"}. 但我不知道如何将变量从训练图恢复到评估图。我尝试创建具有相同名称的两个模块并reuse = True在评估图中使用,但这没有帮助。

4

1 回答 1

2

为了社区的利益,在回答部分指定 Arno 引用的解决方案(即使它出现在评论部分)。

答案是:

对于hub.ModuleTF1,情况正如您所说:训练或推理图都被实例化,并且没有好的方法可以在单个 tf.Session 中导入两者并在它们之间共享变量。这是由 Estimators 和 TF1 中的许多其他训练脚本(尤其是分布式脚本)使用的方法得出的:有一个生成检查点的训练会话,以及一个从它们恢复模型权重的单独评估会话。(两者在读取的数据集和执行的预处理方面也可能不同。)

随着 TF2 及其对 Eager 模式的强调,这种情况发生了变化。TF2 风格的 Hub 模块(可在https://tfhub.dev/s?q=tf2-preview找到)实际上只是TF2 风格的 SavedModels,并且这些模块没有多个图形版本。相反,如果需要训练/推理区分,则恢复的顶级对象上的调用函数采用可选的 training=... 参数。

有了这个,TF2 应该符合你的期望。请参阅交互式演示tf2_image_retraining.ipynb和tensorflow_hub/keras_layer.py中的底层代码,了解如何完成。TF Hub 团队正在努力为 TF2 版本提供更完整的模块选择。

于 2020-03-05T06:23:09.437 回答