Переменная длина предложения для LSTM с использованием word2vec в качестве входных данных в tenorflow - PullRequest
0 голосов
/ 27 сентября 2018

Я строю модель LSTM, используя в качестве ввода word2vec.Я использую каркас тензорного потока.Я закончил вставку слова, но я застрял с LSTM.

Проблема здесь в том, что у меня разные длины предложений, что означает, что я должен либо выполнять заполнение, либо использовать dynamic_rnn с указанной длиной последовательности.Я борюсь с ними обоими.

  1. Заполнение.Запутанная часть заполнения - это когда я делаю заполнение.Моя модель выглядит следующим образом:

    word_matrix = model.wv.syn0
    X = tf.placeholder (tf.int32, shape)
    data = tf.placeholder (tf.float32, shape)
    data = tf.nn.embedding_lookup (word_matrix, X)

Затем я передаю последовательности индексов слов для word_matrix в X. Я беспокоюсь, что если я добавлю нули к последовательностямв X, тогда я неправильно продолжил бы вводить ненужный ввод (word_matrix [0] в данном случае).

Итак, мне интересно, каков правильный способ заполнения 0.Было бы здорово, если бы вы дали мне знать, как реализовать его с помощью tenorflow.

dynamic_rnn Для этого я объявил список, содержащий все длины предложений, и передал их вместе с X и y в конце.В этом случае я не могу подать входные данные как пакетные, хотя.Затем я столкнулся с этой ошибкой (ValueError: as_list () не определен для неизвестного TensorShape.), Который мне кажется, что аргумент sequence_length принимает только список?(Мои мысли могут быть совершенно неправильными).

Вот мой код для этого.

X = tf.placeholder(tf.int32)
labels = tf.placeholder(tf.int32, [None, numClasses])
length = tf.placeholder(tf.int32)

data = tf.placeholder(tf.float32, [None, None, numDimensions])
data = tf.nn.embedding_lookup(word_matrix, X)

lstmCell = tf.contrib.rnn.BasicLSTMCell(lstmUnits, state_is_tuple=True)
lstmCell = tf.contrib.rnn.DropoutWrapper(cell=lstmCell, output_keep_prob=0.25)
initial_state=lstmCell.zero_state(batchSize, tf.float32)
value, _ = tf.nn.dynamic_rnn(lstmCell, data, sequence_length=length,
                             initial_state=initial_state, dtype=tf.float32)

Я так борюсь с этой частью, чтобы любая помощь былаочень ценится.

Заранее спасибо.

1 Ответ

0 голосов
/ 27 сентября 2018

Tensorflow не поддерживает Tensor переменной длины.Поэтому, когда вы объявляете Tensor, массив list / numpy должен иметь одинаковую форму.

  1. Из вашей первой части я понимаю, что вы уже смогли заполнить нули впоследние шаги шага длины последовательности.Какова должна быть идеальная ситуация.Вот как это должно выглядеть для размера партии 4, max длина последовательности 10 и 50 скрытых единиц ->

    [4,10,50] будет размером всей вашей партии, но внутри,он может иметь такую ​​форму, когда вы пытаетесь визуализировать отступы ->

    `[[5+5pad,50],[10,50],[8+2pad,50],[9+1pad,50]`
    

    Каждый пад будет представлять собой последовательность длиной 1 со скрытым состоянием размером 50 Тензор.Все заполнено только нулями.Посмотрите на этот вопрос и этот , чтобы узнать больше о том, как дополнять вручную.

  2. Вы будете использовать динамический rnn по той самой причине, чтоВы не хотите вычислять это на последовательностях заполнения. tf.nn.dynamic_rnn api гарантирует, что, передав аргумент sequence_length.

    Для приведенного выше примера этот аргумент будет: [5,10,8,9] для приведенного выше примера.Вы можете вычислить его, суммируя ненулевые объекты для каждого компонента пакета.Простой способ вычислить это:

    data_mask = tf.cast(data, tf.bool)
    data_len = tf.reduce_sum(tf.cast(data_mask, tf.int32), axis=1)
    

    и передать его в tf.nn.dynamic_rnn API:

    tf.nn.dynamic_rnn(lstmCell, data, sequence_length=data_len, initial_state=initial_state)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...