难以解释tensorflow的dynamic_rnn的输出

时间:2017-01-30 13:55:07

标签: python tensorflow recurrent-neural-network

我正在尝试在张量流中实现基于LSTM单元的RNN。我在每行中都有一系列单词构成了要素,还有一个名为标签的列(可以是1或0)作为目标。我在解释dynamic_RNN的产出方面遇到了困难。 dynamic_RNN返回输出和状态。 我将数据拆分为256个批次。我已经填充/切掉了 每行的长度均匀为160.然后我将它们嵌入(使用手套),使每个单词成为一个百维向量。在此之后我的每个例子变成160乘100矩阵,并且每个批次到RNN函数变成形状的张量 - (256,160,100)。现在假设LSTM单元格的hidden_​​dimension设置为300,每个示例(大小为160 x 100)的隐藏状态向量的预期维度为1 x 300.但是,当我检查rnn_states.h的形状时,我得到以下内容 -

TensorShape([Dimension(None), Dimension(300)])

我期待尺寸为256 x 300.我不确定如何继续进行。

我在下面添加了一些代码和它们的形状。我有两个张量 - train_contexttrain_utterance。我挑选了128个样本,稍后嵌入并连接它们以形成256个输入批次。你能告诉我哪里出错了吗?

train_context.get_shape()
# TensorShape([Dimension(128), Dimension(160)])

train_utterance.get_shape()
# TensorShape([Dimension(128), Dimension(160)])

context_embedded = tf.cast(tf.nn.embedding_lookup(embeddings_W,\
train_context, name="embed_context"), dtype = tf.float64)

utterance_embedded = tf.cast(tf.nn.embedding_lookup(embeddings_W,\ 
train_utterance, name="embed_utterance"), dtype = tf.float64)

context_embedded.get_shape()
# TensorShape([Dimension(128), Dimension(160), Dimension(100)])
utterance_embedded.get_shape()
# TensorShape([Dimension(128), Dimension(160), Dimension(100)])

inputs = tf.concat(0, [context_embedded, utterance_embedded])
inputs.get_shape()
# TensorShape([Dimension(256), Dimension(160), Dimension(100)])

cell = tf.nn.rnn_cell.LSTMCell(300, forget_bias=2.0, use_peepholes=True,\ 
state_is_tuple=True)

cell.state_size
# LSTMStateTuple(c=300, h=300)

rnn_outputs, rnn_states = tf.nn.dynamic_rnn(cell, inputs, dtype=tf.float64,\
parallel_iterations=64, time_major=False)


rnn_states.h.get_shape()
# TensorShape([Dimension(None), Dimension(300)])

我无法确定尺寸为无x 300的原因。我原以为是256 x 300.提前致谢。

1 个答案:

答案 0 :(得分:1)

get_shape是最好的努力。通常,Tensorflow在图形构建时并不总是知道张量的大小。 None仅表示维度在构造时未知。

从Python中找到Tensor形状的唯一保证方法是运行图形(例如,通过session.run().eval())来评估Tensor到特定值,其形状可以检查。

(如果您想在图表中使用形状,还有tf.shape。)

希望有所帮助!