【问题标题】:TensorFlow graph with variable-iteration sections具有可变迭代部分的 TensorFlow 图
【发布时间】:2016-11-28 09:24:42
【问题描述】:

我正在创建一个 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]

但是,这根本不会产生预期的结果。相反,该图只注册一次编码器和解码器,就像第一次编译图时一样。

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

我对此感到非常困惑。起初,我想有一个占位符,我可以向其中输入编码器和解码器的注册数量,但占位符本身是一个张量,因此不能在 for 循环的 range 函数中使用。我不知道我能做什么。有什么建议么?提前致谢! :)

【问题讨论】:

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


    【解决方案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() 高阶函数来定义循环。

    【讨论】:

    • 太棒了。我会试试tf.while_loop 并告诉你它是怎么回事,但这似乎是正确的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多