Я следую this tutorial, чтобы понять CNN в НЛП. Есть несколько вещей, которые я не понимаю, несмотря на то, что код передо мной. Надеюсь, кто-то может прояснить ситуацию.Попытка понять CNN для учебника NLP с использованием Tensorflow
Первая довольно незначительная вещь является sequence_length
параметр TextCNN
объекта. В примере на github это всего лишь 56
, который, я думаю, является максимальной длиной всех предложений в данных обучения. Это означает, что self.input_x
является 56-мерным вектором, который будет содержать только индексы из словаря предложения для каждого слова.
Этот список перейдет в tf.nn.embedding_lookup(W, self.intput_x)
, который вернет матрицу, состоящую из слов вставки этих слов, заданных self.input_x
. Согласно this answer эта операция похожа на использование индексации с NumPy:
matrix = np.random.random([1024, 64])
ids = np.array([0, 5, 17, 33])
print matrix[ids]
Но проблема в том, что self.input_x
большую часть времени выглядит [1 3 44 25 64 0 0 0 0 0 0 0 .. 0 0]
. Правильно ли, если я предполагаю, что tf.nn.embedding_lookup
игнорирует значение 0?
Другое дело, я не понимаю, как tf.nn.embedding_lookup
работает здесь:
# Embedding layer
with tf.device('/cpu:0'), tf.name_scope("embedding"):
W = tf.Variable(
tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),
name="W")
self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)
Я полагаю, TAHT self.embedded_chars
является матрицей, которая является фактическим входа на CNN, где каждая строка представляет собой слово вложение один слово. Но как может tf.nn.embedding_lookup
узнать об этих показателях, указанных self.input_x
?
Последняя вещь, которую я не понимаю, здесь
W
наша матрица вложение, что мы учимся в процессе обучения. Мы инициализируем его, используя случайное равномерное распределение.tf.nn.embedding_lookup
создает фактическую операцию вложения. Результатом операции вложения является трехмерный тензор формы[None, sequence_length, embedding_size]
.
Означает ли это, что мы на самом деле обучения слово вложения здесь? В начале учебного пособия указано:
Мы не будем использовать предварительно подготовленные векторы word2vec для наших словесных вложений. Вместо этого мы изучаем вложения с нуля.
Но я не вижу строки кода, где это происходит на самом деле. code of the embedding layer не выглядит так, как будто есть что-то подготовленное или узнанное - так, где это происходит?
Спасибо! Также для ссылки - я собираюсь изучить это как можно скорее :) – displayname