我正在尝试在张量流中实现基于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_context
和 train_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 回答
get_shape
是尽力而为 . 通常,Tensorflow在图形构建时并不总是知道张量的大小 .None
仅表示维度在构造时未知 .从Python中找到Tensor形状的唯一保证方法是运行图形(例如,通过
session.run()
或.eval()
)将Tensor评估为特定值,您可以检查其形状 .(如果要使用图形中的形状,也有
tf.shape
. )希望有所帮助!