【问题标题】:How to persist non-trainable variables in tf.Estimator checkpoint?如何在 tf.Estimator 检查点中保留不可训练的变量?
【发布时间】:2019-04-26 20:29:00
【问题描述】:

我正在尝试包含一个不可训练的Dense 层并初始化为单位矩阵,作为我的张量流估计器的一部分。直觉是这个 Dense 层在标准训练期间通过其输入,然后进行微调。问题是我根本不希望在第一轮更新这些权重,只在微调期间更新。

我可以做几件事来使这些权重不可训练,包括在 Dense 构造函数中使用 trainable 参数,或者在传递给 MomentumOptimizer.compute_gradients() 之前过滤掉其名称中包含的任何内容。

但在任何一种情况下(使密集层不可训练或只是不将其传递给优化器),tf 都会抛出一个错误,指出它找不到与密集层相关的键。

我知道,因为在第一次运行时,dense 是不可训练的,所以它不会保留在检查点文件中。同样,如果它在传递给 compute_gradients 时被过滤掉,也会出现同样的问题。

是否有任何方法可以在运行过程中仅保留未经训练的变量,即使只有它们的初始化值?

NotFoundError(回溯见上文):Key dense/kernel/Momentum not 在检查站发现

【问题讨论】:

    标签: python tensorflow tensorflow-estimator


    【解决方案1】:

    我将在这里回答我自己的问题,因为这对我来说并不是很明显,因为 tf 文档似乎并没有说清楚。如果你想引入一个新的可训练变量,那么它需要在以后的模型中从根本上成为一个不同的模型。因此,为了处理现有权重的微调,新模型中的现有权重必须从热启动设置中解决。

    因此,当您的 Estimator 的模型函数运行时,训练一个模型,有条件地不包括微调层。训练现有模型,然后创建另一个单独的模型。从技术上讲,这只是意味着您需要使用新的模型目录,但热启动设置应该指向您事先训练的模型。

    在微调运行时,您的模型函数应有条件地包含微调层,但它应恢复上次运行的权重,设置热启动设置以查看先前的模型目录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2016-09-16
      • 2018-06-28
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      相关资源
      最近更新 更多