【问题标题】:"Online" validation with TensorFlow使用 TensorFlow 进行“在线”验证
【发布时间】:2017-07-05 00:08:55
【问题描述】:

我的数据是一组匹配和结果,按时间顺序列出。通常,出于“离线”验证的目的,我会运行以下代码来测试我的算法的运行情况:

# train
for matches_batch, outcomes_bach in train_data:
    sess.run(optimizer, feed_dict={matches: matches_batch, outcomes: outcomes_batch})

# offline validation (just compute accuracy on test set)
test_accuracy = sess.run(accuracy, feed_dict={matches: test_matches, outcomes: test_outcomes})
print 'test accuracy = {:.2%}'.format(test_accuracy)

但是,在现实世界中。事情将“在线”完成,我在离线时训练一堆匹配,然后每次我预测一个新匹配时,我也会通过使用结果运行优化器来更新我的模型参数,如下所示:

# train
for matches_batch, outcomes_bach in train_data:
    sess.run(optimizer, feed_dict={matches: matches_batch, outcomes: outcomes_batch})

# online validation (update accuracy and model with each new data point)
test_accuracy = 0.0
for match, outcome in zip(test_matches, test_outcomes):
    _, acc = sess.run([optimizer, accuracy], feed_dict={matches: [match], outcomes: [outcome])
    test_accuracy += acc / len(test_matches)
print 'test accuracy = {:.2%}'.format(test_accuracy)

问题是上述在线测试的实现(这是验证方案here的一部分)很慢。

有没有办法通过 tensorflow 来加快在线验证的速度?

【问题讨论】:

  • @user1735003 它们不可互换。第一个版本仅在训练数据上进行训练,第二个版本在评估其预测是否正确后,使用测试数据集中的每个数据点重新训练自己,这更能反映现实世界的场景。
  • @user1735003 验证步骤计算的不是同一件事。版本 1 中的验证准确度比版本 2 更低且不太现实,因为版本 2 在每个数据点之后都会改进其参数——请注意,会话在版本 2 的验证步骤期间也会运行优化器,这在版本 1 中不会发生.

标签: python validation optimization tensorflow


【解决方案1】:

快速浏览论文后,我的想法如下:

  • 他们用几个(数量未知)样本而不是一个样本来更新他们的模型 - 可以说他们采取了足够的样本来填充一个小批量。
  • 然后他们验证一次。

这对您的实施意味着什么:

  • 您无需在线重新训练整个折叠,只需在小批量上进行
  • 您不必一次计算一个样本的验证准确度,而采用更快的方法(小批量,甚至是您的代码中的整个数据集,如果您负担得起的话)。

以上两点应该可以显着加快速度。

最后,不要使用测试来代替验证,尤其是在涉及对其进行培训时。

【讨论】:

  • 每次比赛后我都必须更新模型参数,所以这行不通。他们在论文中做了同样的事情:“该算法首先在训练集上进行训练(这是第 III-C 节中描述的“离线训练”阶段),然后在不相交的测试数据集上评估其性能,同时 在每次测试匹配结果后更新参数(“在线更新”阶段)。“
  • 是的,我也看到“我们从数据库中恢复了刚刚结束的比赛中所有球员的最后几场比赛的组成。要恢复的比赛数需要是验证 (..)”。在我看来,他们没有使用单个样本。
  • 无论我是只使用最近一场比赛还是使用最近一场比赛中所有球员的最后一场n比赛,这个答案都无助于加快在线验证步骤,因为模型参数仍然需要在在线更新阶段每次新比赛后更新。
  • 同样,在文章中,在线更新仅在小批量上发生。与在整个验证集上重新训练相比,这怎么能不加快速度呢?
  • 他们还检查了整个验证集。不同之处在于:对于验证集中的每场比赛,他们还从该比赛中所有玩家的最后一次n 比赛中抽取。我不这样做是因为数据库查询的成本太高。因此,如果验证集中有 k 匹配,那么它们将在 n 大小的小批量上运行 k 更新,而我在单个匹配上运行 k 更新。很抱歉,您的 cmets 或您的回答都没有帮助。看来你试图做的只是破坏我的问题,因为你不理解它。
猜你喜欢
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
相关资源
最近更新 更多