具有可变迭代部分的TensorFlow图

时间:2016-11-28 09:24:43

标签: python neural-network tensorflow recurrent-neural-network

我正在创建一个TensorFlow图,它有两个部分:编码器和解码器;解码器之后是优化。编码器和解码器都是递归神经网络,其登记分别取决于可变长度输入和目标序列。换句话说,如果输入序列具有5个元素并且目标序列具有6个元素,则编码器必须具有5个登记并且解码器必须具有6个登记。我虽然可以通过在图表上方创建两个变量来实现这一目标:

len_input = 1
len_target = 1

并在图表中有代码:

graph = tf.Graph()
with graph.as_default():
...
    # Encoder
    for t in range(len_input):
       ...

    # Decoder
    for t in range(len_target):
        ...

然后当我运行会话时,我会相应地更新它们:

with sess = tf.Session(graph=graph):
tf.initialize_all_variables().run()
for step in range(num_batches):
    input = en_data.pop()
    len_input = input.shape[1]
    target = fr_data.pop()
    len_target = target.shape[1]

但是,这根本不能产生预期的结果。相反,图表只会对编码器和解码器进行一次注册,就像首次编译图形时一样。

在你告诉我我可以在注册中保存Tensors之前,在我的情况下问题是丢失函数取决于解码器的输出,这取决于编码器的输出。换句话说,优化器优化了编码器和解码器中的所有权重,这意味着它们都需要在一个图形中。如果我要在注册时保存值Tensors,我需要为编码器和解码器创建两个单独的图表,因为两者的注册数量不必相同。

我对此非常难过。起初,我想有一个占位符,我可以提供编码器和解码器的注册次数,但占位符本身是Tensor,因此不能在for range函数中使用环。我不知道我能做什么。有什么建议?提前致谢! :)

1 个答案:

答案 0 :(得分:1)

TensorFlow支持使用图中的控制流结构动态展开循环。您可以使用以下接口之一,而不是使用Python for循环来定义迭代,这样您就可以将循环体定义为Python对象或函数:

  • 如果您的编码器和解码器与TensorFlow的tf.nn.rnn_cell.RNNCell接口匹配,您可以使用tf.nn.dynamic_rnn()来定义具有不同时间步数的RNN。 sequence_length参数允许您将批处理中每个序列的长度指定为tf.Tensor,TensorFlow将执行适当次数的单元格。

  • 如果相反,循环体可以更容易地表示为Python函数,则可以使用tf.while_loop()tf.scan()高阶函数来定义循环。

    < / LI>