这些步骤参数与tf.contrib.learn中样本的大小有何关系



1.0中的罐装估计器(LinearClassifier,dnnClassifier等(使用可训练的接口来定义:

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

并将步骤描述为

训练模型的步骤数。如果没有,请永远训练。"步骤"逐渐起作用。如果您致电两次拟合(步骤= 10(,则总共进行20个步骤。如果您不想具有增量行为,请改用MAX_STEPS。如果设置,max_steps必须无。

我完全不知所措。

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=???)

使用线性classifier,我们如何在train_input_fn的单个传球上训练?步骤应该是train_input_fn中的样本数量?

如果我们想在train_input_fn中的每个样本上训练3次?

答案1(已删除?(:"步骤是input_fn被称为数据生成的次数"

我认为这个问题的许多逻辑都在估算器的_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])

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

这表明每个step不调用input_fn。另外,从经验上讲,我尝试了一个输入函数,例如

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仍然只有一个日志文件。

通过查看可训练的文档(您还链接(,并专门将stepsmax_steps进行了比较,看起来不同的是:

fit(steps=100)的两个电话意味着200个训练迭代。在 另一方面,对fit(max_steps=100)的两个电话表示第二个电话 自第一次通话做所有100个步骤以来,都不会进行任何迭代。

因此,我认为如果您在循环内运行fit,则您将使用steps,您正在执行的每一次迭代都会执行更改输入和目标数据转移到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

在此循环的单个迭代中,您可以通过整个数据集进行操作(可能使用fitbatch_size参数来控制批处理大小(,然后循环的每个迭代是整个数据集的另一个时段。<<<<<<<<<<<<<<<<<</p>

无论哪种方式,对于fit的一个呼叫,input_fn只能被调用一次,因为input_fn只是提供了fit在此迭代中运行的数据。

使用线性classifier,我们如何在一次传球上进行训练 train_input_fn?应该步骤是样本数量的数量 train_input_fn?

input_fn应返回一个元组:特征(张量的张或字典(和 labels (张量的张量或词典(。这些功能和标签将构建一个小批量,以运行。

最简单的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(...( steps times或直到抛出某些例外。

因此
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_,这是数据次数的数量。

在Tensorflow 1.1中,有一个辅助函数(https://www.tensorflow.org/api_docs/python/tf/estimator/inputs/inputs(来创建input_fn,用于馈送numpy阵列和pandas数据框架。对于他们两个

相关内容

  • 没有找到相关文章

最新更新