【问题标题】:Regularly evaluating large test sets during Convolutional Neural Network training在卷积神经网络训练期间定期评估大型测试集
【发布时间】:2016-09-30 14:23:23
【问题描述】:

我用我想要训练的 TensorFlow 创建了一个小型卷积神经网络。

在训练期间,我想记录几个指标。其中之一是独立于训练集的测试集的准确性。

MNIST 示例向我展示了如何做到这一点:

  # Train the model, and also write summaries.
  # Every 10th step, measure test-set accuracy, and write test summaries
  # All other steps, run train_step on training data, & add training summaries

  def feed_dict(train):
    """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
    if train or FLAGS.fake_data:
      xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)
      k = FLAGS.dropout
    else:
      xs, ys = mnist.test.images, mnist.test.labels
      k = 1.0
    return {x: xs, y_: ys, keep_prob: k}

  for i in range(FLAGS.max_steps):
    if i % 10 == 0:  # Record summaries and test-set accuracy
      summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
      test_writer.add_summary(summary, i)
      print('Accuracy at step %s: %s' % (i, acc))
    else: # Record train set summarieis, and train
      summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
      train_writer.add_summary(summary, i)

它的作用是每 10 步将整个测试集输入到评估中,并打印出这个准确度。

这很酷,但我的测试集要大一些。我有大约 2000 个尺寸为 30x30x30x8 的“图像”,因此一次将所有这些数据集输入到评估中会炸毁我的核心内存和 GPU 内存。

作为一种解决方法,我有这个:

accuracy = mymodel.accuracy(logits, label_placeholder)

test_accuracy_placeholder = tf.placeholder(tf.float32, name="test_accuracy")
test_summary = tf.scalar_summary("accuracy", test_accuracy_placeholder)


# training loop
for batch_idx in enumerate(batches_in_trainset):

    #do training here
    ...

    # check accuracy every 10 examples
    if batch_idx % 10 == 0:

        test_accuracies = []  # start with empty accuracy list

        # inner testing loop
        for test_batch_idx in range(batches_in_testset):
            # get testset batch
            labels, images = testset.next_batch()

            # make feed dict
            feed_dict = {
                # ...
            }

            # calculate accuracy
            test_accuracy_val = sess.run(accuracy, feed_dict=test_feed_dict)

            # append accuracy to the list of test accuracies
            test_accuracies.append(test_accuracy_val)

        # "calculate" and log the average accuracy over all test batches
        summary_str = sess.run(test_summary,
                               feed_dict={
                                   test_accuracy_placeholder: sum(test_accuracies) / len(test_accuracies)})

        test_writer.add_summary(summary_str)

基本上,我首先收集测试集批次的所有准确度,然后将它们输入第二个(断开连接的)图表,计算这些批次的平均值。

从某种意义上说,我确实能够在所需的时间间隔内计算出测试集的准确度。

但是,这感觉很尴尬,并且有一个严重的缺点,即除了测试集的准确性之外,我无法记录其他任何内容。

例如,我还想记录整个测试集上的损失函数值,整个测试集上的激活直方图,也许还有其他一些变量。

最好这应该像在 MNIST 示例中一样工作。在此处查看 TensorBoard 演示:https://www.tensorflow.org/tensorboard/index.html#events

在本摘要中,所有变量和指标均在测试集和训练集上进行评估。我也想要那个!但我希望在不以某种方式将完整的测试集输入到我的模型中的情况下这样做。

【问题讨论】:

  • 在大型数据集上,典型的方法是让不同的过程进行训练和评估。您的主要训练过程会定期保存检查点,同时您的评估过程处于无限循环中,读取最新的检查点,评估,然后保存摘要。他们会将摘要保存到不同的文件中,然后 TensorBoard 收集并显示在同一图表上
  • 谢谢,这种方法看起来很有趣。但我想知道:在您的场景中处理资源的好方法是什么?如果我理解正确的话,一个 TensorFlow 会话使用主机的所有资源,并且一次只能有一个 CUDA-Session。有没有办法在一台机器上做到这一点?不幸的是,我只有一个 GPU 可用,我宁愿不处理同步两个执行的任务。

标签: python machine-learning tensorflow deep-learning


【解决方案1】:

看起来这个函数添加了流式度量评估(contrib)。

https://www.tensorflow.org/api_guides/python/contrib.metrics

【讨论】:

  • 这个函数只有一点点帮助:我现在可以在 tensorflow 中计算平均准确度,而不是使用 numpy.但是,我对这种方法的主要问题仍然存在:基本上我有两个几乎不连贯的图表,两个不同的计算,而且我只能计算准确性 - 在测试集评估期间不能计算任何激活值或权重/偏差值。
猜你喜欢
  • 2020-09-10
  • 2018-05-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
相关资源
最近更新 更多