【问题标题】:Replacing input pipeline at test (tf.contrib.data without placeholders)在测试中替换输入管道(没有占位符的 tf.contrib.data)
【发布时间】:2017-07-25 21:12:32
【问题描述】:

我在训练期间将 tf.contrib.data 函数用于我的输入管道(没有占位符)。我的问题是如何在测试时重用经过训练的模型并输入新数据?这个问题类似于this one,除了我也不想在测试中使用占位符——我的测试数据集可能非常大,也应该避免占位符的减速。

有没有办法在测试中用新的输入管道替换输入管道?

【问题讨论】:

  • 可以在输入管道之间切换,查看:stackoverflow.com/questions/41162955/…
  • 我在迭代器之间切换以进行训练/验证,但在测试时我希望能够插入一些任意数据 - 例如训练模型时不可用的数据。

标签: tensorflow


【解决方案1】:

我不确定是否有解决此问题的最佳方法,但我就是这样解决的:

在我的模型中,我使用的是简单的 MLP,所以我的 model() 函数中有这样的行:

train_layer = tf.add(tf.matmul(x_train, weights['w1']), biases['b1'])
train_layer = tf.nn.relu(train_layer)
test_layer = tf.add(tf.matmul(x_test, weights['w1']), biases['b1'])
test_layer = tf.nn.relu(test_layer)

如您所见,我有两个输入,x_trainx_test。这些是从 tf.contrib.data 数据集迭代器获取批量数据的句柄:

x_train, x_train_labels = train_iter.get_next()
x_test, x_test_labels = test_iter.get_next()

所以我基本上在同一个图中有两个数据流,它们执行完全相同的操作。我还有模型的两个输出,mlp_trainmlp_test,这取决于模型是使用 x_train 还是 x_test 输入进行评估的。

现在:如果您使用mlp_train 输出创建优化器,并使用mlp_test 输出创建测试指标,您只需运行:sess.run(optimiser) 在训练数据集上训练您的系统,然后运行@987654333 @ 在您的测试数据集上测试您的系统,您永远不需要使用 feed_dict。

编辑:我阅读了您关于使用“训练模型时不可用的数据”的评论,我认为这个答案不能满足这一点。

【讨论】:

  • 是的,以后也不允许插入任意新的输入管道。应该有某种方法可以将模型输入重新连接到其他东西,但我仍然找不到任何东西。
  • 另外,这似乎是在训练和验证之间切换的一种不必要的复杂方式。您可以使用占位符在两个迭代器之间切换,而不是两次编写模型。如果占位符是布尔值,则开销应该最小(即不是一批图像)。
猜你喜欢
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 2017-12-18
  • 2020-08-28
  • 2013-04-08
相关资源
最近更新 更多