首页 文章

难以解释tensorflow的dynamic_rnn的输出

提问于
浏览
0

我正在尝试在张量流中实现基于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)])

我无法确定为什么尺寸是None x 300.我原以为它是256 x 300.在此先感谢 .

1 回答

  • 1

    get_shape 是尽力而为 . 通常,Tensorflow在图形构建时并不总是知道张量的大小 . None 仅表示维度在构造时未知 .

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

    (如果要使用图形中的形状,也有 tf.shape . )

    希望有所帮助!

相关问题