你的问题
你怎么想
tf.cond
做
根据该标志,执行将traingetop[i]或valgetop[i]放入
elem
张量。
tf。康德
实际上是这样的
执行获取所需的内容
二者都
元素
张量。
所以
它永远挂起的原因是因为它正在等待一个元素添加到您的训练暂存区域(以便它可以获取该元素并将其丢弃)。原谅你没有意识到这是它在做什么;这实际上非常违反直觉。文档是
非常
不清楚如何应对。
推荐解决方案(通过Tensorflow文档)
如果您确实需要队列位于同一个图中,那么您需要制作整个图的两个副本,一个由您的训练暂存区提供,另一个由您的验证暂存区提供。然后你只需要在你的
sess.run
呼叫我建议创建一个函数,该函数采用队列输出张量,并返回
model_output
张量。现在你有一个
train_time_output
张量和a
validation_time_output
张量,你可以选择在你的
sess。跑
你需要确保你实际上没有创建新的变量来配合这些新的操作。待办事项
variables
. 看起来他们已经将其从v0.12简化了,基本上可以归结为使用
tf.get_variable
而不是
tf.Variable
我喜欢的工作环境
虽然这是推荐的解决方案(AFAIK),但对我来说非常不满意;你在图上创建了一整套操作,恰好使用了相同的权重。通过滥用训练时间和测试/验证时间之间的分离,似乎存在很大的程序员错误的可能性(导致模型在这些时间的行为出乎意料地不同)。更糟的这并不能解决
tf。康德
要求两个分支的输入值,这只会迫使您复制整个图形,这并不总是可能的。
我不希望我的队列像那样出现在图中,而是将模型视为一个函数,它可以提供一个示例,而不管它来自哪里。也就是说,我将用一个
tf.placeholder
feed_dict
实际提供价值。它的功能是这样的
#inside main training loop
if time_to_train:
example = sess.run(traingettop)
else:
example = sess.run(valgettop)
result = sess.run(model_output, {input_placeholder: example})
tf。康德
a = tf.constant(some_value)
b = tf.placeholder(tf.float32)
flag = tf.placeholder(tf.bool, [])
one_of_them = tf.cond(flag, a, b)
model_output = build_graph(one_of_them)
进入一个不这样的定义,比如:
a = tf.constant(some_value)
model_output = build_graph(a)
a
在执行时:
# In main training loop,
sess.run(train_op, {a: some_other_value})
if condition_satisfied:
sess.run(train_op, {a:some_other_value})
else:
sess.run(train_op)
性能问题
几乎没有性能成本
对于此解决方案,当numpy阵列放入
example
如果您以分布式方式使用tensorflow,那么此解决方案将破坏您的性能;它需要将示例从其所在的任何机器发送到主机,以便它可以将其发送回。