我正在尝试在张量流中实现基于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)])
我无法确定尺寸为无x 300的原因。我原以为是256 x 300.提前致谢。
答案 0 :(得分:1)
get_shape
是最好的努力。通常,Tensorflow在图形构建时并不总是知道张量的大小。 None
仅表示维度在构造时未知。
从Python中找到Tensor形状的唯一保证方法是运行图形(例如,通过session.run()
或.eval()
)来评估Tensor到特定值,其形状可以检查。
(如果您想在图表中使用形状,还有tf.shape
。)
希望有所帮助!