Tensorflow:tf.nn.dynamic_rnn():无法从动态时间主要的最后一个维度收集输出值
Tensorflow: tf.nn.dynamic_rnn() :Unable to gather output values from last dimension of dynamic time-major
我正在尝试使用 RNN 对新闻文章进行分类。由于新闻文章的长度不固定,我使用 tf.nn.dynamic_rnn().
# ....{Some Code Above}.....
with graph.as_default():
sentences = tf.placeholder(tf.float32, shape=(batch_size, None, emmbedding_dimension))
sequence_length = tf.placeholder(tf.float32, shape=batch_size)
labels = tf.placeholder(tf.float32, shape=(batch_size, 2))
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=lstm_size)
stacked_lstm = tf.nn.rnn_cell.DropoutWrapper(lstm_cell, output_keep_prob=1)
stacked_lstm = tf.nn.rnn_cell.MultiRNNCell([stacked_lstm] * no_of_lstm_layers)
outputs, states = tf.nn.dynamic_rnn(cell=stacked_lstm,
inputs=sentences,
sequence_length=sequence_length,
initial_state=stacked_lstm.zero_state(batch_size, tf.float32))
# ....{Some Code Below}.....
上面代码中 'outputs' 的张量形状是 (batch_size, ?, lstm_size).
我想收集句子末尾的输出,这是动态的。我为此使用以下命令
outputs = tf.transpose(outputs, [1, 0, 2])
last = tf.gather(outputs, int(outputs.get_shape()[0]) - 1)
我收到以下错误,
Traceback (most recent call last):
File "./rnn_fitness_level1_0.py", line 127, in <module>
last = tf.gather(outputs, int(outputs.get_shape()[0]) - 1)
TypeError: __int__ returned non-int (type NoneType)
我认为这个错误是因为 time_major(sentence_major).
输出的动态形状
换句话说,"outputs.get_shape()[0]"的结果是“?”(None)
当我们使用固定 time_major(句子长度)时,上述获取最后输出的技术有效。
有没有办法实现动态time_major(句子长度)?
截至目前,我正在执行以下操作
last = tf.reduce_mean(outputs, [0])
但我的理解是,通过对 time_major(句子长度)求平均值,我并没有利用 RNN 寻找顺序模式的潜力。 请告诉我您对此的看法。
一般来说,get_shape()
就是best-effort。在图形运行之前,Tensorflow 并不总是知道 Tensor 的形状。
您可以尝试多种方法。一种是自己计算 Python 中最后一个索引的偏移量,而不使用 get_shape;如果你知道输入的大小,这应该不难。
另一种选择是使用 Tensorflow 的切片功能,它支持 Numpy-style“-1”索引来表示最后一个元素。例如,如果 x
是 3D 张量,x[:, -1, :]
应该切出中间维度的最后一个元素。
有关更多文档,请参阅此处的 tf.Tensor.__getitem__
文档:
https://www.tensorflow.org/api_docs/python/framework/core_graph_data_structures#Tensor
希望对您有所帮助!
我正在尝试使用 RNN 对新闻文章进行分类。由于新闻文章的长度不固定,我使用 tf.nn.dynamic_rnn().
# ....{Some Code Above}.....
with graph.as_default():
sentences = tf.placeholder(tf.float32, shape=(batch_size, None, emmbedding_dimension))
sequence_length = tf.placeholder(tf.float32, shape=batch_size)
labels = tf.placeholder(tf.float32, shape=(batch_size, 2))
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=lstm_size)
stacked_lstm = tf.nn.rnn_cell.DropoutWrapper(lstm_cell, output_keep_prob=1)
stacked_lstm = tf.nn.rnn_cell.MultiRNNCell([stacked_lstm] * no_of_lstm_layers)
outputs, states = tf.nn.dynamic_rnn(cell=stacked_lstm,
inputs=sentences,
sequence_length=sequence_length,
initial_state=stacked_lstm.zero_state(batch_size, tf.float32))
# ....{Some Code Below}.....
上面代码中 'outputs' 的张量形状是 (batch_size, ?, lstm_size).
我想收集句子末尾的输出,这是动态的。我为此使用以下命令
outputs = tf.transpose(outputs, [1, 0, 2])
last = tf.gather(outputs, int(outputs.get_shape()[0]) - 1)
我收到以下错误,
Traceback (most recent call last):
File "./rnn_fitness_level1_0.py", line 127, in <module>
last = tf.gather(outputs, int(outputs.get_shape()[0]) - 1)
TypeError: __int__ returned non-int (type NoneType)
我认为这个错误是因为 time_major(sentence_major).
输出的动态形状换句话说,"outputs.get_shape()[0]"的结果是“?”(None)
当我们使用固定 time_major(句子长度)时,上述获取最后输出的技术有效。
有没有办法实现动态time_major(句子长度)?
截至目前,我正在执行以下操作
last = tf.reduce_mean(outputs, [0])
但我的理解是,通过对 time_major(句子长度)求平均值,我并没有利用 RNN 寻找顺序模式的潜力。 请告诉我您对此的看法。
一般来说,get_shape()
就是best-effort。在图形运行之前,Tensorflow 并不总是知道 Tensor 的形状。
您可以尝试多种方法。一种是自己计算 Python 中最后一个索引的偏移量,而不使用 get_shape;如果你知道输入的大小,这应该不难。
另一种选择是使用 Tensorflow 的切片功能,它支持 Numpy-style“-1”索引来表示最后一个元素。例如,如果 x
是 3D 张量,x[:, -1, :]
应该切出中间维度的最后一个元素。
有关更多文档,请参阅此处的 tf.Tensor.__getitem__
文档:
https://www.tensorflow.org/api_docs/python/framework/core_graph_data_structures#Tensor
希望对您有所帮助!