Skip to main content
 首页 » 编程设计

python之广而深的tensorflow教程: Why do you test using only a batch of your evaluation dataset

2025年01月19日26bonelee

我正在尝试理解 TensorFlow 广泛和深度学习教程。人口普查收入数据集有两个用于验证的文件:adult.data 和 adult.test。 经过一定数量的纪元后,它会打印一个评估(你可以在这里看到完整的代码:https://github.com/tensorflow/models/blob/master/official/wide_deep/wide_deep.py)。它使用“input_fn”从 csv 文件中读取输入信息。它用于读取 adult.data 和 adult.test 这两个文件。

def input_fn(data_file, num_epochs, shuffle, batch_size): 
  """Generate an input function for the Estimator.""" 
  assert tf.gfile.Exists(data_file), ( 
      '%s not found. Please make sure you have either run data_download.py or ' 
      'set both arguments --train_data and --test_data.' % data_file) 
 
  def parse_csv(value): 
    print('Parsing', data_file) 
    columns = tf.decode_csv(value, record_defaults=_CSV_COLUMN_DEFAULTS) 
    features = dict(zip(_CSV_COLUMNS, columns)) 
    labels = features.pop('income_bracket') 
    return features, tf.equal(labels, '>50K') 
 
  # Extract lines from input files using the Dataset API. 
  dataset = tf.data.TextLineDataset(data_file) 
 
  if shuffle: 
    dataset = dataset.shuffle(buffer_size=_NUM_EXAMPLES['train']) 
 
  dataset = dataset.map(parse_csv, num_parallel_calls=5) 
 
  # We call repeat after shuffling, rather than before, to prevent separate 
  # epochs from blending together. 
  dataset = dataset.repeat(num_epochs) 
  dataset = dataset.batch(batch_size) 
  return dataset 

它构建了一个估计器 DNNLinearCombinedClassifier,并像这样评估和打印精度:

... 
results = model.evaluate(input_fn=lambda: input_fn( 
    FLAGS.test_data, 1, False, FLAGS.batch_size)) 
 
# Display evaluation metrics 
print('Results at epoch', (n + 1) * FLAGS.epochs_per_eval) 
print('-' * 60) 
 
for key in sorted(results): 
  print('%s: %s' % (key, results[key])) 

我知道您应该使用批处理训练您的网络。我的问题是,他们为什么要批量评估模型?他们不应该使用整个评估数据集吗?数据集有16281个验证值,不应该这样调用model.evaluate吗?:

_NUM_EXAMPLES = { 
  'train': 32561, 
  'validation': 16281, 
} 
... 
results = model.evaluate(input_fn=lambda: input_fn( 
    FLAGS.test_data, 1, False, _NUM_EXAMPLES['validation'])) 

使用整个验证数据集是错误的吗?

请您参考如下方法:

训练和测试都需要小批量数据,否则两者都可能导致内存不足错误 (OOM)。你是对的,这个问题在训练中更为关键,因为向后传递有效地使内存消耗加倍。但这并不意味着 OOM 在推理上是不可能的。

我的经验示例:

...而且我敢肯定还有很多我没见过的例子。根据您的资源,16281 可能足够小以适合一个批处理,但一般在推理中分批迭代并为此设置单独的设置非常有意义批量大小,例如,如果模型将在另一台资源较少的机器上运行。