如何在TensorFlow中使用图形中的循环构建简单的RNN?

Shu*_*hum 6 neural-network tensorflow

我刚开始玩TensorFlow,我正在尝试实现一个非常简单的RNN.RNN具有x作为输出的输入,y并且仅由单个层构成,x并且其先前的输出作为输入.这是我想到的那种事情的图片:

一个简单的RNN

问题是,我无法通过TensorFlow API看到构建带有循环的图形.每当我定义Tensor时,我必须指定它的输入是什么,这意味着我必须已经定义了它的输入.所以有鸡和蛋的问题.

我甚至不知道是否有意义定义带有循环的图形(首先计算什么?我是否必须定义softmax节点的初始值?).我玩了一个使用变量来表示先前输出的想法,然后手动获取值y并在每次通过训练样本后将其存储在变量中.但除非有一种方法可以在图形本身中表示这个过程,因此这将非常缓慢(?).

我知道TensorFlow教程展示了RNN的示例实现,但他们欺骗并将LSTM模块拉出已经具有循环的库.总的来说,这些教程很适合让你了解如何构建某些东西,但是他们可以更好地解释这个野兽是如何工作的.

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

Ish*_*ael 3

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

例如,在您引用的文档中:

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

他们提到

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

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

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