2017-01-27 3 views
0

Я пытаюсь классифицировать новостные статьи с помощью RNN. Поскольку длина новостных статей не фиксирована, я использую tf.nn.dynamic_rnn().Tensorflow: 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}..... 

Тензора форма 'выходы' из приведенного выше кода (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 нахождения последовательного шаблон. Пожалуйста, дайте мне знать ваш взгляд на то же самое.

ответ

1

В целом, get_shape() является наилучшим усилием. Tensorflow не всегда знает форму тензора до начала графика.

Есть несколько вещей, которые вы могли бы попробовать. Один из них заключается в вычислении смещения последнего индекса самостоятельно в Python без использования get_shape; если вы знаете размеры входов, это не составит труда.

Другим вариантом будет использование функции среза Tensorflow, которая поддерживает индекс «-1» в стиле Numpy для представления последнего элемента. Например, если x является 3D-тензором, x[:, -1, :] должен вырезать последний элемент среднего измерения.

Для получения дополнительной документации см tf.Tensor.__getitem__ документации здесь: https://www.tensorflow.org/api_docs/python/framework/core_graph_data_structures#Tensor

Надежда, что помогает!