了解张量输入和用于LSTM的转换(动态RNN)

时间:2017-11-16 10:28:50

标签: tensorflow lstm rnn

我正在Tensorflow中构建一个LSTM风格的神经网络,并且在将 tf.nn.dynamic_rnn 传递给 tf.nn.dynamic_rnn 所做的后续转换很难理解> sparse_softmax_cross_entropy_with_logits 图层。

https://www.tensorflow.org/api_docs/python/tf/nn/dynamic_rnn

了解输入

输入功能正在以

的形式发送一个特征张量

[batch_size,max_time]

然而,手册指出输入张量必须采用

形式

[batch_size,max_time,...]

因此我使用1d张量扩展输入以采用

形式

[batch_size,max_time,1]

此时输入不会在运行时中断,但我不清楚我们在这里做了什么,并怀疑它在计算损失时可能导致问题(见下文)。

了解转换

这种扩展的张量就是'特征'张量在下面的代码中使用

LSTM_SIZE = 3
lstm_cell = rnn.BasicLSTMCell(LSTM_SIZE, forget_bias=1.0)
outputs, _ = tf.nn.dynamic_rnn(lstm_cell, features, dtype=tf.float64)

#slice to keep only the last cell of the RNN
outputs = outputs[-1]

#softmax layer

with tf.variable_scope('softmax'):
   W = tf.get_variable('W', [LSTM_SIZE, n_classes], dtype=tf.float64)
   b = tf.get_variable('b', [n_classes], initializer=tf.constant_initializer(0.0), dtype=tf.float64)

logits = tf.matmul(outputs, W) + b

loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels))

这会在丢失

时抛出值错误

尺寸必须相等,但 [max_time,num_classes]和[batch_size]

来自https://www.tensorflow.org/versions/r0.12/api_docs/python/nn/classification -

一个常见的用例是记录形状[batch_size,num_classes]和形状标签[batch_size]。但支持更高的维度。

在过程中的某个时刻,max_time和batch_size已经混淆了,我不确定它是在输入时还是在LSTM期间。我很感激任何建议!

1 个答案:

答案 0 :(得分:1)

这是因为tf.nn.dynamic_rnn的输出形状。从其文档https://www.tensorflow.org/api_docs/python/tf/nn/dynamic_rnn

输出:RNN输出Tensor。

如果time_major == False(默认),这将是一个Tensor形状:[batch_size,max_time,cell.output_size]。

如果time_major == True,这将是一个Tensor形状:[max_time,batch_size,cell.output_size]。

您处于默认情况,因此outputs气体形状[batch_size, max_time, output_size],以及执行outputs[-1]时,您获得形状为[max_time, output_size]的张量。可能用outputs[:, -1]进行切片应该修复它。