张量流中的最小 RNN 示例

Posted

技术标签:

【中文标题】张量流中的最小 RNN 示例【英文标题】:Minimal RNN example in tensorflow 【发布时间】:2016-03-28 19:40:10 【问题描述】:

尝试在 tensorflow 中实现一个最小的玩具 RNN 示例。 目标是学习从输入数据到目标数据的映射,类似于这个精彩简洁的example in theanets。

更新:我们快到了。剩下的唯一部分是使其收敛(并且不那么复杂)。有人可以帮助将以下内容转换为运行代码或提供一个简单的示例吗?

import tensorflow as tf
from tensorflow.python.ops import rnn_cell

init_scale = 0.1
num_steps = 7
num_units = 7
input_data = [1, 2, 3, 4, 5, 6, 7]
target = [2, 3, 4, 5, 6, 7, 7]
#target = [1,1,1,1,1,1,1] #converges, but not what we want


batch_size = 1

with tf.Graph().as_default(), tf.Session() as session:
  # Placeholder for the inputs and target of the net
  # inputs = tf.placeholder(tf.int32, [batch_size, num_steps])
  input1 = tf.placeholder(tf.float32, [batch_size, 1])
  inputs = [input1 for _ in range(num_steps)]
  outputs = tf.placeholder(tf.float32, [batch_size, num_steps])

  gru = rnn_cell.GRUCell(num_units)
  initial_state = state = tf.zeros([batch_size, num_units])
  loss = tf.constant(0.0)

  # setup model: unroll
  for time_step in range(num_steps):
    if time_step > 0: tf.get_variable_scope().reuse_variables()
    step_ = inputs[time_step]
    output, state = gru(step_, state)
    loss += tf.reduce_sum(abs(output - target))  # all norms work equally well? NO!
  final_state = state

  optimizer = tf.train.AdamOptimizer(0.1)  # CONVERGEs sooo much better
  train = optimizer.minimize(loss)  # let the optimizer train

  numpy_state = initial_state.eval()
  session.run(tf.initialize_all_variables())
  for epoch in range(10):  # now
    for i in range(7): # feed fake 2D matrix of 1 byte at a time ;)
      feed_dict = initial_state: numpy_state, input1: [[input_data[i]]] # no
      numpy_state, current_loss,_ = session.run([final_state, loss,train], feed_dict=feed_dict)
    print(current_loss)  # hopefully going down, always stuck at 189, why!?

【问题讨论】:

也许你最好从教程开始,从一个工作示例开发你的代码:tensorflow.org/versions/master/tutorials/recurrent/index.html 大部分代码来自教程。我没有找到一个简单的工作示例:ptb_word_lm.py 有 322 行 Reddit 线程 reddit.com/r/MachineLearning/comments/3sok8k/… 表明 tensorflow 还没有为 RNN 工作做好准备——我也很想测试它,但你发现没有工作代码可以试驾。跨度> 这篇博文danijar.com/introduction-to-recurrent-networks-in-tensorflow 提供了一个简单的工作示例来学习这个问题正在寻找的顺序映射。 一些简单的例子:LSTM on MNIST with TensorFlow:github.com/aymericdamien/TensorFlow-Examples/blob/master/…。带有演练的 LSTM 示例:monik.in/…。计数设置位:gist.github.com/monikkinom/e97d518fe02a79177b081c028a83ec1c。还有一个:reddit.com/r/MachineLearning/comments/3sok8k/… 【参考方案1】:

我认为您的代码存在一些问题,但想法是正确的。

主要问题是您对输入和输出使用单个张量,如:inputs = tf.placeholder(tf.int32, [batch_size, num_steps])

在 TensorFlow 中,RNN 函数采用张量列表(因为 num_steps 在某些模型中可能会有所不同)。所以你应该像这样构造输入:inputs = [tf.placeholder(tf.int32, [batch_size, 1]) for _ in xrange(num_steps)]

那么您需要注意您的输入是 int32s,但 RNN 单元适用于浮点向量 - 这就是 embedding_lookup 的用途。

最后,您需要调整您的提要以放入输入列表。

我认为 ptb 教程是一个合理的地方,但如果您想要一个开箱即用 RNN 的更简单示例,您可以查看一些 rnn 单元测试,例如,这里. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/kernel_tests/rnn_test.py#L164

【讨论】:

非常感谢您的建议!现在实现它们会产生运行代码(尽管它仍然很复杂 [双关语!])。剩下的唯一部分就是让它收敛。

以上是关于张量流中的最小 RNN 示例的主要内容,如果未能解决你的问题,请参考以下文章

如何计算张量流中RNN的困惑度

在张量流中连接两个 RNN 状态

在张量流中,如何迭代存储在张量中的输入序列?

根据张量流中给定的序列长度数组对 3D 张量进行切片

由张量流中的索引张量指定的切片二维张量

有没有办法在张量流中剪辑中间爆炸梯度