tl; dr 我们如何在单个会话中跨多次运行有效缓冲未完成子图的输出?
在张量流中,我们试图从几个“输入”模型(实际上作为输出图的预处理器)提供“输出”模型。为了以后的简便,我们希望将其作为单个张量流图实现。输入模型以非常不同的速率接收数据,例如,一个是每分钟一致的时间序列,另一个是每天只更新一次的聚类算法。每个新输入作为python dict提供给同一会话中的新运行,并且输出模型应该随每个新输入数据更新。鉴于这是一个具有历史依赖性的有状态系统,维持输入序列至关重要。
目前,我们在如何基本上连接输入模型的输出方面存在问题。问题是我们似乎无法有效地缓冲大多数输入层输出,只更新我们现在拥有的数据。
我们尝试过:变量分配,导致迭代过时的数据传递到输出,FIFO队列,这对于这样一个简单的任务似乎变得非常复杂,而partial_run()的每次输入模型更新时都必须重新设置(),大多数时候都会失败。
我们希望这样,这种缓冲解决方案与提供大量输入数据兼容,例如培训,但这并不是一个严格的要求。
这一切都是用python缓冲区实现的,它将从完全分离的模型中提取数据并手动为输出模型创建输入向量。当然,这种方法很有效,但在添加更多输入模型时会显得过于复杂,并且会变得过于复杂。
玩具示例:
import tensorflow as tf
ilayera_in = tf.placeholder(shape=[None, 3], dtype=tf.float32)
ilayera_out = tf.reduce_mean(ilayera_in, axis=-1)
ilayerb_in = tf.placeholder(shape=[None, 3], dtype=tf.float32)
ilayerb_out = tf.reduce_mean(ilayerb_in, axis=-1)
# this is where the 'buffering' should take place.
olayer_in = tf.concat([[ilayera_out], [ilayerb_out]], axis=0)
olayer_out = tf.reduce_max(olayer_in)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(olayer_out, feed_dict={ilayera_in: [[1, 1, 1]], ilayerb_in: [[1, 1, 1]]})) # 1
print(sess.run(olayer_out, feed_dict={ilayera_in: [[2, 2, 2]], ilayerb_in: [[3, 3, 3]]})) # 3
# tf will, of course, raise an exception on the next line. how can i reuse
# the *result* of the previous run of ilayerb with the new result of ilayera
print(sess.run(olayer_out, feed_dict={ilayera_in: [[1, 1, 1]]})) # 3
print(sess.run(olayer_out, feed_dict={ilayera_in: [[5, 5, 5]]})) # 5
print(sess.run(olayer_out, feed_dict={ilayerb_in: [[3, 3, 3]]})) # 5
print(sess.run(olayer_out, feed_dict={ilayerb_in: [[4, 4, 4]]})) # 5
print(sess.run(olayer_out, feed_dict={ilayera_in: [[1, 1, 1]]})) # 4
print(sess.run(olayer_out, feed_dict={ilayera_in: [[1, 1, 1]], ilayerb_in: [[1, 1, 1]]})) # 1
print(sess.run(olayer_out, feed_dict={ilayera_in: [[1, 1, 1]]})) # 3
print(sess.run(olayer_out, feed_dict={ilayerb_in: [[3, 3, 3]]})) # 3