Я строю модель LSTM, используя в качестве ввода word2vec.Я использую каркас тензорного потока.Я закончил вставку слова, но я застрял с LSTM.
Проблема здесь в том, что у меня разные длины предложений, что означает, что я должен либо выполнять заполнение, либо использовать dynamic_rnn с указанной длиной последовательности.Я борюсь с ними обоими.
Заполнение.Запутанная часть заполнения - это когда я делаю заполнение.Моя модель выглядит следующим образом:
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)
Я так борюсь с этой частью, чтобы любая помощь былаочень ценится.
Заранее спасибо.