我想使用tensorflow hub,在我的图中重新训练其模块之一,然后使用该模块,但我的问题是当我设置trainable = True
和tags = {"train"}
来创建模块,由于批量归一化层,我无法进行评估。
因此,当我读到这个问题时,我发现我还应该创建另一个图表进行评估,而无需设置 tags = {"train"}
。但我不知道如何将变量从训练图恢复到评估图中。我尝试创建具有相同名称的两个模块,并在评估图中使用 reuse = True
,但这没有帮助。
最佳答案
为了社区的利益,指定 Arno 在答案部分引用的解决方案(即使它存在于评论部分)。
答案是:
使用 TF1 的 hub.Module ,情况如您所说:训练图或推理图都已实例化,并且没有好的方法可以导入两者并在它们之间共享变量单个 tf.Session。这是由估计器和 TF1 中的许多其他训练脚本(尤其是分布式脚本)使用的方法告知的:有一个生成检查点的训练 session ,以及一个从中恢复模型权重的单独的评估 session 。 (两者在读取的数据集和执行的预处理方面也可能有所不同。)
随着 TF2 及其对 Eager 模式的重视,这种情况发生了变化。 TF2 风格的 Hub 模块(如 https://tfhub.dev/s?q=tf2-preview 所示)实际上只是 TF2-style SavedModels ,并且这些不带有多个图形版本。相反,如果需要区分训练/推理,则恢复的顶级对象上的call函数会采用可选的training=...参数。
这样一来,TF2 应该符合您的期望。请参阅交互式演示 tf2_image_retraining.ipynb以及 tensorflow_hub/keras_layer.py 中的底层代码如何做到这一点。 TF Hub 团队正在努力为 TF2 版本提供更完整的模块选择。
关于python - Tensorflow hub 微调和评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53849214/