Заполнение LSTMCell целыми предложениями с использованием вложений дает ошибку размерности - PullRequest
0 голосов
/ 05 января 2019

Так что в настоящее время я сижу на проблеме классификации текста, но я даже не могу настроить свою модель в Tensorflow. У меня есть пакет предложений длиной 70 (с использованием заполнения), и я использую embedding_lookup с размером вложения 300. Вот код для встраивания:

embedding = tf.constant(embedding_matrix, name="embedding")
inputs = tf.nn.embedding_lookup(embedding, input_.input_data)

Так что теперь входные данные должны иметь форму [batch_size, предложение_длина, встраивание_размер] , что неудивительно. Теперь, к сожалению, я получаю ValueError для моего LSTMCell, так как он ожидает ndim = 2 и, очевидно, входные данные имеют ndim = 3. Я не нашел способ изменить ожидаемую форму ввода слоя LSTM. Вот код для моей инициализации LSTMCell:

for i in range(num_layers):
    cells.append(LSTMCell(num_units, forget_bias, state_is_tuple, reuse=reuse, name='lstm_{}'.format(i))
cell = tf.contrib.rnn.MultiRNNCell(cells, state_is_tuple=True)

Ошибка вызывается в функции вызова ячейки, которая выглядит следующим образом:

for step in range(self.num_steps):
    if step > 0: tf.get_variable_scope().reuse_variables()
    (cell_output, state) = cell(inputs[:, step, :], state)

Аналогичный вопрос, но не помогает: Понимание формы ввода LSTM Tensorflow

1 Ответ

0 голосов
/ 06 января 2019

Я мог бы решить проблему сам. Как представляется, реализация LSTMCell более практична и базова в отношении того, как на самом деле работает LSTM. Слои Keras LSTM позаботились о том, что мне нужно учитывать, когда я использую TensorFlow. Пример, который я использую, взят из следующего официального примера TensorFlow:

https://github.com/tensorflow/models/tree/master/tutorials/rnn/ptb

Поскольку мы хотим снабдить наши слои LSTM последовательностью, нам нужно кормить ячейки каждое слово за другим. Поскольку вызов ячейки создает два выхода (выход ячейки и состояние ячейки), мы используем цикл для всех слов во всех предложениях, чтобы заполнить ячейку и повторно использовать наши состояния ячейки. Таким образом, мы создаем вывод для наших слоев, который мы затем можем использовать для дальнейших операций. Код для этого выглядит следующим образом:

self._initial_state = cell.zero_state(config.batch_size, data_type())
state = self._initial_state
outputs = []
with tf.variable_scope("RNN"):
  for time_step in range(self.num_steps):
    if time_step > 0: tf.get_variable_scope().reuse_variables()
    (cell_output, state) = cell(inputs[:, time_step, :], state)
    outputs.append(cell_output)
output = tf.reshape(tf.concat(outputs, 1), [-1, config.hidden_size])

num_steps представляет количество слов в нашем предложении, которое мы собираемся использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...