使用TensorFlow Estimator API仅优化模型的某些变量

时间:2019-02-11 16:53:57

标签: tensorflow machine-learning tensorflow-estimator

我需要冻结部分模型并仅训练某些变量。现在,使用低级API,我可以将[{'dimension1': 'foo', 'dimension2': 'bar', 'metric1': 26, 'metric2': 51}, {'dimension1': 'foo', 'dimension2': 'bar', 'metric1': 26, 'metric2': 51}, {'dimension1': 'foo', 'dimension2': 'bar', 'metric1': 25, 'metric2': 51}, {'dimension1': 'foo', 'dimension2': 'bar', 'metric1': 25, 'metric2': 50}] 传递给var_list方法。但是,当我使用TensorFlow Estimator时,我只能传递优化器本身,然后将其用于最小化Estimator内部循环内的损失。

我想到的唯一解决方案是定义一个自定义优化器并覆盖tf.train.Optimizer.minimize方法。像这样:

Optimizer.minimize

现在,我希望每个训练步骤都在屏幕上看到“ Inside ...”字样;特别是当我看到模型训练得很好时。这有点告诉我我的def minimize(self, *args, **kwargs): print("Inside...") if not kwargs['var_list']: kwargs['var_list'] = self.var_list return super(MyOptimizer, self).minimize(*args, **kwargs) 函数已被完全忽略,我似乎无法弄清楚为什么。

因此,重写minimize甚至是正确的方法还是使用Estimators更好的方法呢?

1 个答案:

答案 0 :(得分:1)

您只需指定model_fn函数即可简单地创建自定义估算器

    def model_fn(features, labels, mode):
      logits = model_architecture(features)
      loss = loss_function(logits, labels)
      if mode == tf.estimator.ModeKeys.TRAIN:
        optimizer = optimizer
        train_op = ontimizer.minimize(loss=loss, 
                                      global_step=global_step,
                                      var_list=variables_to_minimize)

      return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)