我想使用 tensorflow hub,在我的图中重新训练它的一个模块,然后使用该模块,但我的问题是当我设置trainable = True
和tags = {"train"}
创建模块时,由于批量标准化层,我无法进行评估。所以当我读到这个问题时,我发现我还应该创建另一个图表来进行评估而不设置tags = {"train"}
. 但我不知道如何将变量从训练图恢复到评估图。我尝试创建具有相同名称的两个模块并reuse = True
在评估图中使用,但这没有帮助。
问问题
423 次
1 回答
2
为了社区的利益,在回答部分指定 Arno 引用的解决方案(即使它出现在评论部分)。
答案是:
对于hub.Module
TF1,情况正如您所说:训练或推理图都被实例化,并且没有好的方法可以在单个 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 回答