steps参数如何与tf.contrib.learn中的样本大小相关?

时间:2017-04-29 12:32:25

标签: python tensorflow

1.0中的固定估算器(LinearClassifier,DNNClassifier等)使用Trainable接口定义:

fit(
    x=None,
    y=None,
    input_fn=None,
    steps=None,
    batch_size=None,
    monitors=None,
    max_steps=None
)

并将步骤描述为

  

训练模型的步骤数。如果没有,永远训练。 '步骤'逐步工作。如果您调用两次(步数= 10),则总共20个步骤进行训练。如果您不想要增量行为,请改为设置max_steps。如果设置,则max_steps必须为None。

我对这意味着什么感到茫然。

m = LinearClassifier(
    feature_columns=[sparse_column_a, sparse_feature_a_x_sparse_feature_b],
    optimizer=tf.train.FtrlOptimizer(
      learning_rate=0.1,
      l1_regularization_strength=0.001
    )) 

m.fit(input_fn=train_input_fn, steps=???)

使用LinearClassifier,我们如何训练train_input_fn的单次传递?步骤应该是train_input_fn中的样本数量吗?

如果我们想在train_input_fn次培训每个样本3次怎么办?

答案1(已删除?):"步骤是调用input_fn进行数据生成的次数"

我认为这个问题的很多逻辑都在Estimator的_train_model function

执行以下操作:

all_hooks = []
self._graph = ops.Graph()
with self._graph.as_default() as g, g.device(self._device_fn):
  random_seed.set_random_seed(self._config.tf_random_seed)
  global_step = contrib_framework.create_global_step(g)
  features, labels = input_fn()
  .......
  .......
  with monitored_session.MonitoredTrainingSession(
      ...
      hooks=all_hooks + model_fn_ops.training_hooks,
      chief_only_hooks=chief_hooks + model_fn_ops.training_chief_hooks,
      ...
  ) as mon_sess:
    loss = None
    while not mon_sess.should_stop():
      _, loss = mon_sess.run([model_fn_ops.train_op, model_fn_ops.loss])

input_fn仅被调用一次,然后对于每个步骤, mon_sess.run([model_fn_ops.train_op, model_fn_ops.loss])正在运行

这表明每个input_fn都没有调用step。另外,根据经验,我尝试了像

这样的输入函数
def train_input_fn():
    current_log = TRAIN_FILES.pop()
    with open('./logs/' + str(random.random()) + "__" + str(uuid.uuid4()) + "__" +  str(time.time()) + ".run", "wb") as fh:
        fh.write(("Ran log file %s" % (current_log)).encode('utf-8'))

并且对于步骤> 1仍然只写了一个日志文件。

2 个答案:

答案 0 :(得分:0)

通过查看Trainable的文档(您也链接了),并专门将stepsmax_steps进行比较,看起来区别在于:

  

fit(steps=100)的两次调用意味着200次训练迭代。在   另一方面,两次拨打fit(max_steps=100)表示第二次通话   因为第一次调用完成了所有100步,所以不会进行任何迭代。

所以我认为如果你在一个循环中运行steps,你会使用fit,你正在做的每次迭代都会改变你的{{1}的输入和目标数据。功能,例如从磁盘上的文件加载新数据。在伪代码中:

fit

这将生成每个外循环迭代的新训练数据,并在def input_fn(): """Get features and labels in batches.""" new_features = get_new_features() new_labels = get_new_labels() return new_features, new_labels for _ in range(num_iterations): m.fit(input_fn=input_fn, steps=num_steps) # runs num_steps times on current data set 的训练数据集上运行。最终你可能会将其设置为迭代地遍历整个数据集一次,然后将循环包装在另一个循环中以运行多个时期。但是,如果您一次性提供所有培训数据,那么您将使用num_steps代替。再次,在伪代码中。

max_steps

在循环的单次迭代中,您将在整个数据集中工作(可能使用def input_fn(): """Get ALL features and labels.""" all_features = get_all_features() all_labels = get_all_labels() return all_features, all_labels for _ in range(num_epochs): m.fit(input_fn=input_fn, max_steps=num_max_steps) # runs num_max_steps times on full dataset 的{​​{1}}参数来控制批量大小),然后循环的每次迭代都是通过整个数据集的另一个时代。

无论哪种方式,batch_size仅对fit的一次调用只调用一次是有意义的,因为input_fn只是提供fit将要提供的数据操作从它调用的任何循环的迭代。

答案 1 :(得分:0)

  

使用LinearClassifier,我们如何训练单次传球   train_input_fn?步数应该是样本数量   train_input_fn?

input_fn应返回以下元组: features (张量或张量词典)和标签(张量或张量词典)。这些功能和标签将构建一个小批量运行计算。

最简单的input_fn可能如下所示:

def input_fn():
    value_a = tf.constant([0.0])
    features = {'a': value_a}

    label = tf.constant([1.0])
    return features, labels

当调用m.fit()时,它调用_input_fn_来构造图的馈送部分。然后m.fit()创建一个会话,运行初始化程序,启动queue_runners等,并调用session.run(...)步骤次或直到抛出某个异常。

因此,如果你想训练一次输入input_fn,你可以这样做:

m.fit(input_fn=input_fn, steps=1)

如果要更改小批量中的样本数,则需要更改input_fn以返回更多样本和标签。

  

如果我们想在train_input_fn中对每个样本进行3次训练怎么办?

有几种选择:

  1. 如果你将input_fn与tf.constants一起使用,你可以多次执行m.fit()
  2. 如果您使用读者和队列(https://www.tensorflow.org/programmers_guide/reading_data),您可以指定_num_epochs_,这是数据的送达次数。
  3. 在tensorflow 1.1中,有一个辅助函数(https://www.tensorflow.org/api_docs/python/tf/estimator/inputs)来创建input_fn,用于将numpy数组和pandas数据帧提供给图形。对于它们两者,您可以指定_num_epochs _。