【问题标题】:How to build a simple RNN with a cycle in the graph in TensorFlow?如何在 TensorFlow 中的图中构建一个带有循环的简单 RNN?
【发布时间】:2016-02-17 17:51:14
【问题描述】:

我刚刚开始使用 TensorFlow,我正在尝试实现一个非常简单的 RNN。 RNN 将x 作为输入,y 作为输出,并且只包含一个以x 和它之前的输出作为输入的层。这是我想到的那种事情的图片:

问题是,我看不到任何通过 TensorFlow API 构建包含循环的图的方法。每当我定义张量时,我都必须指定它的输入是什么,这意味着我必须已经定义了它的输入。所以有一个先有鸡还是先有蛋的问题。

我什至不知道定义一个带循环的图是否有意义(首先计算什么?我是否必须定义 softmax 节点的初始值?)。我尝试使用变量来表示先前的输出,然后在每次输入训练样本后手动获取y 的值并将其存储在变量中。但这会很慢,除非有办法在图表本身中表示这个过程(?)。

我知道 TensorFlow 教程展示了 RNN 的示例实现,但他们作弊并将 LSTM 模块从已经包含循环的库中拉出。总体而言,这些教程可以帮助您逐步了解如何构建某些东西,但它们可以更好地解释这个野兽是如何工作的。

那么,TensorFlow 专家,有没有办法构建这个东西?我该怎么做呢?

【问题讨论】:

  • 你的变量想法似乎是一条路,如果你使用TensorFlow变量/分配操作应该不会慢
  • 但我不是必须打电话给sess.run(y_prev.assign(y)) 并一次运行一个样本吗?或者你的意思是我应该把它和@Ishamael 描述的展开策略结合起来?

标签: neural-network tensorflow


【解决方案1】:

事实上,所有机器学习框架中的前向和后向传播都假设您的网络没有循环。实现循环网络的一种常见方法是将其及时展开几个步骤(例如 50 个步骤),从而将具有循环的网络转换为没有循环的网络。

例如,在您所指的文档中:

https://www.tensorflow.org/versions/r0.7/tutorials/recurrent/index.html

他们提到

为了使学习过程易于处理,通常的做法是将反向传播的梯度截断为固定数量 (num_steps) 的展开步骤。

这实际上意味着他们将创建num_steps LSTM 单元,其中每个单元将当前时间步长的值x上一个 LSTM 模块的输出作为输入。

他们使用的BasicLSTMCell,你认为有循环实际上没有循环。 LSTM 单元只是单个 LSTM 步骤的实现(一个具有两个输入 [输入和内存] 和两个输出 [输出和内存] 的块,并使用门从输入计算输出),而不是整个 LSTM 网络。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-19
    • 2019-02-09
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    相关资源
    最近更新 更多