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

nkc*_*nor 6 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
)
Run Code Online (Sandbox Code Playgroud)

并将步骤描述为

训练模型的步数.如果没有,永远训练.'steps'以递增方式工作.如果您调用两次(步数= 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=???)
Run Code Online (Sandbox Code Playgroud)

使用LinearClassifier,我们如何训练一次train_input_fn?应该是步数是train_input_fn多少?

如果我们想要对每个样品进行train_input_fn3次训练怎么办?

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

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

它执行以下操作:

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])
Run Code Online (Sandbox Code Playgroud)

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'))
Run Code Online (Sandbox Code Playgroud)

对于步骤> 1,仍然只写入一个日志文件.

Eng*_*ero 0

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

两次调用fit(steps=100)意味着 200 次训练迭代。另一方面,两次调用fit(max_steps=100)意味着第二次调用不会执行任何迭代,因为第一次调用完成了所有 100 个步骤。

因此,我认为如果您在循环内steps运行,则您会使用循环,每次迭代您都会执行一些更改进入函数的输入和目标数据的操作,例如从磁盘上的文件加载新数据。在伪代码中:fitfit

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
Run Code Online (Sandbox Code Playgroud)

这将在每次外循环迭代时生成新的训练数据,并在该训练数据集上运行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
Run Code Online (Sandbox Code Playgroud)

在循环的单次迭代中,您将遍历整个数据集(可能使用 的batch_size参数来fit控制批量大小),然后循环的每次迭代都是整个数据集的另一个纪元。

input_fn无论哪种方式,对于 的单次调用只调用一次是有意义的fit,因为只是提供将在其调用的任何循环的本次迭代中进行操作的input_fn数据。fit