我想使用tensorflow集线器,在我的图中重新训练其模块之一,然后使用该模块,但是我的问题是,当我设置trainable = True
和tags = {"train"}
来创建模块时,我可以由于批次归一化层,因此不进行评估。
因此,当我阅读此问题时,我发现我还应该在不设置tags = {"train"}
的情况下创建另一个图形进行评估。但我不知道如何将训练图的变量还原为评估图。我尝试使用相同的名称创建两个模块,并在评估图中使用reuse = True
,但这没有帮助。
您能帮我吗? @arnoegw
答案 0 :(得分:0)
为了社区的利益,指定Arno在“答案”部分中引用的解决方案(即使它在“注释”部分中也存在)。
答案是
使用TF1的hub.Module
时,情况就如您所说:训练图或推理图都被实例化,并且没有很好的方法在单个tf.Session中导入两者并在它们之间共享变量。这是由Estimators和TF1中的许多其他训练脚本(尤其是分布式脚本)使用的方法所告知的:有一个训练课程可生成检查点,而另一个评估会话可从中恢复模型权重。 (两者在读取的数据集和执行的预处理方面也可能会有所不同。)
借助TF2及其对“急切”模式的强调,这种情况已经改变。 TF2样式的集线器模块(在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版本提供更完整的模块选择。