2

我正在使用带有 LSTMCell 的 dynamic_rnn,它输出了一个包含内部状态的 LSTMStateTuple。在这个对象上调用 reshape (我的错误)会产生一个张量,而不会在图形创建时造成任何错误。通过图表提供输入时,我在运行时也没有收到任何错误。

代码:

cell = tf.contrib.rnn.LSTMCell(size, state_is_tuple=True, ...)
outputs, states = tf.nn.dynamic_rnn(cell, inputs, ...)
print(states) # state is an LSTMStateTuple
states = tf.reshape(states, [-1, size])
print(states) # state is a tensor of shape [?, size]

这是一个错误(我问,因为它没有在任何地方记录)?什么是重塑张量持有?

4

1 回答 1

0

我做了一个类似的实验,可能会给你一些提示:

>>> s = tf.constant([[0, 0, 0, 1, 1, 1],
                     [2, 2, 2, 3, 3, 3]])
>>> t = tf.constant([[4, 4, 4, 5, 5, 5],                                                             
                     [6, 6, 6, 7, 7, 7]])
>>> g = tf.reshape((s, t), [-1, 3]) # <tf.Tensor 'Reshape_1:0' shape=(8, 3) dtype=int32>
>>> sess.run(g)
array([[0, 0, 0],
       [1, 1, 1],
       [2, 2, 2],
       [3, 3, 3],
       [4, 4, 4],
       [5, 5, 5],
       [6, 6, 6],
       [7, 7, 7]], dtype=int32)

我们可以看到它只是连接第一维中的两个张量并执行整形。由于 LSTMStateTuple 就像一个命名元组,因此它与元组具有相同的效果,我认为这也是您的情况。

让我们更进一步,

>>> st = tf.contrib.rnn.LSTMStateTuple(s, t)
>>> gg = tf.reshape(st, [-1, 3])
>>> sess.run(gg)
    array([[0, 0, 0],
           [1, 1, 1],
           [2, 2, 2],
           [3, 3, 3],
           [4, 4, 4],
           [5, 5, 5],
           [6, 6, 6],
           [7, 7, 7]], dtype=int32)

我们可以看到,如果我们创建一个 LSTMStateTuple,结果验证了我们的假设。

于 2017-11-02T05:06:06.300 回答