TensorFlow:以小步增量拟合相当于1个大增量的拟合?

时间:2017-04-21 19:32:28

标签: tensorflow

我制作了一个具有特定模型功能的TensorFlow估算器:

estimator = tf.contrib.learn.Estimator(
    model_fn=_model_fn_for_penguin_model,
    model_dir=/tmp/penguin_classification,
    config=tf.contrib.learn.RunConfig(
       save_summary_steps=5))

然后调用estimator.fit来训练模型。我注意到如果我以小步增量(而非批量大小)训练,如10,则OptimizeLoss度量收敛:

step_increment = 10
for step in xrange(0, 1e6, step_increment):
  # Train for certain increment of steps.
  estimator.fit(
      input_fn=_input_fn_for_train, steps=step_increment)

我可以基于TensorBoard来判断(奇怪的是,我的评估数据集的损失实际上增加了......但这可能是一个无关紧要的问题)

enter image description here

但是,如果我使用更大的步长增量大小,例如200,那么损失就会波动:

step_increment = 200
for step in xrange(0, 1e6, step_increment):
  # Train for certain increment of steps.
  estimator.fit(
      input_fn=_input_fn_for_train, steps=step_increment)

这让我感到困惑,因为在我看来,上面两段代码片段应该在一天结束时做同样的事情:训练一百万步的模型。那不是这样吗?

我不相信这源于随机播种 - 我可以一致地重现这种行为。

这是输入功能。

def make_input_fn(mode):
  def internal_input_fn():
    include_target = mode != tf.contrib.learn.ModeKeys.INFER
    feature_spec = tf.contrib.layers.create_feature_spec_for_parsing(
        feature_columns=_get_feature_columns(
            include_target_column=include_target))
    feature_map = tf.contrib.learn.read_batch_features(
        batch_size=100,
        features=feature_spec,
        file_pattern=os.path.join("/tmp", mode + ".tfrecord"),
        queue_capacity=250,
        randomize_input=True,
        reader=tf.TFRecordReader)
    target = feature_map.pop() if include_target else None
    return feature_map, target
  return internal_input_fn

1 个答案:

答案 0 :(得分:1)

这些调用应该是等效的,但要记住的一件事是input_fn的行为。例如,如果没有随机化,第一种情况可以循环多达1M个训练样例,而第二种情况只会多次重新访问相同的200个样本。